Försöker göra en enkel AD om vandling där jag vill att en utgång OUT skall vara noll sålänge ad ingång 2 är mindre än 1V.
Jag använder 12F675.
Vref är tagen internt via matningen som är på 5V (detta är väll satt som default?)
Har räknat att 1V blir (1x1024)/5 = 205 dec = CD hex
Som det är nu så är OUT hela tiden 0 dvs if satsen är uppfylld oavsett om det är mindre eller mer än 1V på ingången
#define OUT GPIO.F4
#define SWITCH GPIO.F1
unsigned int adc_rd;
void main(){
TRISIO=0x6; // Set GP2/AN2 and GP1 as input, rest as outputs (except GP3/MCLR)
ANSEL=0x4; // Set AN2 as analog, rest as digital (don't forget CMCON)
CMCON=0x07; // comparator off
OUT=0;
delay_ms(100);
while(1){
adc_rd=ADC_Read(2);
if(adc_rd < 0xCD){
OUT=0;
delay_ms(1000);
}
OUT=1;
}
Vad är ADC_Read(2) för funktion? Vart är den definierad? Vet du att den fungerar som den ska? Jag har använt ADC'n på just 12F675, koden är inte ens lite lik. I det här inlägget kan du se min kod: http://elektronikforumet.com/forum/view ... 11#p894111
Notera att jag har "slarvat" lite i avbrottsrutinen. Eftersom det i min applikation inte fanns något annat som kunde generera avbrott har jag skippat hela if-satsen.
Edit: Jag tycker verkligen att du ska göra dig av med ovanan att använda delayer, lär dig att använda avbrott (interrupt) och timers istället, en delay låser hela µCUn och gör koden synnerligen ineffektiv, d.v.s. µCUn skulle kunna göra något annat istället för att bara sitta och vänta
//Bränslevakt med 12f675, intern oscillator.
//extern mclr. Januari 2012 Version 1. Skall ej anslutas paralellt med
//original sensor. Passande sensor är 0-180ohm ex WEMA s3 sensorer
#define DIAG_LED GPIO.F5
#define RELAY_OUT GPIO.F4
#define IGNITION GPIO.F1
unsigned int adc_rd;
unsigned int trig_val;
unsigned int start_val;
int k=0;
int i=0;
int a=0;
void main(){
TRISIO=0x6; // Set GP2/AN2 and GP1 as input, rest as outputs (except GP3/MCLR)
ANSEL=0x4; // Set AN2 as analog, rest as digital (don't forget CMCON)
CMCON=0x07; // comparator off
RELAY_OUT=0;
delay_ms(100);
while(i<15){ //System stabilizing delay appx 30 sec. Diag led blinkinkg 1Hz
RELAY_OUT=0;
DIAG_LED=1;
delay_ms(1000);
DIAG_LED=0;
delay_ms(1000);
i++;
}
i=0;
while(1){
RELAY_OUT=0;
DIAG_LED=0;
delay_ms(1000); //delay to avoid it jumping into next while after IGNITION goes high
while(IGNITION==0){ //When car ignition is zero the ciruit is active
//Delay is used to stabilize for appc 120sec system before actuall reading is done
//so the true adc value is present when sampling is done
while(a<500){
RELAY_OUT=0;
DIAG_LED=1;
delay_ms(300); //System stabilizing delay appx 5min
DIAG_LED=0;
delay_ms(300);
a++;
}
a=0;
adc_rd=ADC_Read(2); // get ADC value from 2nd channel
start_val=adc_rd; //start_val i used later to monitor if tanke is filled up after alarm i trigged
trig_val=((adc_rd*95)/100); //XXXXX !!!!! //trig_val is 90% or 95% of start value
while(IGNITION==0){ //If IGNITION is 0
adc_rd=ADC_Read(2); //get adc reading continuesly.
DIAG_LED=1;
delay_ms(50);
DIAG_LED=0;
delay_ms(300);
if(adc_rd > 0x39A){ // If sensor wire is cut adc value is above 4,5V, turn on alarm
delay_ms(3000); // 3sec delay to avoid spikes
adc_rd=ADC_Read(2);
if(adc_rd > 0x39A){
RELAY_OUT=1;
DIAG_LED=1;
}
}
else if(adc_rd < trig_val){ //if value is less then 90%/95%/97% of trig value, wait delay below
delay_ms(3000); //Delay 3sec to avoid false trig
adc_rd=ADC_Read(2);
if(adc_rd < trig_val){ // If adc value is still less then 90%
RELAY_OUT=1; // Turn on gsm alarm with RELAY_OUT
DIAG_LED=1;
}
}
else if((start_val < adc_rd)&&(adc_rd < 0x333)){ //monitor if fuel is tanked when igniton is off
delay_ms(3000);
adc_rd=ADC_Read(2);
if((start_val < adc_rd)&&(adc_rd < 0x333)){
trig_val=((adc_rd*95)/100); //XXXXXX !!!! // set new trig value
start_val=adc_rd; //set new start value
}
}
else{
RELAY_OUT=0;
DIAG_LED=0;
}
}
}
}
}
TomasL skrev:Dessutom finns det ju inge processorinitiering, inga includes osv.
Helt normalt när det gäller mikroC. Detta görs separat när man skapar ett projekt och hamnar i en config fil.
Det är väl en av orsakerna till att inte använda microC.
Ja, exakt. Det gäller att krångla till det så mycket som möjlig så ingen annan förstår vad man gör. Det är då man blir kallad expert.
Edit: Configfilen hanteras som vilken includefil som helst, det är bara det att compilatorn vet att den finns och skall med så den behöver man inte tänka på mer än när man startar ett project eller av någon anledning vill ändra i den.
Senast redigerad av SeniorLemuren 11 maj 2013, 19:23:41, redigerad totalt 1 gång.
Inte alls, men att gömma ett antal mycket viktiga delar, så man inte har en aning om vad som händer, är i mitt tycke fullständigt felaktigt.
Man skall använda includes, bibliotek mm skall inte inkluderas per automatik.
Man skall skriva processorkonfigurationen själv.
Först då har man kontroll på vad man egentligen gör, och först då funkar saker och ting som tänkt, samt är portabelt mellan system.
Det är orsaken till att inte använda den här typen av verktyg, eftersom man får sådana här problem.
Senast redigerad av TomasL 11 maj 2013, 19:38:23, redigerad totalt 1 gång.
Ska man ta det du skriver bokstavligen då, så borde man gå tillbaka till att programmera med ettor och nollor direkt i µC. först då har man full kontroll.
Dumma dig inte nu, visst vill du ha 100% kontroll skriver du i ASM, vilket är samma sak som "Ettor och Nollor".
Dock är den typen av kontroll inte nödvändig i de flesta fallen, men ett IDE vilket gömmer konfigurationen och inkluderade bibliotek för dig är inte ett bra val.