Hallo, ich versuche gerade den ADC des ATMEGA644 mit Interrupts in Betrieb zu nehmen. Dazu habe ich mich bei der Initialisierung an dem Tutorial hier im Forum orientiert. Mein Problem ist, dass der Interrupt nie auftritt. Hier mal mein Code:
1 | void AD_init(void) |
2 | {
|
3 | int first_result = 0; |
4 | |
5 | DIDR0 = (1<<ADC1D); //Abschalten der Digitalstufe für ADC1 |
6 | |
7 | ADMUX = (1<<REFS0); //Einschalten der Referenzspannung: Vref = AVCC |
8 | ADMUX |=(MUX1); //Waehlen des ADC1 |
9 | |
10 | ADCSRA = (1<<ADEN) | (1<<ADIE); // ADC aktivieren und Interrupt einschalten |
11 | ADCSRA |= (ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Prescaler 128 |
12 | |
13 | |
14 | _delay_ms(1); |
15 | |
16 | ADCSRA |= (1<<ADSC); //Starten der Messung |
17 | |
18 | while (ADCSRA & (1<<ADSC)) |
19 | {
|
20 | |
21 | }
|
22 | |
23 | first_result = (ADCL + (ADCH<<8)); |
24 | |
25 | }
|
26 | |
27 | |
28 | ISR(ADC_vect) |
29 | {
|
30 | PORTD ^=(1<<PD6); |
31 | adc_result = (ADCL + (ADCH<<8)); |
32 | next = 1; |
33 | }
|
34 | |
35 | |
36 | int main(void) |
37 | {
|
38 | |
39 | avr_init(); |
40 | UART_Init(); |
41 | _delay_ms(500); |
42 | |
43 | sei(); |
44 | |
45 | while(1) |
46 | {
|
47 | |
48 | if (next == 1) |
49 | {
|
50 | ADC_value = calculate_adc(adc_result); |
51 | |
52 | dtostrf(ADC_value, 5, 3, buffer_adc); |
53 | uart_puts("Read Voltage: "); |
54 | Send_UART_Char(buffer_adc); |
55 | |
56 | start_converting(); |
57 | next = 0; |
58 | |
59 | }
|
60 | |
61 | _delay_ms(1000); |
62 | |
63 | |
64 | |
65 | }
|
66 | }
|
Gruß