Datum:
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
uint16_t adcval; volatile uint16_t ADC_wert; ISR(ADC_vect) { ADC_wert = ADCW; } void ADC_Init(void) { ADMUX = (0<<REFS1) | (1<<REFS0); ADCSRA = (1<<ADEN) | (1<<ADSC) |(1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler auf 128 } int main(void) { uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); ADC_Init(); sei(); //Globale Interrupts Freigeben for (;;) { adcval = ADC_wert; uint8_t HighBytex = adcval >> 8; uint8_t LowBytex = adcval; uart_putc(HighBytex); //High-Byte? uart_putc(LowBytex); //Low-Byte } } |
Datum:
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
Datum:
Hallo Bertram M. Dein Hauptprogramm kommuniziert nicht mit der ADC ISR Routine - wann weiß es also, wann ein neuer Messwert vorliegt ? Stichwort: Boolesche Variable , Trigger , volatile