Hallo
hier mein c Code
Die LED geht aller exakt aller 1 s an und aus.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | // TIMER
|
5 | int k = 0;
|
6 |
|
7 | ISR(TIMER0_COMP_vect)
|
8 | {
|
9 | k++; if (k==5000) {k = 0; PORTB ^= (1<<PB0); } // zustandswechsel PB1 und PB0
|
10 |
|
11 | } // Ende ISR
|
12 |
|
13 | int main()
|
14 | {
|
15 | // Timer 0
|
16 | TCCR0 = (1<<WGM01); // CTC Modus
|
17 | TCCR0 |= (1<<CS01); // Prescaler 8 !!!!!!!!!!
|
18 |
|
19 | OCR0 = 199; // 8000000/8/200 entspricht 5000HZ also 0,2 ms ,damit ergibi sich k=
|
20 | // 1000 ms / 0,2 ms = 5000, das ist k in ISR
|
21 |
|
22 | // Compare Interrupt erlauben
|
23 | TIMSK |= (1<<OCIE0);
|
24 |
|
25 | // Global Interrupts aktivieren
|
26 | sei();
|
27 |
|
28 | DDRB |= (1 << PB0); // damit ist dann PB0 ein Ausgang
|
29 |
|
30 | while(1){
|
31 | } // Ende while
|
32 | return 0;
|
33 |
|
34 | } //Ende main
|
Ich hatte die Hoffnung,dass es mit Luna einfacher wird. Der Timer ohne
Compare läst sich einfach in Luna programmieren auch die Port
Ansteuerung für die LED ist übersichtlich. Hier mein erster Luna Code.
1 | avr.device = atmega32 'Controller-Typ festlegen
|
2 | avr.clock = 8000000 'Dem Compiler mitteilen mit welcher Taktrate der Controller läuft
|
3 | avr.stack = 64 'Den Programmstack einstellen
|
4 |
|
5 | #define LED1 as PortB.0
|
6 |
|
7 | dim k as integer
|
8 |
|
9 | 'Die beiden Port-Pins (LED1+2) als Ausgang konfigurieren
|
10 |
|
11 | LED1.mode = output 'Der Compiler ersetzt hier das "LED1" durch "PortD.0"
|
12 |
|
13 | Timer0.Isr = meineServiceRoutine ' Serviceroutine zuweisen
|
14 | Timer0.clock = 8' Prescaler einstellen
|
15 | Timer0.Enable ' Timer einschalten
|
16 |
|
17 | Avr.Interrupts.Enable ' Globale Interrupts einschalten
|
18 |
|
19 | do
|
20 | loop
|
21 |
|
22 | Isr meineServiceRoutine
|
23 |
|
24 | K=k+1
|
25 | when K=3000 do LED1.toggle
|
26 | when k=3000 do K=1
|
27 |
|
28 | EndIsr
|
Super wäre es gebe eine Lösung in dieser Art für Compare Match. Einfach
den Timer in dieser Art einstellen, mit
# http://avr.myluna.de/doku.php?id=de:timer0
Compare Match
Name Beschreibung Wert/Typ
.CmpA.Isr CompareA-Serviceroutine definieren Isr-Name
.CmpA.Mode Aktion bei erfolgreichem CompareA an Pin „OC0A“ nothing,
toggle, clear, set
.CmpA.Enable CompareA ISR aktivieren - -
.CmpA.Disable CompareA ISR deaktivieren - -
.CmpA.Clear.Enable Automatisches Nullsetzen des Zählers bei Gleichheit
ein - -
.CmpA.Clear.Disable Automatisches Nullsetzen des Zählers bei Gleichheit
aus - -
.CmpA.Value CompareA-Zählerwert des Timers auslesen oder setzen (OCR0A)
Ich schaffe es mit dem Atmega32 micht, der hat keinen Compare A und B,
sondern nur einen Compare am Timer0. siehe C Code. Wenn ich das A weg
lasse in Luna kommt eine Fehlermeldung oder bei anderen Versuchen geht
Compare nicht ,der Timer zählt einfach hoch bis zum Ende und macht bei
199 keine ISR. Vielleicht gibt es eine einfache Lösung in dieser
Richtung.
Grüße Holger