float checklight()
{
DDRB = 0xFF; // port B output
float x = 0;
ADCSRA |= _BV(ADEN);
//Start conversion
ADCSRA |= _BV(ADSC);
// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}
// get converted value
x = ((5.0*ADC)/1024.0);
return x;
}
//sen huvudproget
int main(void){
_delay_ms(500);
lcd_init();
while(1){
char text[9];
PORTC &= ~(1 << 0);
float temp = checklight(); /*create an integer object */
dtostrf( temp, 2, 4, text );
lcd_write_string(text);
lcd_home();
_delay_ms(2000);
/*if(temp < 3.7){
DDRC = 0xFF;
PORTC |= (1 << RS);
else
PORTC |= (1 << RS);
}
*/
}
}
Mkt konstigt, och irriterande att aldrig få rätt värde. Den har fungerat förut samma kod så de känns som att de inte är koden iaf . Kan de vara någon inställning i AVRstudio som medför detta fenomen?
Är detta all kod??
Vilken AVR-krets är det du använder? Dom flesta har ju flera analoga ingångar, och då måste du bestämma vilken A/D-ingång att sampla(ADMUX)?
Vidare så bör du ha initieringen av portregistren(DDRx) i början av main. Portarna är ifrån uppstart initierade som ingångar, på raden
försöker du nolla bit0, men det är inte förrens senare i while-loopen som du gör C till utgångar(om jag förstått det hela rätt). Det är dessutom onödigt att ominitiera portarna(om dom aldrig ändrar riktning).
Aha men jag använder AD0 så då behvöer man väl inte ställa in mux den är inställd som standard?
Och jag får ursäkta min okunskap men jag trodde inte det behövdes någon initiering av ADC? Alltså själva initieringen trodde jag var "ADCSRA |= _BV(ADEN);"
Kör på STK500 så tror de mesta skall vara fixat då, men annars kör ja på intern referens. de är väl de som är standard. men annars fungerar kretsen bra, får ut värdena på en LCD som ja kopplat till och allt annat fungerar som de ska.
// get converted value
x = ((5.0*ADC)/1024.0);
return x;
Anger du ju 5V Vref. Den interna Vrefen är på 2,56V, men om du aldrig skriver till ADMUX är defaultläge "AREF, Internal Vref turned off". Kan du ta och mäta med voltmeter på pinne Aref(pinne 62).
A nej kanske inte intern, men hm nu ska ja tänka. Jag har läst någonstans för länge sen att aref är väl inkopplad hela tiden från stk500 på 5 v. alltså som man kan använda? så man slipper intern och de blir väl default typ aref?
ps. hm kan ha blandat ihop aref och avcc.
> Aha men jag använder AD0 så då behvöer man väl inte ställa in mux den är inställd som standard?
Det här är inget specifikt för AVR, men om du *aldrig* litar på defaultvärden
så minskar risken för missar radikalt. Dessutom slipper du en massa
frågor om varför du inte har ställt in det-och-det....
Så ställ in *allt* som kan ställas in !
Även om det *kanske* är samma värde som efter reset...
ok, har identifierat någon sorts fel nu iaf. Nu händer de något å det är ju positivt, det verkar som när ja inte har någon pinne vald, ingen anslutning alls så blir värdet konstant typ 2,38. Men sen när ja satte den på PortF (ADC0) och PF0 så får den iaf ett nytt värde. Men jag vill ju inte ha den på ADC? ja vill ju enbart använda en pinne och alltså AD och portA0 .
> ja vill ju enbart använda en pinne och alltså AD och portA0 .
Jag kan inte den specifika processorn, men det *låter* som att
det bara är att kolla i databladet hur det ska ställas in !?
Om det alls går att göra som du vill, så klart...
hm jo jag läser å läser i databladet, och jag tycker mig ha fått allting rätt, men de är helt plötstligt inte lika självklart vilken pinne man skall använda
Kan de ha något att göra med klockinställningarna ?
De skall så klart stå AD0 men de är mycket konstigt för de står att till exempel sätta ADmux till 0x00 ger ADC0 single ended conversion, men vad använder man då AD0 till ? får inte rätt värde på ADC0 heller för den delen