Atmega8-16 ADC-ISR

Gast #2760471
Lesenswert?

Ich nutze ein ATmega8 16MHz und wollte den ADC-Interrupt mal versuchen 
ihn umzusetzen ,nachdem ich das ADC-Tutorial erfolgreich umsetzen 
konnte.
die Geschichte mit dem interrupt da happerts, ich bekomme als ausgabe 
nur immer Null anstatt den ADC-Wert.

Die uart-funktionen hab ich jetzt mal nicht mit angehängt.

vielleivht weiß einer von euch wass ich hier falsch mach
1
 uint16_t adcval;
2
 volatile uint16_t ADC_wert;
3

4
ISR(ADC_vect)
5
{ 
6
 ADC_wert = ADCW;
7
} 
8

9
void ADC_Init(void)
10
{
11
  ADMUX = (0<<REFS1) | (1<<REFS0);
12
  ADCSRA =  (1<<ADEN) | (1<<ADSC) |(1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) |    (1<<ADPS0);     // Frequenzvorteiler auf 128
13
}
14

15
int main(void)
16
{  
17

18
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
19

20
  ADC_Init();
21

22
  sei();                                   //Globale Interrupts Freigeben
23

24
 for (;;)
25
 {   
26
  adcval = ADC_wert;
27
  
28
  uint8_t HighBytex = adcval >> 8;
29
  uint8_t LowBytex  = adcval;
30

31
  uart_putc(HighBytex); //High-Byte?
32
  uart_putc(LowBytex);   //Low-Byte 
33
 }
34
}
#2761220
Lesenswert?

Hi,

mit deinem Code wird genau eine Wandlung durchgeführt. Wenn die beendet 
ist, wird das ADSC-Bit in ADCSRA von der Hardware zurückgesetzt und es 
findet keine Wandlung mehr statt. Um mehr Wandlungen zu machen, musst du 
entweder nach jeder Wandlung das ADSC-Bit neu setzen oder du benutzt den 
Free-Running-Mode (ADFR in ADCSRA), dann wird kontinuierlich (unabhängig 
von ADSC) gewandelt.

Viele Grüße
Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren