Ik heb zelf aan de hand van de datasheet van de atmega 32 een stukje code geschreven in Iar embedded workbench. Komt perfect door de compiler. ik gebruik de uart om de gevonden waarde van de AD converter naar de pc te zenden. (deze code is niet bijgevoegd, maar hij is getest en werkend)

Ik doe blijkbaar iets fout want het enige wat ik als resultaat van de AD conversie krijgt, dus wat in variable x terecht komt is 0. Ook als ik X voor de conversie op 4 initialiseer. Ik maak gebruik van een STK500 bordje. Ik heb porta0 aan de vtg (+) gehangen, en ook een paar keer aan de gnd om te testen, maar geen verschil.

Ik vraag me af of mijn code niet helemaal goed is, en of de AREF pin 32 wel aangesloten is op het stk500 bord.

Wie kan mij helpen?

// converter aanzetten door aden bit in adcsra te setten.
ADCSRA = (1<<ADEN);
// poort kiezen met multiplexer via admux register
// kies converter op porta0
ADMUX = (1<<MUX0);
// start conversie door adsc 1 te maken. als klaar hardware gooit hem op 0.
ADCSRA = (1<<ADSC);
// wacht tot conversie klaar is
while(ADCSRA & (1<<ADSC))
;
// adch bevat dan de waarde.
x = ADCH; // leees waarde in

ehh als ik me niet vergis heeft die ADC een 16 of 10 bits waarde (exacte aantal vergeten sorry) dus een high byte en een low byte (is iig bij de MEGA8 we, dus je moet die high byte erin laen die 8 plaatsen opschuiven en dan de lowbyte erin laden

Op 9 juli 2005 09:40:45 schreef High met Henk:
ehh als ik me niet vergis heeft die ADC een 16 of 10 bits waarde (exacte aantal vergeten sorry) dus een high byte en een low byte (is iig bij de MEGA8 we, dus je moet die high byte erin laen die 8 plaatsen opschuiven en dan de lowbyte erin laden

weet ik, maar als 8 bit precisie genoeg is kan je ook alleen 1 deel laden. (stond in datasheet)

de precisie van de adc is 10 bits.

JA klopt, maar dan moet je volgens mij ADCL hebben IPV ADCH ofzow, dat ding bestond uit 2 delen, staat allemaal exact in de datasheet, ik heb die meuk ook ergens in mijn lapdoos, maar moet ik ff gaan zoeken, doe ik vanavond wel

Op 9 juli 2005 14:08:58 schreef High met Henk:
JA klopt, maar dan moet je volgens mij ADCL hebben IPV ADCH ofzow, dat ding bestond uit 2 delen, staat allemaal exact in de datasheet, ik heb die meuk ook ergens in mijn lapdoos, maar moet ik ff gaan zoeken, doe ik vanavond wel

ik stuur ze alletwee los naar de uart, maar ze zijn alletwee 0. als ik dus die variable X op een ander getal dan 0 set voor de conversie, wordt ie wel op 0 gezet....

en ik heb een paar voorbeeld codes bekeken, en de datasheet ondertussen 3x gelezen maar het is echt adch.

/*
dit programma laat door middel van 4 leds de waarde op de PB4 pin zien
*/

#include <avr/io.h>

int
main (void)
{
unsigned char vala;
unsigned char tel1;
DDRB=0x2F; //PB0-PB3 = output PB4 = input
while (1) //eeuwige lus
{
ADMUX=0x22; //selecteer AD2(=PB4)
ADCSRA=0xE0; //enable ADC en start conversie
while(ADCSRA==0xE0); //wacht tot conversie klaar is (bit ADSC = 0)
vala=0x01; //zet een 1 in vala
tel1=ADCH; //zet de hoge byte van de ADC waarde in tel1
tel1>>=6; //schuif de ADC waarde 6 plaatsen naar rechts (=delen door 64=2^6)
vala<<=tel1; //schuif de 1 tel1 plaatsen op (0 tot 3 plaatsen dus)
PORTB=vala; //zet de al dan niet verschoven 1 op de pinnen
}
return (0);
}

EDIT: wel voor de attiny, maar dan zie je even wat ik doe.

[Bericht gewijzigd door Martijn Berntsen op ]

pagina 216 van de datasheet ADLAR = 0
ADCH is high input
ADCL is low input

Dus als jij tot 5 volt gaat(wat ik uit je verhaal begrijp)

dan is het 1024 stappen

5/1024 = 0,0048828125

jij pakt pas in bij het 9e bit, das dus 512

das ongeveer de helft van 5 V dus pas bij 2,5 V zal jouw ADCH wat gaan doen

je krijgt 2 waarden zoals ik al zei en hij is 10 bits je moet dit dus in een (unsigned) integer stoppen

Ofwel zoiets:


int X = 0;

X = ADCH;
X = X << 8;
X = X + ADCL;

Dit zal iig werken voor het inladen van een waarde op ADC ingang 0 als ik ook niet wat over het hoofd zie

Bedankt voor de reacties maar het het werkt nog niet echt.

Ik heb de complete code zoals hij nu is even online gezet, misschien kan iemand nog een fout vinden.

code: http://www.cohnen.nl/code.txt

verder heb ik via een spanningsdeler (onderstaand voorbeeld) een aftakking gemaakt naar porta0.

http://www.cohnen.nl/schema.jpg
Deze heb ik even nagemeten, en er staat inderdaad op het punt bij port a maar 2,5 volt dus de helft van de 5. Dus ik neem aan dat dit goed aangesloten is.

[Bericht gewijzigd door marcel c op ]

ik heb de fout gevonden, een klasgenoot van me heeft me geholpen en het setten van de bitjes ging fout, ik had |= moeten gebruiken ipv = want dan worden de oude bitjes gereset.

Op 8 juli 2005 23:45:08 schreef marcel c:
// converter aanzetten door aden bit in adcsra te setten.
ADCSRA = (1<<ADEN);
// poort kiezen met multiplexer via admux register
// kies converter op porta0
ADMUX = (1<<MUX0);
// start conversie door adsc 1 te maken. als klaar hardware gooit hem op 0.
ADCSRA |= (1<<ADSC);
// wacht tot conversie klaar is
while(ADCSRA & (1<<ADSC))
;
// adch bevat dan de waarde.
x = ADCH; // leees waarde in

marc333l!! dit moet ie zijn:P:P

Maar waarom lezen jullie alleen ADCH uit eigenlijk?

enfin, ik reset gewoon alle waarden voor ik een conversie doe, dus had hier geen ellende met het geval wat zich hier voordeed

als je de boel links uitlijnt, krijg je in adch een 8 bits waarde. als je niet meer nodig hebt is dat wel makkelijk.