Forum: Mikrocontroller und Digitale Elektronik tiny26 timer interrupt schaltet port nur bis "reti"


von Kurt S. (ksch)


Lesenswert?

Hallo zusammen

Ich habe folgendes Problem bei dem ich nicht mehr weiterkommen, nicht 
mal einen Ansatz finde...
Ich habe einen ATtiny26 auf dem ich den Timer0 oder 1 (mit beiden schon 
getestet) benutze, als Testfall soll nur eine Led ein bzw. ausgeschaltet 
werden. Nun ist es aber so, dass der Port jeweils nur bis zum "reti" des 
isr umschaltet und danach in den alten Zustand zurück fällt. Hab ich mit 
einem Oszilloskop angeschaut.

Das gleich funktioniert aber beim Mega8 problemlos.

Hier noch das geschriebene, erwartet aber nicht zu viel, versuche mich 
noch nicht so lange darin.
1
.include "tn26def.inc"
2
3
.def temp1=r16
4
5
.org 0x0000
6
    rjmp main
7
8
.org OVF0addr
9
    rjmp tc0ovf
10
11
main:
12
    ldi temp1,RAMEND    ;Stackpointer initialisieren
13
    out SP,temp1
14
15
    ;;; PORTA als Ausgang
16
    ldi temp1, 0xFF
17
    out DDRB, temp1
18
    out PORTB, temp1
19
20
    ldi temp1, (1 << CS00) | (0 << CS01) | (1 << CS02) ;Vorteiler von 1024
21
    out TCCR0, temp1
22
23
    ldi temp1, (1 << TOIE1)
24
    out TIMSK, temp1
25
26
    sei
27
28
loop:
29
    rjmp loop
30
31
;;;
32
;;; Overflow Timer 0
33
tc0ovf:
34
    push temp1
35
    in temp1, sreg
36
37
    sbic PORTB,0
38
    rjmp clr_bit
39
    sbis PORTB,0
40
    rjmp set_bit
41
42
set_bit:
43
    sbi PORTB,0
44
    rjmp end_tc0_isr
45
clr_bit:
46
    cbi PORTB,0
47
48
end_tc0_isr:
49
    out sreg, temp1
50
    pop temp1
51
    reti

Neben hoffentlich nicht zu vielen anderen Fehlern, sieht jemand an was 
dieses zurückfallen des PortB, gleich nach "reti", liegt? Oder überseh 
ich etwas das beim Attiny26 vollkommen anders funktioniert als beim 
Mega8?

Bin für jede Hilfestellung dankbar.
beste grüsse
kurt

von Gastofatz (Gast)


Lesenswert?

>sbic PORTB,0
>rjmp clr_bit
>sbis PORTB,0
>rjmp set_bit

Sollte besser so aussehen:

sbic PORTB,0
rjmp clr_bit
rjmp set_bit

von Kurt S. (ksch)


Lesenswert?

Hallo

Danke, hab ich gar nicht überlegt...
Aber wäre dann nicht gleich besser ich würds so machen?
1
    sbic PORTB,0
2
    rjmp clr_bit
3
    sbi PORTB,0
4
    rjmp end_tc0_isr
5
clr_bit:
6
    cbi PORTB,0
7
    rjmp end_tc0_isr

gruss
kurt

von Gastofatz (Gast)


Lesenswert?

Funzt natürlich auch und wär noch kürzer. Allerdings ist das alles 
bestimtm nicht die Ursache für Dein Problem, wozu mir im Moment leider 
auch nix einfällt.

von Gastofatz (Gast)


Lesenswert?

Hast Du es schon mal via Simulator vom AVRStudio gecheckt?

von Kurt S. (ksch)


Lesenswert?

ja, du hast recht. Die erste Diskussion ändert sicher nichts an meinem 
Problem, aber ich lerne wieder was dabei :-)

Im Simulator hab ich das getestet und dort scheint es auch zu 
funktionieren.

von Gastofatz (Gast)


Lesenswert?

Hm, mysteriös. Kannst Du vielleicht das fragliche Signal vom Oszi 
abfotografieren und hier reinstellen?

von MWS (Gast)


Lesenswert?

Du setzt Timer0 OVF ISR auf, erlaubst aber Timer1 OVF ISR:
1
  ldi temp1, (1 << TOIE1)

Bitteschön :D

von Kurt S. (ksch)


Lesenswert?

Guten morgen zusammen

Ich sehs nicht mehr, ich hab die Aenderungen wie Gastofatz sie 
vorgeschlagen hat heute morgen kurz umgesetzt, was allerdings nichts mit 
dem eigentlichen Problem auf sich hat. Danach neu geschrieben und jetzt 
reagiert auch der Tiny26 richtig.
Ich kann den Fehler aber auch nicht mehr reproduzieren...
Hab jetzt das ganze wieder mit Timer1 gemacht und dann CTC hinzugefügt 
und das geht jetzt auch... ich weiss nicht was ich davon halten soll.

Das nächste mal fotographiere ich das Oszi bevor ich wieder was 
verändere...

@MWS Yep... das ist richtig, war allerdings nur ein Fehler hier.

danke für die Hilfe und gruss
kurt

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.