Pozdrav svima, interesuje me sledece, kada u kodu imam funkcije za PWM, I2C, SPI i UART i kada ih sve inisijalizujem u main, kontroler je jednostavno mrtav, zasto?
Kada zakomentarisem inisijalizaciju UART funkcije onda radi, tj imam signal PWM-a, u suprotnom ne... Evo i kod:
Code:
void Init_RS232(unsigned int baud_rate,unsigned int oscilator_MHz)
{
unsigned int baud;
unsigned long vrednost_reg;
unsigned long fcy;
//podesavanje baudrate=====================
baud=baud_rate;
fcy=oscilator_MHz*1000000;
vrednost_reg=fcy/baud/64; //formula
vrednost_reg=vrednost_reg-1; //formula
SPBRG=vrednost_reg&0x00FF; //registri za baud
SPBRGH=(vrednost_reg&0xFF00)>>8;
BRG16_bit=0; //8mo bitni baud generator
//BRGH_bit=1; //visok baud //ovo se ne sme staviti
//=========================================
//podesavanje rs232modula===================
GIE_bit=1; //globalni interrupt
PEIE_bit=1; //periferijski interrupt
SYNC_bit=0; //asinhroni mod
SPEN_bit=1; //omogucuje serijski modul;
//podesavanje transmitera==================
//TXIE_bit=1; //omogucen interrupt za TX
TXEN_bit=0; //onemoguceno slanje
//======================================
//podesavanje prijemnika================
RCIE_bit=1; //omogucen RX interrupt
CREN_bit=1; //omogucuje recivera
//=======================================
RCIF_bit=0; //================dodato====================
TXIE_bit=1; //================dodato====================
}
unsigned char RS232_Read(void)
{
unsigned char read_buf;
read_buf=RCREG;
CREN_bit=1;
return read_buf;
}
void RS232_Write(unsigned int podatak)
{
unsigned char prijem;
prijem=podatak;
TXREG=podatak;
Delay_ms(10);
TXEN_bit=1;
Delay_ms(10);
TXEN_bit=0;
TXREG=0;
}
//====== Inicijalizacija SPI ===============================================================================/
void Init_SPI(void)
{
SSPCON=0x20; //omogucen SPI i takt je Fosc/4
SSPSTAT=0x00;
SSPSTAT.BF=0; //pin koji se setuje kada je bafer pun
TRISC.B5=0; //SD0 izlazni
TRISC.B3=0; //SCK izlazni
TRISC.B4=0; //SDI ulazni
}
void Upis_SPI(char data_SPI)
{
SSPCON=0x20;
SSPBUF=data_SPI;
SSPCON=0x00;
}
//====Inicijalizacija PWM-a ===============================================================================/
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_bit=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;
TRISC.B2=0;
PORTC.B2=0;
TMR2ON_bit=1;
}
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))/log10(2))*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;
}
Da napomenem, ne treba da stoji funkcija za SPI, ali sve jedno, kad nju izbacim i dodam neku funkciju takodje nece da funkcionise... Dodata je funkcija za ispis na 7-segmentni displej (dvocifren broj)
Evo sta se jos desava, kada sadrzaje funkcija Init_RS232 i PWM1_Init ubacim direktno u main, onda radi normalno, ali ako u while(1) dodam samo Delay_ms(1000), onda se desava da jednu sekundu imam PWM, a onda nemam, tj neki sum na osciloskopu u Proteusu... Evo i kod:
Code:
unsigned char RS232_Read(void)
{
unsigned char read_buf;
read_buf=RCREG;
CREN_bit=1;
return read_buf;
}
void RS232_Write(unsigned int podatak)
{
unsigned char prijem;
prijem=podatak;
TXREG=podatak;
Delay_ms(10);
TXEN_bit=1;
Delay_ms(10);
TXEN_bit=0;
TXREG=0;
}
//====Inicijalizacija PWM-a ===============================================================================/
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))/log10(2))*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;
}
Koji kompajler koristiš i da li ti izbacuje neko upozorenje ili grešku? Problem sigurno nema veze sa time šta od funkcija dodaješ već kolike su te funkcije u pogledu veličine koda. Mogao bi da vidiš šta se dešava ako analiziraš generisani asemblerski kod. Jeste smor ali ti je to jedino rešenje.
[ zivadin_despot @ 23.02.2013. 11:23 ] @
Koristim MikroC, i nije mi prijavljivao greske, popunjenost kontrolera je oko 25 posto...Uzeo sam i prebacio kod u Mplab 8.56, kompajler HITECH, i ono delimicno radi, kad stignem kuci okacicu kod. Posto sam slabo radio u Mplab okruzenju, nisam siguran kako se setuju konfiguracioni bitovi. Cim stignem kuci, okacicu kod, pa da probam tu resiti. A sto se tice MikroCa, ovo mi je drugi put da mi desi, gde su mi funkcije manje, samo ih ima dosta...Koje bi bilo resenje ako je problem do velicine funkcija, da li ih onda smestiti u neki drugi c file pa prwko h file ubaciti? Hvala na odgovoru.
[ goran_68 @ 23.02.2013. 14:10 ] @
Ma veličina koda ne treba da ima nikakve veze al ko zna šta kompajler izmulja. Postaviću ti konfiguracione bitove iz HiTech samo reci šta ti treba.
unsigned int i;
unsigned int k;
unsigned char temp;
//unsigned int tabela[20]={277,332,391,452,512,574,631,683,730,772,810,843,870,893,913,930,945,957,967,975};
unsigned char j,razlika,vrednost,tabela;
void Init_RS232(unsigned int baud_rate,unsigned int oscilator_MHz)
{
unsigned int baud;
unsigned long vrednost_reg;
unsigned long fcy;
//podesavanje baudrate=====================
baud=baud_rate;
fcy=oscilator_MHz*1000000;
vrednost_reg=fcy/baud/64; //formula
vrednost_reg=vrednost_reg-1; //formula
SPBRG=vrednost_reg&0x00FF; //registri za baud
SPBRGH=(vrednost_reg&0xFF00)>>8;
BRG16=0; //8mo bitni baud generator
//BRGH_bit=1; //visok baud //ovo se ne sme staviti
//=========================================
//podesavanje rs232modula===================
GIE=1; //globalni interrupt
PEIE=1; //periferijski interrupt
SYNC=0; //asinhroni mod
SPEN=1; //omogucuje serijski modul;
//podesavanje transmitera==================
//TXIE_bit=1; //omogucen interrupt za TX
TXEN=0; //onemoguceno slanje
//======================================
//podesavanje prijemnika================
RCIE=1; //omogucen RX interrupt
CREN=1; //omogucuje recivera
//=======================================
RCIF=0; //================dodato====================
TXIE=1; //================dodato====================
}
unsigned char RS232_Read(void)
{
unsigned char read_buf;
read_buf=RCREG;
CREN=1;
return read_buf;
}
void RS232_Write(unsigned int podatak)
{
unsigned char prijem;
prijem=podatak;
TXREG=podatak;
DelayUs(1000);
TXEN=1;
DelayUs(1000);
TXEN=0;
TXREG=0;
}
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=30; //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;
}
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))/log10(2))*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;
}
Interesuje me sintaksa kako se postavljaju konfiguracioni bitovi? A treba mi sledece, eksterni oscilator 10MHz, iskljucen Brown, iskljucen WDT, ukljucen HS, i valjda je to to... Ja sam pokusavao to podesiti u konfiguracionom prozoru ali i nakon toga kada probam da ubacim hex PicKIT2 mi prijavi da hex ne sadrzi konfiguracione bitove!!!, kada iz Mplab-a exportujem 8bitni hex, pickit mi prijavi da je hex veci od memorije kontrolera?
Predpostavljam da ne znam da izbacim hex :)
Jos negde sam citao o problemu delay funkcije, Ja sam ovde koristio DelayUs(255) a merenje mi pokazuje 310us, ali predpostavljam da je to zbog ne podesenih konfiguracionih bitova ( simulirao sam u Proteus-u)
Znaci pomoglo bi mi sledece:
sintaksa za podesavanje konfiguracionih bitova
kako se exportuje hex
i da li mi je dobra sintaksa za interrupt
Hvala na pomoci
[ goran_68 @ 23.02.2013. 21:01 ] @
Podešavanje za konfiguracione bitove dodaješ odmah nakon #include i to ovako:
Moj picc za 16 seriju Microchip kontrolera je neka stara varijanta pa ne mogu da prevedem ceo kod jer nemam definicije za PIC16F887. Najverovatnije je da se definicije za konfiguracione bitove razlikuju od ovog što sam ti gore naveo. Ovo gore je prevedeno sa XC8 free vezijom kompajlera. Kako se definišu konfig bitovi i svi ostali registri naći ćeš u include direktorijumu fajl se najverovatnije zove pic16f887.h. Obavezno dodaj sve bitove bez obzira što ti recimo trenutno nije interesantan BOR ili code protection.
DelayUs smo već objašnjavali u nekoj temi ispod. Interrupt ti je OK.Jel ti testiraš u PROTEUS-u ili na realnom hardveru? Za export hex najpre odaberi PICKit2 iz Programmer padajućeg menija pa onda ideš na Program. Ne znam da li koristiš in'circuit pa zato obrati pažnju na to odakle bi da napajaš PIC prilikom programiranja. XC8 je preveo ovaj tvoj kod i zauzeo nekih 50% programske memorije. Da li ti je baš neophodna ovolika matematika za PWM? Nisam sve detaljno gledao...
[ grabik @ 23.02.2013. 21:26 ] @
Vrlo optimisticki je ocekivati da ce pic16F odraditi tu matematiku u realnom vremenu, pogotovo ovo sa pokretnim zarezom koje pretpostavljam ni ne izracuna kako treba.
Sto se tice konfiguracije itd. mikrocip je to kulturno uradio i sa svakim c kompajlerom recimo c30 ili xc16 po novom imas u doc fajlu sve kulturno odradjeno sta i kako , odnosno koji *.h pozvati i koje funkcije i makroi sta rade.
Ako mislis da kompajliras sa mikrocipovim kompajlerima odmah preskoci 16f i 18f jer ovaj xc8 ubacuje jos jedno 60% smeca da uspori mikrokontroler ako nije placen kompajler ,dok xc16 i xc32 to ne rade.
[ goran_68 @ 24.02.2013. 00:03 ] @
grabik,
Kakvu matematiku u realnom vremenu!? Kako misliš da ne izračuna dobro!? Kakve veze ima to što radi na 16F? Čovek generiše pwm signal, ispisuje nešto na displeju i ima UART. Ne treba mu ARM11 za to. Ja sam pre par dana uradio kao primer nešto vrlo vrlo slično za PIC16F1827 sa XC8. Jedino nemam UART. I radi sasvim normalno. I ne vidim zašto ne bi radilo.
[ grabik @ 24.02.2013. 04:07 ] @
Cekaj malo, covjek se nije izjasnio sta radi, prije je radio frekventni za motor ako ne grjesim. Ja koliko me sjecanje sluzi hi tec ovo nije dobro racunao ako se napisalo na ovakav nacin ,ima dosta godina, provjeri u simulatoru.....
sad vidim da je ovo malo rafiniraniji kod ;) ja pricam o float a covjek stavi max kao int a onda sto me zbunilo;) "max=ispuna_max*1.07177;max=ispuna_max*1.14869; max=ispuna_max*1.23144;" .
[ grabik @ 24.02.2013. 07:52 ] @
@zivadin_despot , probaj da iskljucis optimizacije u hitec c-u jer taj kompajler zna da generise kod koji sa jednom verzijom radi a sa slijedecom verzijom kompajlera isti kod ne radi, imao sam takav problem prije dok sam radio sa 16f. Takodje probaj da napravis simulaciju u mplab ili jos bolje u mplabx ako jos podrzava tvoju verziju kompajlera i to tako da otvoris registre koji su sa uart i pwm , setujes breakpointe i gledas da li program u radu mjenja setovanje, pwm-a i uart ili nesto slicno, pretpostavljam da postoji logicno objasnjenje zasto se to desava. Takodje da li ti je mozda wdt ukljucen pa pravi probleme.
[ grabik @ 24.02.2013. 08:18 ] @
Citat:
goran_68:
grabik,
Kakvu matematiku u realnom vremenu!? Kako misliš da ne izračuna dobro!? Kakve veze ima to što radi na 16F? Čovek generiše pwm signal, ispisuje nešto na displeju i ima UART. Ne treba mu ARM11 za to. Ja sam pre par dana uradio kao primer nešto vrlo vrlo slično za PIC16F1827 sa XC8. Jedino nemam UART. I radi sasvim normalno. I ne vidim zašto ne bi radilo.
Kakve veze to sto radi na 16f, pa "vako" ukljucen: pwm,uart,spi,i2c radi lcd displej nakljukan sa delay-ima kao novogodisnje drvce i puna kola matematike , stani malo :):):):)
Recimo 16f877 kosta u farnelu 5,5funti , za 5,5funti mozes da biras kod 16 bitnih piconja ili cak 32 bitne. Drugo imas odlicne besplatne kompajlere koji nisu "potkresani" ako koristis "studentsku" verziju. Imas na tone primjera u c koje je dao proizvodjac. Imas mocan integrisani alat za iste i na kraju ne da jedu ove 16f za dorucak nego ne mogu ni po cemu ni da se porede vise.
Da ne zaboravim za iste imas u doc fajlu config_index.html u kojem odaberes samo koji hoces mc i imas sve sazvakano sto se tice konfiguracionih bitova samo copy paste sta zelis.
Eh da zaboravio sam, sa prijevodom sa engleskog su stigli samo 16f84 i 16f877 da prevedu:)
[Ovu poruku je menjao grabik dana 24.02.2013. u 09:30 GMT+1]
[ goran_68 @ 24.02.2013. 08:42 ] @
grabik,
U naslovu piše da koristi PIC16F887 a on ne košta 5,5 funti. Onaj izraz koji te bunio treba da piše ovako:
case 1: max=(unsigned int)(ispuna_max*1.07177); break;
Nije uradio typecast ali to ne znači da izraz nije dobro izračunat. Kompajler se buni i izbaci warning u ovakvom slučaju ali je verovatno on to zanemario.
zivadin_despot,
Probaj ovaj hex ispod.
[ grabik @ 24.02.2013. 09:16 ] @
Moja greska, gledao sam 877 , taj 887 kosta u tqfp44 kucistu 2,55funti a za tu cifru moze da se nadje u istom kucistu i 5V 16bitni piconja , 3V-tni piconje se mogu naci u 44pinskom kucistu vec od 1,58 funti. Jedino ne znam kako proteus stoji sa ovim malim terminatorima:)
Ja ti kazem da kad sam radio sa hitec(prije 7 godina) ako nisi napisao typecast nije dobro izracunao ,to ne pricam napamet.
[ goran_68 @ 24.02.2013. 09:28 ] @
Jeste bio problem oko typecast i verovatno i te verzije izbacuju upozorenje, mrzi me da sad probam ne sećam se, ali to je već greška onog ko piše softver. Microchip-ov Mplabc je isto tako radio. Sad sigurno izbacuje upozorenje proverio sam.
[ goran_68 @ 24.02.2013. 12:34 ] @
I još nešto o čemu su takođe vrlo često vođene diskusije. Šta vredi taj mali 16-bitni terminator od 1.5 funtu ukoliko ne zadovoljava potrebe njegove aplikacije? Možda mu treba EEPROM. Nijedan PIC24H, PIC24E, dsPIC33F nema EEPROM. Da li treba da dodaje još jedan IC s strane? Šta ako mu treba svih 36 i/o pinova? Prvi sledeći 16-bitni koji ima EEPROM i u 44 pinskom je pakovanju je PIC24F16KA304. Ali on ne košta 1.5 funtu! I ne nalazim ga u farnellu. OK ima ga digikey i košta oko 4USD. Nažalost nema ga ni Comet, distributer u Srbiji. Ništa zato, dobaviće ga i Comet i svi ostali ali zaboga, mora se čekati. Koliko? Pa recimo dve nedelje. Šta ako mu treba za juče! Ovaj mali buđavi 8-bitni je jeftin i kupuje se još malo pa na trafici :) Ako je za hobi i igranje cena i dobavljivost ne igra. Ali tad se već postavlja drugo pitanje: Zašto onda PIC!?
[ grabik @ 24.02.2013. 14:52 ] @
Citat:
goran_68: I još nešto o čemu su takođe vrlo često vođene diskusije. Šta vredi taj mali 16-bitni terminator od 1.5 funtu ukoliko ne zadovoljava potrebe njegove aplikacije? Možda mu treba EEPROM. Nijedan PIC24H, PIC24E, dsPIC33F nema EEPROM. Da li treba da dodaje još jedan IC s strane? Šta ako mu treba svih 36 i/o pinova? Prvi sledeći 16-bitni koji ima EEPROM i u 44 pinskom je pakovanju je PIC24F16KA304. Ali on ne košta 1.5 funtu! I ne nalazim ga u farnellu. OK ima ga digikey i košta oko 4USD. Nažalost nema ga ni Comet, distributer u Srbiji. Ništa zato, dobaviće ga i Comet i svi ostali ali zaboga, mora se čekati. Koliko? Pa recimo dve nedelje. Šta ako mu treba za juče! Ovaj mali buđavi 8-bitni je jeftin i kupuje se još malo pa na trafici :) Ako je za hobi i igranje cena i dobavljivost ne igra. Ali tad se već postavlja drugo pitanje: Zašto onda PIC!?
Sad si me dobro nasmejao, zar mislis da tehnologija ide unazad i to korisnici tek tako uzimaju zdravo za gotovo, svaki taj nesrecni 16bitni ,dspic,32bitni pic moze da upisuje u vlastiti flash , sto znaci da upisuje i brise, sto opet znaci da sam sebe moze da programira(booot sektor) , teoretski moze da upise roman dostojevskog u svoj flash;) , pa mu u stvari ni ne treba eeprom :)))
Sto se tice pinova dobar deo ima pps ,znaci sam odredjujes sta ce ti biti koji pin i gdje ce biti, ovo pojednostavljuje projektovanje PCB-a ,ne svi ali poprilican broj, takodje imaju odredjeni broj tolerantnih 5V pinova.
Ja narucujem iz farnela i ovdje su porilicno brzi zavisno kad uplatis dobijas i za 3-4 dana ako imaju na skladistu.
[ goran_68 @ 24.02.2013. 16:06 ] @
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.
[ grabik @ 24.02.2013. 17:55 ] @
interapt u kodu ti ne radi, pretpostavljam nesto sa uart, vrlo lose ti je sto stavljas delay u interapt, a program se zaglavi u while u funkciji temperatura. Tako kaze mplabx simulator.
unsigned int i;
unsigned int k;
unsigned char temp;
//unsigned int tabela[20]={277,332,391,452,512,574,631,683,730,772,810,843,870,893,913,930,945,957,967,975};
unsigned char j,razlika,vrednost,tabela;
void Init_RS232(unsigned int baud_rate,unsigned int oscilator_MHz)
{
unsigned int baud;
unsigned long vrednost_reg;
unsigned long fcy;
//podesavanje baudrate=====================
baud=baud_rate;
fcy=oscilator_MHz*1000000;
vrednost_reg=fcy/baud/64; //formula
vrednost_reg=vrednost_reg-1; //formula
SPBRG=vrednost_reg&0x00FF; //registri za baud
SPBRGH=(vrednost_reg&0xFF00)>>8;
BRG16=0; //8mo bitni baud generator
//BRGH_bit=1; //visok baud //ovo se ne sme staviti
//=========================================
//podesavanje rs232modula===================
GIE=1; //globalni interrupt
PEIE=1; //periferijski interrupt
SYNC=0; //asinhroni mod
SPEN=1; //omogucuje serijski modul;
//podesavanje transmitera==================
//TXIE_bit=1; //omogucen interrupt za TX
TXEN=0; //onemoguceno slanje
//======================================
//podesavanje prijemnika================
RCIE=1; //omogucen RX interrupt
CREN=1; //omogucuje recivera
//=======================================
RCIF=0; //================dodato====================
TXIE=1; //================dodato====================
}
unsigned char RS232_Read(void)
{
unsigned char read_buf;
read_buf=RCREG;
CREN=1;
return read_buf;
}
void RS232_Write(unsigned int podatak)
{
unsigned char prijem;
prijem=podatak;
TXREG=podatak;
// DelayUs(1000);
TXEN=1;
//DelayUs(1000);
TXEN=0;
TXREG=0;
}
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=30; //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;
}
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))/log10(2))*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;
}
16F887 Support Information
#pragma config Usage
#pragma config <setting>=<named value>
For example:
// Data Code Protection bit: Data memory code protection is disabled
// Brown Out Reset Selection bits: BOR disabled
// Internal External Switchover bit: Internal/External Switchover mode is disabled
// In-Circuit Debugger Mode bit: In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
// Oscillator Selection bits: INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
// Fail-Safe Clock Monitor Enabled bit: Fail-Safe Clock Monitor is disabled
// RE3/MCLR pin function select bit: RE3/MCLR pin function is digital input, MCLR internally tied to VDD
// Watchdog Timer Enable bit: WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
// Code Protection bit: Program memory code protection is disabled
// Low Voltage Programming Enable bit: RB3 pin has digital I/O, HV on MCLR must be used for programming
// Power-up Timer Enable bit: PWRT disabled
#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, DEBUG = OFF, FOSC = INTRC_NOCLKOUT, FCMEN = OFF, MCLRE = OFF, WDTE = OFF, CP = OFF, LVP = OFF, PWRTE = OFF
#pragma config <setting>=<literal constant>
For example:
// Data Code Protection bit: Data memory code protection is disabled
// Brown Out Reset Selection bits: BOR disabled
// Internal External Switchover bit: Internal/External Switchover mode is disabled
// In-Circuit Debugger Mode bit: In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
// Oscillator Selection bits: INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
// Fail-Safe Clock Monitor Enabled bit: Fail-Safe Clock Monitor is disabled
// RE3/MCLR pin function select bit: RE3/MCLR pin function is digital input, MCLR internally tied to VDD
// Watchdog Timer Enable bit: WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
// Code Protection bit: Program memory code protection is disabled
// Low Voltage Programming Enable bit: RB3 pin has digital I/O, HV on MCLR must be used for programming
// Power-up Timer Enable bit: PWRT disabled
#pragma config CPD = 0x1, BOREN = 0x0, IESO = 0x0, DEBUG = 0x1, FOSC = 0x4, FCMEN = 0x0, MCLRE = 0x0, WDTE = 0x0, CP = 0x1, LVP = 0x0, PWRTE = 0x1
#pragma config <register>=<literal constant>
For example:
// Data Code Protection bit: Data memory code protection is disabled
// Brown Out Reset Selection bits: BOR disabled
// Internal External Switchover bit: Internal/External Switchover mode is disabled
// In-Circuit Debugger Mode bit: In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
// Oscillator Selection bits: INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
// Fail-Safe Clock Monitor Enabled bit: Fail-Safe Clock Monitor is disabled
// RE3/MCLR pin function select bit: RE3/MCLR pin function is digital input, MCLR internally tied to VDD
// Watchdog Timer Enable bit: WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
// Code Protection bit: Program memory code protection is disabled
// Low Voltage Programming Enable bit: RB3 pin has digital I/O, HV on MCLR must be used for programming
// Power-up Timer Enable bit: PWRT disabled
#pragma config CONFIG1 = 0xE0D4
For example:
// IDLOC @ 0x2000
#pragma config IDLOC0 = 0x3FFF
#pragma config Settings
Register: CONFIG1 @ 0x2007
CPD = Data Code Protection bit
OFF Data memory code protection is disabled
ON Data memory code protection is enabled
BOREN = Brown Out Reset Selection bits
OFF BOR disabled
ON BOR enabled
NSLEEP BOR enabled during operation and disabled in Sleep
SBODEN BOR controlled by SBOREN bit of the PCON register
IESO = Internal External Switchover bit
OFF Internal/External Switchover mode is disabled
ON Internal/External Switchover mode is enabled
DEBUG = In-Circuit Debugger Mode bit
OFF In-Circuit Debugger disabled, RB6/ICSPCLK and RB7/ICSPDAT are general purpose I/O pins
ON In_Circuit Debugger enabled, RB6/ICSPCLK and RB7/ICSPDAT are dedicated to the debugger
FOSC = Oscillator Selection bits
INTRC_NOCLKOUT INTOSCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
XT XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
LP LP oscillator: Low-power crystal on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
INTRC_CLKOUT INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN
EXTRC_CLKOUT RC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
EXTRC_NOCLKOUT RCIO oscillator: I/O function on RA6/OSC2/CLKOUT pin, RC on RA7/OSC1/CLKIN
EC EC: I/O function on RA6/OSC2/CLKOUT pin, CLKIN on RA7/OSC1/CLKIN
HS HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN
FCMEN = Fail-Safe Clock Monitor Enabled bit
OFF Fail-Safe Clock Monitor is disabled
ON Fail-Safe Clock Monitor is enabled
MCLRE = RE3/MCLR pin function select bit
OFF RE3/MCLR pin function is digital input, MCLR internally tied to VDD
ON RE3/MCLR pin function is MCLR
WDTE = Watchdog Timer Enable bit
OFF WDT disabled and can be enabled by SWDTEN bit of the WDTCON register
ON WDT enabled
CP = Code Protection bit
OFF Program memory code protection is disabled
ON Program memory code protection is enabled
LVP = Low Voltage Programming Enable bit
OFF RB3 pin has digital I/O, HV on MCLR must be used for programming
ON RB3/PGM pin has PGM function, low voltage programming enabled
PWRTE = Power-up Timer Enable bit
OFF PWRT disabled
ON PWRT enabled
Register: CONFIG2 @ 0x2008
BOR4V = Brown-out Reset Selection bit
BOR40V Brown-out Reset set to 4.0V
BOR21V Brown-out Reset set to 2.1V
WRT = Flash Program Memory Self Write Enable bits
HALF 0000h to 0FFFh write protected, 1000h to 1FFFh may be modified by EECON control
OFF Write protection off
1FOURTH 0000h to 07FFh write protected, 0800h to 1FFFh may be modified by EECON control
256 0000h to 00FFh write protected, 0100h to 1FFFh may be modified by EECON control
Register: IDLOC0 @ 0x2000
Register: IDLOC1 @ 0x2001
Register: IDLOC2 @ 0x2002
Register: IDLOC3 @ 0x2003
[ grabik @ 24.02.2013. 17:58 ] @
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.
[ grabik @ 24.02.2013. 18:04 ] @
Evo ti i stanje svih registara u picu kad program ceka u while u funkciji temperatura ako ti nesto pomogne
Verovatno je eksperimentisao pa zaboravio da treba da bude:
Code:
while(temp>=tabela[i]) i++;
[ grabik @ 24.02.2013. 18:32 ] @
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.
[ grabik @ 24.02.2013. 18:40 ] @
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]
[ zivadin_despot @ 24.02.2013. 23:05 ] @
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:
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...
[ zivadin_despot @ 24.02.2013. 23:07 ] @
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.
[ goran_68 @ 25.02.2013. 07:42 ] @
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:
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.
[ bogdan.kecman @ 25.02.2013. 08:38 ] @
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
[ bogdan.kecman @ 25.02.2013. 08:51 ] @
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 ..)
[ goran_68 @ 25.02.2013. 09:03 ] @
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 :)
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]
[ zivadin_despot @ 25.02.2013. 12:33 ] @
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
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
[ grabik @ 25.02.2013. 14:18 ] @
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.
[ zivadin_despot @ 25.02.2013. 22:02 ] @
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:
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
[ zivadin_despot @ 25.02.2013. 23:39 ] @
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
//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);
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?
[ goran_68 @ 26.02.2013. 06:56 ] @
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>
[ zivadin_despot @ 26.02.2013. 15:54 ] @
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.
[ goran_68 @ 26.02.2013. 17:24 ] @
Evo ih u prilogu.
[ goran_68 @ 26.02.2013. 17:29 ] @
Primer iz uputstva:
Code:
//The following is a simple code example illustrating the SSP module configured for I2C
master communication. The routine illustrates I2C communications with a Microchip 24LC01B
I2C EE memory device.
#include "p18cxx.h"
#include "i2c.h"
unsigned char arraywr[] = {1,2,3,4,5,6,7,8,0};
unsigned char arrayrd[20];
//***************************************************
void main(void)
{
OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
SSPADD = 9; //400kHz Baud clock(9) @16MHz
//100kHz Baud clock(39) @16MHz
while(1)
{
EEByteWrite(0xA0, 0x30, 0xA5);
EEAckPolling(0xA0);
EECurrentAddRead(0xA0);
EEPageWrite(0xA0, 0x70, arraywr);
EEAckPolling(0xA0);
EESequentialRead(0xA0, 0x70, arrayrd, 20);
EERandomRead(0xA0,0x30);
}
}