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?