Forum: Mikrocontroller und Digitale Elektronik Befehl CLI wird nicht ausgeführt


von F. T. (acerpower)


Lesenswert?

Hallo,
dieses triviale Programm führt den CLI-Befehl nicht aus. Warum?

Im Timer0-Interrupt wird nach ca. 10s die LED am Port B0 eingeschalten 
und nach 2s wieder aus. Danach sollen alle Interrupts gesperrt werden.
Aber die LED blinkt munter im 2s-Intervall weiter.

Vielleicht erkennt jemand den Fehler

Hier das Programm:

1
.include "tn13Adef.inc"
2
 
3
.def temp1     = r16         ; allgemeines temp Register, zur kurzfristigen Verwendung
4
5
6
    ; Interuptvektoren ATiny13
7
    rjmp Main         ; Reset, Sprung zum Hauptprogramm
8
    reti              ; INT0, External Interupt
9
    reti              ; PCINT0, Pin Change Interrupt
10
    rjmp timer0_ovf   ; TIM0_OVF, Timer/Counter Overflow
11
    reti              ; EE_RDY, EEPROM Ready
12
    reti              ; ANA_COMP, Analog Comparator
13
    reti              ; TIM0_COMPA, Timer/Counter Compare Match A
14
    reti              ; TIM0_COMPB, Timer/Counter Compare Match B
15
    reti              ; WDT, Watchdog Time-out
16
    reti              ; ADC, ADC Conversion Complete
17
18
 
19
    ; hier beginnt das Hauptprogramm
20
Main:
21
    sbi    PortB, 0
22
23
    ; Stackpointer initialisieren
24
    ldi    temp1, LOW(RAMEND)                  
25
    out    SPL, temp1
26
    
27
    sbi    DDRB,0  ; Port B0 = Ausgang
28
            
29
    clr    temp1
30
      
31
    ldi    temp1, (1<<CS02) | (1<<CS00) ; CS00 und CS02 setzen: Teiler 1024
32
    out    TCCR0B, temp1
33
 
34
    ldi    temp1, (1<<TOIE0)    ; TOIE0: Interrupt bei Timer Overflow
35
    out    TIMSK0, temp1
36
      
37
    ldi    temp1,12
38
    sei               ; alle Interrupts freigeben
39
    
40
loop:   rjmp    loop
41
    
42
    ;--- Timer 0 Interrupt-Routine ---
43
44
timer0_ovf:
45
    dec    temp1
46
    brne   T0Ret
47
    
48
    sbic   PortB, 0      ; Überspringe den nächsten Befehl, wenn das Bit 0 im Port gelöscht ist
49
    rjmp   ClrBitNow      ; Springe zu ClrBitNow   
50
    sbi    PortB, 0      ; Setze Bit 0 in PortB
51
    rjmp   T0L1          ; Springe 
52
53
ClrBitNow:
54
    cbi    PortB, 0      ; Lösche Bit 0 in PortB
55
    cli
56
        
57
T0L1:  ldi    temp1,2
58
59
T0Ret:  reti

von reit (Gast)


Lesenswert?


von spess53 (Gast)


Lesenswert?

Hi

>dieses triviale Programm führt den CLI-Befehl nicht aus. Warum?

Das 'cli' wird ausgeführt. Aber 'reti' setzt das I-Flag wieder.

Deaktiviere einfach TOIE0 in TIMSK.

Allerdings wird dein Programm bald verrückt spielen. Interrupts ohne 
Sicherung von SREG sind tödlich.

MfG Spess

von F. T. (acerpower)


Lesenswert?

Gelöst mit deaktivieren des TOIE0.

Besten Dank!

von Uwe (Gast)


Lesenswert?

solange er in seiner Main bzw. im loop keine Statusflags überprüft und 
den Programmfluß ändert braucht er die Flags auch nicht zu sichern. 
Seine einziger bedingter Spring der von den Statusflags abhängig ist, 
ist in dem Interupthandler. Aber ich glaube er wird darüber noch 
stolpern denn er hat nur gesagt er hätte das Problem mit der 
Deaktivierung des TOIE0 Interupts gelöst. Hihihi ;) mal sehen wann er 
wieder schreibt das sein Programm komische sachen macht !

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.