Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PIC16F887 problem sa funkcijama

[es] :: Elektronika :: Mikrokontroleri :: PIC16F887 problem sa funkcijama

Strane: 1 2 3

[ Pregleda: 6600 | Odgovora: 40 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 17:58 - pre 135 meseci
Citat:
goran_68:
Flash self-write imaju i 8-bitni PIC. Ja sam pokušao da nađem prvi jeftiniji 16-bitni PIC koji bi zamenio u svemu ovaj njegov 887. No, da ne nastavljamo nešto što je već rađeno. Eno šeme i koda predloži mu mikrokontroler ali da ne bude za hobi i učenje varijantu.


Svako je od nas pretpostavljam punoljetan i zna sta hoce tako da ja nista konkretno ne predlazem, predlazem da razmisli da li postoji bolji/jeftiniji mc za ono sto razvija odnosno i ako je mc skuplji da potrosi manje vremena na razvoj i izradu projekta.

 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 18:04 - pre 135 meseci
Evo ti i stanje svih registara u picu kad program ceka u while u funkciji temperatura ako ti nesto pomogne

Code:

    Address          Name           Hex          Decimal         Binary          Char     
01F            ADCON0         0x00           0              00000000       '.'            
09F            ADCON1         0x00           0              00000000       '.'            
01E            ADRESH         0x00           0              00000000       '.'            
09E            ADRESL         0x00           0              00000000       '.'            
188            ANSEL          0x00           0              00000000       '.'            
189            ANSELH         0x00           0              00000000       '.'            
187            BAUDCTL        0x40           64             01000000       '@'            
017            CCP1CON        0x0C           12             00001100       '.'            
01D            CCP2CON        0x00           0              00000000       '.'            
016            CCPR1H         0x00           0              00000000       '.'            
015            CCPR1L         0x00           0              00000000       '.'            
01C            CCPR2H         0x00           0              00000000       '.'            
01B            CCPR2L         0x00           0              00000000       '.'            
107            CM1CON0        0x00           0              00000000       '.'            
108            CM2CON0        0x00           0              00000000       '.'            
109            CM2CON1        0x02           2              00000010       '.'            
09C            ECCPAS         0x00           0              00000000       '.'            
10D            EEADR          0x00           0              00000000       '.'            
10F            EEADRH         0x00           0              00000000       '.'            
18C            EECON1         0x00           0              00000000       '.'            
18D            EECON2         0x00           0              00000000       '.'            
10C            EEDATA         0x00           0              00000000       '.'            
10E            EEDATH         0x00           0              00000000       '.'            
004            FSR            0x04           4              00000100       '.'            
000            INDF           0x00           0              00000000       '.'            
00B            INTCON         0xC4           196            11000100       'Ä'            
096            IOCB           0x00           0              00000000       '.'            
081            OPTION_REG     0x00           0              00000000       '.'            
08F            OSCCON         0x60           96             01100000       '`'            
090            OSCTUNE        0x00           0              00000000       '.'            
002            PCL            0x01           1              00000001       '.'            
00A            PCLATH         0x0D           13             00001101       '.'            
08E            PCON           0x10           16             00010000       '.'            
08C            PIE1           0x30           48             00110000       '0'            
08D            PIE2           0x00           0              00000000       '.'            
00C            PIR1           0x02           2              00000010       '.'            
00D            PIR2           0x00           0              00000000       '.'            
005            PORTA          0x00           0              00000000       '.'            
006            PORTB          0xFF           255            11111111       'ÿ'            
007            PORTC          0x00           0              00000000       '.'            
008            PORTD          0x00           0              00000000       '.'            
009            PORTE          0x00           0              00000000       '.'            
092            PR2            0x4B           75             01001011       'K'            
09D            PSTRCON        0x01           1              00000001       '.'            
09B            PWM1CON        0x00           0              00000000       '.'            
01A            RCREG          0x00           0              00000000       '.'            
018            RCSTA          0x90           144            10010000       ''            
099            SPBRG          0x0F           15             00001111       '.'            
09A            SPBRGH         0x00           0              00000000       '.'            
185            SRCON          0x00           0              00000000       '.'            
093            SSPADD         0x00           0              00000000       '.'            
013            SSPBUF         0x00           0              00000000       '.'            
014            SSPCON         0x00           0              00000000       '.'            
091            SSPCON2        0x00           0              00000000       '.'            
               SSPMSK         0xFF           255            11111111       'ÿ'            
094            SSPSTAT        0x00           0              00000000       '.'            
003            STATUS         0x38           56             00111000       '8'            
010            T1CON          0x00           0              00000000       '.'            
012            T2CON          0x1E           30             00011110       '.'            
001            TMR0           0xF8           248            11111000       'ø'            
00F            TMR1H          0x00           0              00000000       '.'            
00E            TMR1L          0x00           0              00000000       '.'            
011            TMR2           0x41           65             01000001       'A'            
085            TRISA          0x00           0              00000000       '.'            
086            TRISB          0x00           0              00000000       '.'            
087            TRISC          0xFB           251            11111011       'û'            
088            TRISD          0xFF           255            11111111       'ÿ'            
089            TRISE          0x0F           15             00001111       '.'            
019            TXREG          0x00           0              00000000       '.'            
098            TXSTA          0x00           0              00000000       '.'            
097            VRCON          0x00           0              00000000       '.'            
105            WDTCON         0x08           8              00001000       '.'            
095            WPUB           0xFF           255            11111111       'ÿ'            
               WREG           0x01           1              00000001       '.'            
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 18:30 - pre 135 meseci
Čeka u:
Code:

while(temp>=tabela) i++;



Verovatno je eksperimentisao pa zaboravio da treba da bude:

Code:

while(temp>=tabela[i]) i++;


gorankg
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 18:32 - pre 135 meseci
Kad stavim da funkciju temperatura ne poziva onda ti ispisuje na uart "5" (broj pet) non stop. Vidim da ti temperatura nije doradjena jer ti je tabela varijabla 0 i zato staje u while petlji u funkciji temperatura.
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 18:40 - pre 135 meseci
Kad mu prepravim kod gorane kako si stavio while(temp>=tabela) i++; onda kompajler pocne da se buni kod ovih iskaza
razlika=tabela; razlika=razlika-tabela; ima ih jos jer su neki u int a neki u char pa kompajler prijavljuje gresku. Recimo i ovo temp>tabela
jedno mu je char a drugo int , ima on tu jos dosta da radi na kodu:)




[Ovu poruku je menjao grabik dana 24.02.2013. u 20:37 GMT+1]
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 23:05 - pre 135 meseci
Pozdrav, nije me bilo malo...Procitao sam vasa misljenja vezano za ovaj pic, svakako planiram preci na neki drugi, ali za to cu postaviti novu temu.
Sto se tice funkcije za temperaturu, tu postoji greska kao sto ste primetili, zapravo zakomentarisan je niz tabela, kada se odkomentarise, onda je sve ok.
U interapt funkciji je stojao delay i to je pravilo problem, to sam sada obrisao. Za sada koristim njihovu funkciju za uart i to mi radi. Sto se tice rezolucije PWM-a imao sam upozorenja o prebacivanju float u integer ali sam ignorisao. Ovaj kod sam i prakticno isprobao i "recimo da radi"(objasnicu sta ovo znaci)
Usput da kazem, podesio sam konfiguracione bitove i to je sada reseno
Evo kod sa kojim zapocinjem dalje programiranje:
Code:

#include "htc.h"
#include "delay.h"
#include "usart.h"
#include "math.h"

__CONFIG
(EXTIO & HS & WDTDIS & PWRTDIS & LVPDIS & FCMEN & IESOEN & BORDIS & UNPROTECT & DUNPROTECT & MCLREN);
__CONFIG
(DEBUGDIS & BORV21);

#ifndef _XTAL_FREQ
 #define _XTAL_FREQ 10000000
#endif

unsigned char prijem;
unsigned char podatak[5];
unsigned char i=0,j=0;;
bit flag,flag2;
unsigned int fre;
unsigned char procenat;

void PWM1_Init(unsigned int PWM_frekvencija_Hz,unsigned char Frekvencija_oscilatora_MHz){
     unsigned int fre;
     unsigned char osc;
     unsigned char perioda;
     unsigned int obrada;
     unsigned int ispuna;
     osc=Frekvencija_oscilatora_MHz;
     fre=PWM_frekvencija_Hz;
     if(fre<620) fre=620;
     if(fre>4800) fre=4800;
     T2CON=0b00011010; //pres 16, pos 4
     perioda=(osc*3906/(fre));  //perioda PWM signala
     perioda=(perioda*4)-1;
     PR2=perioda;
     TMR2=0;
     //GIE_bit=1;
     //PEIE_bit=1;
     //TMR2IE_bit=1;
     TMR2IF=0;
     CCP1CON=0x0C;   //PWM mod, ne invertovan
     ispuna=0;       //inicijalno ugasen PWM
     obrada=ispuna;       //popunjavanje registara
     ispuna=ispuna&0x03;
     ispuna=ispuna<<4;
     CCP1CON=0x0C|ispuna;
     CCPR1L=obrada>>2;
     TRISC2=0;
     RC2=0;
     TMR2ON=1;
}
unsigned int prva,druga,treca;
void PWM1_Set_Parameters(unsigned int Frekvencija_Hz,unsigned char Procenat_ispune,unsigned char Frekvencija_oscilatora_MHz){
     unsigned int fre;
     unsigned char osc;
     unsigned int perioda;
     unsigned int rezolucija;
     unsigned char osnova;
     unsigned char dodavanje;
     unsigned int ispuna_max;
     unsigned int ispuna;
     unsigned int max;
     unsigned int obrada;
     unsigned char procenat;
     osc=Frekvencija_oscilatora_MHz;
     fre=Frekvencija_Hz;
     if(fre<620) fre=620;
     if(fre>4800) fre=4800;
     procenat=Procenat_ispune;
     perioda=(osc*3906/(fre));
     perioda=(perioda*4)-1;
     PR2=perioda;
     rezolucija=(log10(4*(perioda+1))/0.3)*10;
     osnova=rezolucija/10;
     dodavanje=rezolucija%10;
     switch (osnova){
            case 6: ispuna_max=64; break;
            case 7: ispuna_max=128; break;
            case 8: ispuna_max=256; break;
            case 9: ispuna_max=512; break;
     }

     switch (dodavanje){
            case 1: max=ispuna_max*1.07177; break;
            case 2: max=ispuna_max*1.14869; break;
            case 3: max=ispuna_max*1.23144; break;
            case 4: max=ispuna_max*1.31951; break;
            case 5: max=ispuna_max*1.41421; break;
            case 6: max=ispuna_max*1.51571; break;
            case 7: max=ispuna_max*1.62450; break;
            case 8: max=ispuna_max*1.74110; break;
            case 9: max=ispuna_max*1.86607; break;
     }
     ispuna=procenat*max/100;
     obrada=ispuna;
     ispuna=ispuna&0x03;
     ispuna=ispuna<<4;
     CCP1CON=0x0C|ispuna;
     CCPR1L=obrada>>2;
}

void Ispis_na_displej(unsigned char podatak){
     unsigned char obrada,jedinica,desetica;
     obrada=podatak;
     jedinica=obrada%10;
     desetica=obrada/10;
     PORTD=jedinica<<2;
     RD1=1;
     __delay_ms(10);
     RD1=0;
     PORTD=desetica<<2;
     RD0=1;
     __delay_ms(10);
     RD0=0;
}

static void interrupt
zile(void)
{
    if(RCIF)
     {
        prijem=getch();    
        podatak[i]=prijem;
        flag2=1;
        i++;
        if(i==5){flag=1; i=0;}         
     }
}

void main(void){
    OPTION=0;
    INTCON=0;
    GIE=1;
    PEIE=1;
    RCIE=1;
    ANSEL=0;
    ANSELH=0;
    TRISA=0;
    TRISB=0;
    PORTA=0;
    PORTB=0;
    TRISD=0;
    PORTD=0;
    i=0;
    flag=0;
    flag2=0;
    Ispis_na_displej(0);
    fre=2000;
    procenat=60;
    PWM1_Init(1000,10);
    __delay_ms(1000);
    PWM1_Set_Parameters(1000,procenat,10);
    __delay_ms(100);
    init_comms();
    __delay_ms(100);

    while(1){
    
        if(flag2)
        {
            flag2=0;
            Ispis_na_displej(prijem);
        }
        
        if(flag){
            flag=0;
            fre=(podatak[0]*1000)+(podatak[1]*100)+(podatak[2]*10)+podatak[3];
            procenat=podatak[4];
            Ispis_na_displej(procenat);
            PWM1_Set_Parameters(fre,procenat,10);
        }
        

    }
}


Kada se rekao recimo da radi, mislio sam sledece: isprogramiram elektroniku sa ovim kodom povezem se sa PC na preko ft232rl i ono radi. Na pc imam aplikaciju radjenu u Labview, u kojoj imam neke grafike i td. Drugi put kad isprogramiram, povezem elektroniku, kad ona totalno ne reaguje na komunikaciju sa PC-jem. E sad Labview mi nesto zapucava, prijavi mi gresku u sred rada i tako dalje, tako da vise sumnjam na njega nego na ovaj kod...
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama24.02.2013. u 23:07 - pre 135 meseci
Probacu da izbacim math.h i log10 da racunam nekako drugacije, jer math.h i log10 mi zauzimaju oko 20% memorije:) Kada zavrsim testiranje ovog koda i uvidim da li je problem u labview ili pak u kodu, onda cu dodavati i2c za komunaciju sa memorijom.
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 07:42 - pre 135 meseci
Ne znam šta tačno radiš sa ovim ali mi se čini da imaš neku suvišnu matematiku. Npr. zašto podešavanje za duty u CCPRxL : CCPxCON<5:4> ne radiš po formuli:

Duty Cycle Ratio = (CCPRxL : CCPxCON<5:4>) / (4 * (PRx + 1))

a PR2 već imaš izračunato.
gorankg
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 08:07 - pre 135 meseci
Ove funkcije sto koristis ne postoje u htc tako da to ne moze da se isproba. Prije si slao na uart sada primas?

Ne bih da solim nikome pamet ali regulacija temperature se ne radi tako.
Nadji kod za PID , imas za atmelove avr napisan u C-u na netu ,jeste da ce pojesti 20-25% memorije ovog pica ali kad namjestis PID parametre kako treba to radi kako treba.

Za regulaciju temperature ti ni onda ne treba PWM vec mu das recimo 15 sekundi intervale ili cak i vece da ukljucuje kao spori PWM.
PID izracuna popunu i toliko okidas rele i ssr ili sta vec. Ako je 100% onda prakticno i ne gasi izlaz a kad je recimo 1% on drzi ukljuceno samo 100-ti dio od tih 15 sekundi. Mozes vrlo precizno regulisati temperaturu ako dobro namjestis P I D koeficijente koje tako napravis da ih mozes snimiti u eeprom. Pocinjes povecavati P dok ne pocne oscilovati onda ga smanjis da ne osciluje onda povecavas I dok ne dobijes sto tocniju temperaturu i onda jos stavis malo D da povecas brzinu promjene izlaza, onda jos mozess malo da povecas P.

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 08:38 - pre 135 meseci
Citat:
goran_68:ali da ne bude za hobi i učenje varijantu.


Kada nije za hobi sve ima vrlo drugaciju racunicu! Ali tada ne pricamo vise o free limitiranim verzijama kompajlera vec pricamo o XC kompajlerima za pare (500+eur) ili hitech kompajleru za pare ili CCS-u ili sta se vec odabere, mislim da i IAR ima nesto svoje za picove .. to naravno ako smo izracunali da nam je pic resenje (posto se postavlja pitanje da li je ili nije, kada su osmobitni mcu u pitanju za velike serije motorolu je bas tesko pre*bat kada su u pitanju cena, profesionalizam, kvalitet, dobavljivost, alati ...), no kada nije za hobi vecina nas ovde na forumu ne mozemo da damo dovoljno tacnu informaciju posto ignorisemo veliki broj stvari vezanih za "ne-hobi" upotrebu
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 08:51 - pre 135 meseci
PWM1_Init ti je povelik i prilicno tezak komapjleru za optimizaciju uz mnogo bespotrebne matematike ... imas 2-3 frekvencije na kojima ce ti trcati mcu, imas 1-2 frekvencije pwm-a koje ti trebaju za projekat, napravi nekoliko #ifdef segmenata sa razlicitom inicijalizacijom PWM-a i sa #define na pocetku biraj kako ces da inicijalizujes pwm umesto da imas kompleksnu funkciju koju ces onda da zoves sa staticnim parametrima ... ustedeces mnogo flash-a, kod ce biti jasniji, izbenuces greske

PWM1_Set_Parameters je ista prica, ti ovde menjas realy duty cycle, sve ostalo je visak, ono sto treba da uradis je da kroz neki define imas min/max vrednost za registar za dc i to je to .. eventualno neko preracunavanje 0-255 u min-max ili tako nesto .. sve ovo ostalo je visak


finalno, PWM1_Set_Parameters(Frekvencija_Hz :) :)
dogovori se sa sobom na kom jeziku pises, kada mesas 2 jezika usporavas razvoj i povecavas mogucnost gresaka ... (dal bese procenat ili percent, pa se vracas kroz kod da vidis sta si pisao ..)

 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 09:03 - pre 135 meseci
Duty izgleda podešavaš preko nekog od onih potenciometara. Tu vrednost od recimo 0-255 treba da prebaciš na 0-100%. Probaj sa ovim, ništa float samo char :)


Code:

unsigned char ConvertPot(unsigned char data)
{
unsigned char retval = 0;
unsigned char ctmp = 0;

    if(data <= 2)
        data = 0;
    else
    {
        if(data >= 252)
            data = 250;
        else
            data -= 2;
    }    

    while(data > ctmp)
    {
        ctmp += 3;
        ++retval;
        if(data > ctmp)
        {
            ctmp += 2;
            ++retval;
        }
    }

    return(retval);
}


Treba da radi ali proveri!! Posle toga treba da ide:


Code:

void SetDCPWM1(unsigned char dc)
{
unsigned int itmp;

    itmp = (dc * (PR1 + 1)) / 25;
    CCPR1L = (unsigned char)(itmp >> 2);                
    CCP1CON = (CCP1CON & 0xCF) | ((unsigned char)(itmp << 4) & 0x30);

}

Jbg. bez matematike ne može ali gledaj da radiš samo neophodno. I proveri molim te možda ima grešaka!

[Ovu poruku je menjao goran_68 dana 25.02.2013. u 13:17 GMT+1]
gorankg
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 12:33 - pre 134 meseci
Izvinjavam se sto nisam radnije rekao, pa je doslo do zabune, ne radi se o regulaciji temperature, ona se samo meri i uslovljava rad. Inace ovo radim na zahtev, a program sluzi za eksperimentisanje sa regulacijom struje DC motora (ni meni nije najjasnije :) ). Ove kodove sto kacim nisu konacne, vec testiram delove, pa tako ovde podesavam duty preko serisjke, a kasnije ce to raditi PI regulator. Takodje treba da bude dozvoljeno i da se frekvencija tokom rada menja, pa je zbog toga cela ova funkcija i nastala (naglasavam da sam radio u mikroC-u gde je frekvencija morala biti sonst i u inicijalizaciji definisana) Deo koda za popunjavanje registara duty-ja mislim da nije komplikovan
Code:

     ispuna=procenat*max/100;
     obrada=ispuna;
     ispuna=ispuna&0x03;
     ispuna=ispuna<<4;
     CCP1CON=0x0C|ispuna;
     CCPR1L=obrada>>2;

Cilj mi je da izbacim log10 iz racuna rezolucije, i tako izbacim i math.h, time cu ustedeti mnogo na memoriji. Mislim da ako to uradim da kompletan PWM nece biti mnogo zahtevan, takodje ako izbacim lokalne na globalne promenljive smanjicu i velicinu funkcija (samo da potvrdim sa vama, sve lokalne promenljive prilikom poziva funkcije se cuvaju na steku, jel?)
Danas cu proveriti da li je sve u redu sa serijskom, pa onda prelazim na komunikaciju sa memorijom i i2c...
Hvala na svim savetima i pomoci
 
Odgovor na temu

grabik

Član broj: 32507
Poruke: 311
*.adsl.net.t-com.hr.



+7 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 14:18 - pre 134 meseci
Da li ovo radis da dozira kolicinu krutog goriva u gorionik. Ja sam prije pravio i napravio ali za pozicioniranje i strujna regulacija, preko linuxcnc-a i paralelnog porta, na ovom na linku snimku nisu najbolje podeseni P I D parametri, inace ovaj je sa dspic.
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 22:02 - pre 134 meseci
Ne radim ja to, samo radim elektroniku za kolegu, kao pomoc... Naisla su mi sledeca 2 problema i nadam se da su poslednja :), Konkretno I2C mi ne radi kako valja, a AD konverzija mi ne funkcionise. Za oboje koristim gotove funkcije. I2C mi je potreban za komunikacijom sa epromom, u mikroC sam to odradio i sve je ok, sad kada sam to prebacio u MPLAb nesto mi brljavi, kada upisem 0x36, prilikom iscitavanja dobije 63, kada upisem 0x05, iscitam broj 5, kada upisem 0x03, iscitam 90 i tako dalje, sve u svemu nesto me zeza. Za ad konveriju u simulaciji dobojama gresku da je ad konverzija pocela pre nego sto se prosla zavrsila (u grubom prevodu) "ADC conversion started before "wait" time has expired following previous conversion or channel change" . Da li pretpostavljate gde bi mogla biti greska. Evo i kod za oba:

Funkcije za AD:
Code:

void init_a2d(void){
    ADCON0=0;    
    ADCON1=0;
    ADCS0=0;
    ADCS1=1;    
    ADON=1;        
}

unsigned char read_a2d(unsigned char channel){
    channel&=0x07;    
    ADCON0&=0xC5;    
    ADCON0|=(channel<<3);
    ADCS0=0;
    ADCS1=1;
    GODONE=1;    
    while(GODONE)
    return(ADRESH);
}
void main(void){
    OPTION=0;
    INTCON=0;
    ANSEL=255;
    ANSELH=0;
    TRISA=255;
    TRISB=0;
    PORTA=0;
    PORTB=0;
    TRISD=0;
    PORTD=0;
    init_a2d();
    __delay_ms(100);
    ad_faktor=read_a2d(6); //ocitavanje ad sa RA5
    while(1){
        }
}


Kod za I2C:
Code:

#include "delay.h"
#include "i2c.h"
#include "htc.h"

//potrebno za funkciju delay
#ifndef _XTAL_FREQ
 #define _XTAL_FREQ 10000000
#endif
//=============================

__CONFIG
(EXTIO & HS & WDTDIS & PWRTDIS & LVPDIS & FCMEN & IESOEN & BOREN & UNPROTECT & DUNPROTECT & MCLREN);
__CONFIG
(DEBUGDIS & BORV40);

unsigned char i,podatak;

void Init_PORT(void)
{
    ANSEL=0;    //PORTA digitalni
    ANSELH=0;    //PORTB i PORTE digitalni
    TRISA=0;     //svi portovi izlazni
    TRISB=0;
    TRISC=0;
    TRISD=0;
    TRISE=0;
    PORTA=0;    //pocetno stanje 0
    PORTB=0;
    PORTC=0;
    PORTD=0;
    PORTE=0;
}

void BLINK(unsigned char koliko_puta)
{
    unsigned char broj,i,j;
    broj=koliko_puta+2;
    for(i=broj;i>0;i--)
        {
            RB7=~RB7;
            for(j=4;j>0;j--) __delay_ms(250);
        }
}    

void Ispis_na_displej(unsigned char podatak){
     unsigned char obrada,jedinica,desetica;
     obrada=podatak;
     jedinica=obrada%10;
     desetica=obrada/10;
     RD2=jedinica;
     RD3=jedinica>>1;
     RD4=jedinica>>2;
     RD5=jedinica>>3;
     RD1=1;
     __delay_ms(10);
     RD1=0;
     RD2=desetica;
     RD3=desetica>>1;
     RD4=desetica>>2;
     RD5=desetica>>3;
     RD0=1;
     __delay_ms(10);
     RD0=0;
}

void main(void)
{
    OPTION=0;
    INTCON=0;
    Init_PORT();
    BLINK(5);
    RB7=1;

    Ispis_na_displej(43);
    for(i=8;i>0;i--) __delay_ms(250);    

    i2c_Start();
    i2c_PutByte(0xA0);
    i2c_PutByte(0x00);
    i2c_PutByte(0x01);
    i2c_PutByte(0x44);
    //i2c_Stop();

    for(i=4;i>0;i--) __delay_ms(250);

    //i2c_Start();
    i2c_PutByte(0xA0);
    i2c_PutByte(0x00);
    i2c_PutByte(0x01);
    //i2c_Restart();
    i2c_PutByte(0xA1);
    podatak=i2c_GetByte(0);
    //i2c_Stop();

    for(i=8;i>0;i--) __delay_ms(250);
    Ispis_na_displej(podatak);

    while(1)
        {
        }
}

 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 23:15 - pre 134 meseci
Na kojoj ti frekvenciji oscilatora radi PIC? Pogledaj tabelu 9.1 na starni 103. Možda tu nađeš odgovor za AD konverziju. Drugo, ne vidim kako si ovim odabrao AN4 za ulaz u AD konvertor:

ad_faktor=read_a2d(6); //ocitavanje ad sa RA5
gorankg
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama25.02.2013. u 23:39 - pre 134 meseci
Resio sam taj problem oko AD... Problem je bio sto sam ukljucivao samplovanje odmah nakon selektovanja analognog ulaza sto mi je u sustini i napomenuo simulator na kraju "ADC conversion started before "wait" time has expired following previous conversion or channel change". Tu sam dodao jedan delay od 10 ms i sada dobro radi. Njihova funkcija za selektovanje kanala mi nije bas najjasnija, ali nema veze resio sam tako sto sam direktno upisivao bitove. Testirao sam tako sto sam menjao faktor ispune PWM-a. Evo delovi koda koji to pokazuju

Code:

unsigned char read_a2d(unsigned char channel){
    /*channel&=0x07;    
    ADCON0&=0xC5;    
    ADCON0|=(channel<<3);*/
    CHS0=1;
    CHS1=0;
    CHS2=1;
    CHS3=0;
    __delay_ms(10);
    ADCS0=0;
    ADCS1=1;
    GODONE=1;    
    while(GODONE)continue;
    GODONE=0;
    return(ADRESH);
}

//promena faktora ispune
         ad_faktor=read_a2d(5); //nisam brisao parametar u funkciji, ali ni ne igra ulogu    
        procenat=ad_faktor*100/256;
        Ispis_na_displej(procenat);
        __delay_ms(100);
        PWM1_Set_Parameters(1000,procenat,10);


Jos mi I2C brljavi, al' mi nije jasno zasto. Evo kod iz mikroC-a koji sam testirao

Code:

unsigned char podatak;
void main(){
  ANSEL  = 0;             // Configure AN pins as digital I/O
  ANSELH = 0;
  PORTB = 0;
  TRISB = 0;              // Configure PORTB as output
  TRISD=0;
  PORTD=0;
  podatak=0;
  podatak=podatak<<5;
  PORTD=podatak;
  PORTD.B0=1;
  Delay_ms(2000);
  PORTD=0;

  I2C1_Init(100000);      // initialize I2C communication
  I2C1_Start();           // issue I2C start signal
  I2C1_Wr(0xA0);          // send byte via I2C  (device address + W)
  I2C1_Wr(0x01);             // send byte (address of EEPROM location)
  I2C1_Wr(0x01);
  I2C1_Wr(0x05);          // send data (data to be written)
  I2C1_Stop();            // issue I2C stop signal

  Delay_100ms();

  I2C1_Start();           // issue I2C start signal
  I2C1_Wr(0xA0);          // send byte via I2C  (device address + W)
  I2C1_Wr(0x01);             // send byte (address of EEPROM location)
  I2C1_Wr(0x01);             // send byte (data address)
  I2C1_Repeated_Start();  // issue I2C signal repeated start
  I2C1_Wr(0xA1);          // send byte (device address + R)
  podatak = I2C1_Rd(0u);    // Read the data (NO acknowledge)
  I2C1_Stop();            // issue I2C stop signal
  delay_ms(100);
  
  PORTD=0;
  podatak=podatak<<2;
  PORTD=podatak;
  PORTD.B0=1;
  Delay_ms(100);
  PORTD.B0=0;
  PORTD.B7=1;
}


Pokusao sam ovako i u MPLAB-u ali brljavi. Jeino na sta sumnjam (ali ovo pricam kao neiskusan, jer prvi put radim sa I2C), u mikroC mi se cini da je u samim funkcijama implementiran Acknowledge, a u funkcijama u MPLAB-u imam posebne funkcije za rad sa njima, pa mislim da je u njima problem. Na osnovu datasheet-a memorije (24c512) vidim kako izgleda protokl za upis, pa ako sam dobro shvatio na svakom mestu gde mi je ACK treba da posaljem Acknowledge,jel?
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama26.02.2013. u 06:56 - pre 134 meseci
Imaš primere u dokumentu koji se zove "PIC18 peripheral library help document". Ako si instalirao XC8, dokument je u direktorijumu:
c:\Program Files\Microchip\xc8\v1.12\docs

Sors kodovi funkcija su u:
c:\Program Files\Microchip\xc8\v1.12\sources\pic18\plib\i2c>

gorankg
 
Odgovor na temu

zivadin_despot
Živadin Despotović
Novi Sad

Član broj: 175438
Poruke: 704
*.dynamic.sbb.rs.



+5 Profil

icon Re: PIC16F887 problem sa funkcijama26.02.2013. u 15:54 - pre 134 meseci
Nemam instaliran xc8, nazalost. U ovom folderu (c:\Program Files\HI-TECH Software\PICC\9.71a\samples\i2c\) imam samo biblioteku i funkcije za i2c, u jednoj od prethodnih poruka sam napisao program koji mi brljavi.
 
Odgovor na temu

goran_68

Član broj: 89012
Poruke: 932
*.dynamic.isp.telekom.rs.



+81 Profil

icon Re: PIC16F887 problem sa funkcijama26.02.2013. u 17:24 - pre 134 meseci
Evo ih u prilogu.
gorankg
Prikačeni fajlovi
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: PIC16F887 problem sa funkcijama

Strane: 1 2 3

[ Pregleda: 6600 | Odgovora: 40 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.