[ zivadin_despot @ 22.02.2013. 23:23 ] @
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;
}

void main() {
     OPTION_REG=0;
     INTCON=0;
     ANSEL=0;
     ANSELH=0;
     TRISA=255;
     PORTA=0;
     TRISB=0;
     PORTB=0;
     I2C1_Init(100000);      // initialize I2C communication
     Delay_ms(100);
     //Init_RS232(9600,10);
     Delay_ms(100);
     Init_SPI();
     Delay_ms(100);
     PWM1_Init(800,10);
     Delay_ms(100);
     PWM1_Set_Parameters(800,20,10);
     Delay_ms(100);
     while(1){
     
     }
}
[ zivadin_despot @ 22.02.2013. 23:37 ] @
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)

Code:

void Ispis_displej(unsigned char podatak){
     unsigned char obrada,jedinica,desetica;
     obrada=podatak;
     jedinica=obrada%10;
     desetica=obrada/10;
     PORTD.B2=jedinica;
     PORTD.B3=jedinica>>1;
     PORTD.B4=jedinica>>2;
     PORTD.B5=jedinica>>3;
     PORTD.B1=1;
     Delay_ms(100);
     PORTD.B1=0;
     PORTD.B2=desetica;
     PORTD.B3=desetica>>1;
     PORTD.B4=desetica>>2;
     PORTD.B5=desetica>>3;
     PORTD.B0=1;
     Delay_ms(100);
     PORTD.B0=0;
}
[ zivadin_despot @ 23.02.2013. 00:10 ] @
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;
}

void Ispis_displej(unsigned char podatak){
     unsigned char obrada,jedinica,desetica;
     obrada=podatak;
     jedinica=obrada%10;
     desetica=obrada/10;
     PORTD.B2=jedinica;
     PORTD.B3=jedinica>>1;
     PORTD.B4=jedinica>>2;
     PORTD.B5=jedinica>>3;
     PORTD.B1=1;
     Delay_ms(100);
     PORTD.B1=0;
     PORTD.B2=desetica;
     PORTD.B3=desetica>>1;
     PORTD.B4=desetica>>2;
     PORTD.B5=desetica>>3;
     PORTD.B0=1;
     Delay_ms(100);
     PORTD.B0=0;
}

void main() {
     unsigned long vrednost_reg;
     unsigned int fre;
     unsigned char perioda;
     unsigned int obrada;
     unsigned int ispuna;
     //RS232====================================================================
     //podesavanje baudrate=====================
     vrednost_reg=100000/96/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====================
     //==PWM====================================================================
     fre=800;
     if(fre<620) fre=620;
     if(fre>4800) fre=4800;
     T2CON=0b00011010; //pres 16, pos 4
     perioda=(10*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;
     Delay_ms(100);
     I2C1_Init(100000);
     Delay_ms(100);
     PWM1_Set_Parameters(800,20,10);
     Ispis_displej(0);
     
     OPTION_REG=0;
     INTCON=0;
     ANSEL=0;
     ANSELH=0;
     TRISA=0;
     TRISB=0;
     PORTA=0;
     PORTB=0;
     
     while(1){
              Delay_ms(1000);

     }
}


Evo i kako to izgleda u simulaciji
[ goran_68 @ 23.02.2013. 07:56 ] @
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.
[ zivadin_despot @ 23.02.2013. 16:05 ] @
Evo kod iz Mplab-a

Code:

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

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;
     }

     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_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;
     DelayUs(1000);
     RD1=0;
     RD2=desetica;
     RD3=desetica>>1;
     RD4=desetica>>2;
     RD5=desetica>>3;
     RD0=1;
     DelayUs(1000);
     RD0=0;
}
void Slanje(void)
{
     TXEN=1;
}
static void interrupt
zile(void)
{
    if(TXIF)
     {
         DelayUs(255);
         RS232_Write(5|0x30);     
         DelayUs(255);
     }
}
//dodato===================================
char temperatura(int temp)
{
 i=0;
 while(temp>=tabela) i++;
 razlika=tabela;
 i--;
 razlika=razlika-tabela;
 razlika=razlika/5;
 j=0;
 while(temp>=(tabela+razlika*j)) j++;
 j--;
 vrednost=5+i*5+j;
 if(temp>tabela) vrednost=0;
 if(temp<tabela) vrednost=0;
 return vrednost;
}
//=========================================
void main(){
    OPTION=0;
    INTCON=0;
    ANSEL=0;
    ANSELH=0;
    TRISA=0;
    TRISB=0;
    PORTA=0;
    PORTB=0;
    Init_RS232(9600,10);
    PWM1_Init(2000,10);
    PWM1_Set_Parameters(2000,10,10);
    Ispis_displej(0);
    i=0;
    DelayUs(255);
    while(1){
        DelayUs(255);
        PORTB=~PORTB;
        i++;
        temp=temperatura(760);
        if(i==4000){
            Slanje();
            i=0;
            k++;
            Ispis_displej(temp);
        }
    }

}


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:


__CONFIG(DEBUG_OFF & LVP_OFF & FCMEN_OFF & IESO_OFF & BOREN_OFF & CPD_OFF & CP_OFF & MCLRE_ON & PWRTE_ON & HS);
__CONFIG(WRT_OFF);


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.



Code:

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

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;
     }

     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_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;
     //DelayUs(1000);
     RD1=0;
     RD2=desetica;
     RD3=desetica>>1;
     RD4=desetica>>2;
     RD5=desetica>>3;
     RD0=1;
     //DelayUs(1000);
     RD0=0;
}
void Slanje(void)
{
     TXEN=1;
}
static void interrupt
zile(void)
{
    if(TXIF)
     {
        // DelayUs(255);
         RS232_Write(5|0x30);
         //DelayUs(255);
     }
}
//dodato===================================
char temperatura(int temp)
{
 i=0;
 while(temp>=tabela) i++;
 razlika=tabela;
 i--;
 razlika=razlika-tabela;
 razlika=razlika/5;
 j=0;
 while(temp>=(tabela+razlika*j)) j++;
 j--;
 vrednost=5+i*5+j;
 if(temp>tabela) vrednost=0;
 if(temp<tabela) vrednost=0;
 return vrednost;
}
//=========================================
void main(){
    OPTION_REG=0;
    INTCON=0;
    ANSEL=0;
    ANSELH=0;
    TRISA=0;
    TRISB=0;
    PORTA=0;
    PORTB=0;
    Init_RS232(9600,10);
    PWM1_Init(2000,10);
    PWM1_Set_Parameters(2000,10,10);
    Ispis_displej(0);
    i=0;
    //DelayUs(255);
    while(1){
        //DelayUs(255);
        PORTB=~PORTB;
        i++;
        temp=temperatura(760);
        if(i==4000){
            Slanje();
            i=0;
            k++;
            Ispis_displej(temp);
        }
    }

}


Ovo ti je setovanje za 16f887

Code:


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

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       '.'            
[ goran_68 @ 24.02.2013. 18:30 ] @
Čeka u:
Code:

while(temp>=tabela) i++;



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:
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...
[ 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:

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

a PR2 već imaš izračunato.
[ grabik @ 25.02.2013. 08:07 ] @
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 :)


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]
[ 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
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
[ 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:

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)
        {
        }
}

[ goran_68 @ 25.02.2013. 23:15 ] @
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

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?
[ 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);
}
}