Forum: Mikrocontroller und Digitale Elektronik Luna und Timer0 Compare mit Atmega32


von Holger W. (mb_holger)


Lesenswert?

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

von Holger W. (mb_holger)


Lesenswert?

Ich habe das Problem gelöst, mit einen Tipp von Uwe.
hier der richtige LunaAVR Code falls es jemanden interessiert.
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
LED1.mode = output  
7
8
Avr.Interrupts.Enable // Globale Interrupts einschalten
9
Timer0.Cmp.Isr = meineServiceRoutine // Serviceroutine zuweisen
10
timer0.pwm.mode = 2
11
avr.ocr0 = 199
12
Timer0.Cmp.Enable // Timer einschalten
13
Timer0.clock = 8 // Prescaler einstellen
14
15
dim k as integer
16
k=0
17
18
do
19
loop
20
21
Isr meineServiceRoutine
22
K=k+1
23
when K=5000 do LED1.toggle
24
when k=5000 do k=0
25
26
EndIsr

Holger

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.