A/D strul på AVR

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

A/D strul på AVR

Inlägg av klintan »

Hm blir mkt fundersam det känns som de är något fel på min AD omvandlare, kör med STK500 atmega128.

Oavsett vilka värden jag kopplar in till en pinne , alltså oavsett hur mkt spänningen varierar förblir värdet i ADC registret 2,34.

Min kod:

Kod: Markera allt

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?

Tack för alla tips och förslag,
Användarvisningsbild
björn
EF Sponsor
Inlägg: 2570
Blev medlem: 29 mars 2004, 23:09:55

Inlägg av björn »

var har du initieringen av adc??
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Ä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

Kod: Markera allt

PORTC &= ~(1 << 0);
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).
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

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);"

Hur sköts isåfall denna?

Aha tack stinrew såg de nu, självklart :)
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Ursäkta frågan, ser nu att det står mega128. :oops:
Har du anslutit AVCC, AREF plus samtliga VCC och GND på kretsen? Fungerar kretsen bra i övrigt?
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

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.
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

I din kod:

Kod: Markera allt

// 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).

Edit, har du uCn i en STK501?
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

yes exakt en 501a, ändrar de något?

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.
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Men prova då att i början av main lägga till raden:

Kod: Markera allt

ADMUX |= 0x40;
så borde det bli som du vill.
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

perfekt tack så mkt ska pröva.

Tack för tipsen annars sodjan, bra att tänka på. har inte ritkigt fått in de här programmeringstänket ännu :)
Senast redigerad av klintan 18 november 2007, 22:11:35, redigerad totalt 3 gånger.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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...
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Håller medsodjan, det blir tydligare så. Det skadar ju inte heller att radkommentera :)
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

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 .
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> 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...
klintan
Inlägg: 307
Blev medlem: 13 juni 2003, 01:59:05
Ort: Ekerö

Inlägg av klintan »

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 :S

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 :(
Skriv svar