Hallo Leute, bin noch totaller C-Anfänger, bräucht ma Hilfe, hab leider nix passendes im Forum gefunden was mir geholfen hatt. Ich möcht den Timer0 als Software PWM für die LCD-Beleuchtung benutzen. Folgendes Problem liegt vor: ISR von Timer0 wird ausgeführt, aba beim Rücksprung wird jedesmal zu "int main" zurückgesprungen. Muss ich ich in der ISR noch irgendwas sichern? Wär echt dankbar, wenn mir jemmand helfen könnt, komm leider allein garnet weiter.
1 | #include <avr/io.h> |
2 | #include "lcd-routines.h" |
3 | #include <util/delay.h> |
4 | #include <avr/interrupt.h> |
5 | |
6 | |
7 | |
8 | volatile uint8_t LCD_PWM; |
9 | |
10 | |
11 | int main(void){ |
12 | |
13 | //Timer0 Prescaler einstellen, Interrupt ein
|
14 | TCCR0 |= (1<<CS00)|(1<<CS02); |
15 | TIMSK |= (1<<TOIE0 | 1<<OCIE0); |
16 | |
17 | //Interrupt allgemein ein
|
18 | sei(); |
19 | //LCD initialisieren
|
20 | lcd_init(); |
21 | |
22 | //LCD-Hintergrundbeleuchtung auf ausgang
|
23 | DDRA |= (1<<6); |
24 | |
25 | |
26 | |
27 | while(1){ |
28 | |
29 | lcd_clear(); |
30 | |
31 | set_cursor(0,0); |
32 | |
33 | lcd_string("Hello World"); |
34 | |
35 | _delay_ms(200); |
36 | |
37 | |
38 | }
|
39 | |
40 | }
|
41 | |
42 | |
43 | |
44 | ISR(TIMER0_OVF_vect) |
45 | {
|
46 | uint8_t tmp_sreg; |
47 | tmp_sreg = SREG; |
48 | LCD_PWM++; |
49 | if(LCD_PWM =0){PORTA |= (1<<PORTA6);} |
50 | if(LCD_PWM =20){PORTA &= ~(1<<PORTA6);} |
51 | SREG = tmp_sreg; |
52 | }
|