Hallo, Ich möchte eine PWM erzeugen. Am Ausgang OCA1 ist eine LED angeschlossen. Der AD-Wandler ADC0 soll im 10-Bit Modus laufen. Die Interrupt Routine wird nicht angesprungen. Ich finde den Fehler nicht. Wenn mir jemand helfen könnte dem wäre ich dankbar.
1 | #define F_CPU 160000000
|
2 | #include <avr/io.h> |
3 | #include <stdint.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | |
7 | volatile uint16_t buffer; |
8 | volatile int8_t flag; |
9 | |
10 | ISR(TIMER1_COMPA_vect) |
11 | {
|
12 | //Hilfsport setzen
|
13 | PORTD |= 1<<PD0; |
14 | |
15 | // Wandlung vom analogen Eingang starten
|
16 | ADCSRA |= (1<<ADSC); |
17 | |
18 | // Warten bis die AD-Wandlung abgeschloßen ist
|
19 | while ( !(ADCSRA & (1<<ADIF)) ); |
20 | |
21 | //Hilfsport zurücksetzen
|
22 | // PORTD &= ~(1 << PD0);
|
23 | PORTD = 0; |
24 | |
25 | buffer = ADC; |
26 | OCR1A=buffer * 4; |
27 | }
|
28 | |
29 | |
30 | |
31 | int main() |
32 | {
|
33 | //Alle Interrupts ausschalten
|
34 | cli(); |
35 | |
36 | //Hilfsport als Ausgang definieren und zuruecksetzen
|
37 | DDRD = DDRB | (1 << PD0); |
38 | PORTD = 0; |
39 | |
40 | |
41 | // Timer für PWM initialisieren
|
42 | // OC1A auf Ausgang
|
43 | DDRB = (1 << PB1 ); |
44 | TCCR1A = (1<<COM1A1); |
45 | TCCR1B = (1<<WGM13) | (1<<CS10); |
46 | |
47 | // PWM Frequenz auf 2000 Hz stellen bei 16 Mhz Oscillator
|
48 | ICR1 = 4000; |
49 | |
50 | //Timer Interrupt initialisieren und globale Interrupts enable
|
51 | TIMSK = TIMSK | (1 << OCIE1A); |
52 | sei(); |
53 | |
54 | // AD-Wandler initialisieren und auf 10 Bit stellen
|
55 | ADMUX = (1<<REFS0); |
56 | ADCSRA = (1<<ADEN); |
57 | |
58 | //Startwert für PWM festlegen
|
59 | OCR1A = 1000; |
60 | |
61 | while( 1 ) |
62 | {
|
63 | //Hauptschleife
|
64 | }
|
65 | }
|
Gruss Michael