So habs jetzt hingekriegt! Das habe ich verändert:
- cnt global initialisiert
- alles auf timer 0 angepasst
- inerruptvektor 0 auf 1 geändert
- Die interrupt service routine dirkekt mit dem overflow-flag gestartet
- anstatt das ganze INTR-enable-register zu löschen nur noch direkt das
interrupt flag 1 gelöscht:
- und für die leserlichkeit die initialisierung in ein UP gepackt
hier der neue code:
1 | #include <reg517.h>
|
2 |
|
3 | int cnt; // definition cnt als globale variable
|
4 |
|
5 | void init (void)
|
6 | {
|
7 | cnt=0; // Counter auf 0 setzen
|
8 | TR0=0; // Timer gestoppt
|
9 | TMOD=TMOD&0xFD; // Timer auf 16-Bit modus einstellen
|
10 | TH0=0x3C; // Timer High-Bit laden
|
11 | TL0=0xAF; // Timer Low-Bit laden
|
12 | TF0=0; // Timer overflow Flag loeschen
|
13 | ET1=0; // Interrupt löschen
|
14 | P5=0x00; // LED Port loeschen
|
15 | ET0=1; // Interrupt freigeben
|
16 | EAL=1; // Alle Interrupts freigeben
|
17 | TR0=1; // Timer starten
|
18 | }
|
19 |
|
20 | void ISR (void) interrupt 1 // Interrupt Service Routine
|
21 | {
|
22 | TF0=0;
|
23 | TR0=0; // Timer stoppen
|
24 | EAL=0; // Alle Interrupts werden gesperrt
|
25 | ET1=0; // Interrupt loeschen
|
26 | TH0=0x3C; // Timer High-Bit laden für 25ms
|
27 | TL0=0xAF; // Timer Low-Bit laden für 25ms
|
28 | cnt++; // Counter erhöhen
|
29 | if (cnt>=39)
|
30 | {
|
31 | P5=~P5; // LED Port invertieren
|
32 | cnt=0; // Counter zurücksetzen
|
33 | }
|
34 | ET0=1; // Interrupt zulsassen
|
35 | EAL=1; // Alle Interrupts freigeben
|
36 | TR0=1; // Timer starten
|
37 | }
|
38 |
|
39 |
|
40 |
|
41 | void main (void) // Hauptprogramm
|
42 | {
|
43 | init();
|
44 | while(1) // Endlosschleife
|
45 | {}
|
46 | }
|
ein grosses dankeschön an stefan für die tolle hilfe =D
Gruss Marco