Er moet ergens een foutje zitten in mijn code maar ik vind het niet. Op PC2 zit het Z kanaal van een accelerometer. Het resultaat van de ADC wordt via USB naar de PC gestuurd, maar ik krijg telkens dezelfde waarde. Nu blijkt dat het om de waarde gaat die gemeten wordt op het moment dat ik de atmega8 programmeer. Wanneer ik bij het programmeren mijn breadboard onder een andere hoek houd krijg ik een andere waarde. Iemand een idee?
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "usbdrv.h"
#include <stdio.h>
void initADC(){
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(0<<ADPS0);
}
int getADC(){
ADMUX = 0x43;
ADCSRA |= (1<<ADSC);
while (ADCSRA & _BV(ADSC)) {}
return ADCL;
}
usbMsgLen_t usbFunctionSetup(uchar data[8]){
usbRequest_t *rq = (void *)data;
static uchar dataBuffer[1];
if(rq->bRequest == 1){
dataBuffer[0] = getADC();
usbMsgPtr = dataBuffer;
return 1;
}
return 0;
}
int main(void){
uchar i;
initADC();
ADCSRA |= (1<<ADSC);
wdt_enable(WDTO_1S);
usbInit();
usbDeviceDisconnect();
i = 0;
while(--i){
wdt_reset();
_delay_ms(1);
}
usbDeviceConnect();
sei();
for(;;){
wdt_reset();
usbPoll();
}
return 0;
}
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Op 5 december 2009 15:57:38 schreef pros:
Moet het PC3 zijn, of 0x42?
Inderdaad, de accelerometer zit op PC3. Ik was beginnen tellen van de verkeerde kant. De X en Y kanalen zitten op PC5 en PC4, daarvoor geldt hetzelfde probleem maar dan met andere waarden.
[Bericht gewijzigd door tombaugh op (19%)]
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Dan dit:
int getADC(){
ADMUX = 0x43;
ADCSRA |= (1<<ADSC);
while (ADCSRA & _BV(ADSC)) {}
return ADCL;
}
Je keert terug met de 8 minst-significante bits, ipv 10 bits. Maak daar "return ADC" van.
Bovendien gebeurt er magie, als je enkel ADCL uitleest: de ADC kan niet meer naar ADCL of ADCH schrijven, tot ADCH uitgelezen is. Zie datasheet, pag. 204.
Nu doet hij het inderdaad. Ik had besloten om enkel ADCL uit te lezen omdat ik nog in de knoei zit met USB (ik kan namelijk maar één byte per keer versturen). Ik wist niet dat dit invloed had op de verdere werking van de ADC...
Bedankt!
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Als je maar 8 bits nodig hebt, kan je ADLAR zetten, en enkel ADCH uitlezen. Dan heb je de 8 meest-significante bits te pakken.