Hallo Leute,
ich hänge mit den Tiny13 auf dem Schlauch...und habe schon das Datenblatt studiert.
Anfangsteile vom Quelltext und Aufruf der ISR am Ende:
.INCLUDE "tn13def.inc" ; Deklarationen für Tiny13
.EQU takt = 1000000 ; Systemtakt 1 MHz
#define test PINB,PB3
#define sw1 PINB,PB4
#define sw2 PINB,PB1
#define sw3 PINB,PB2
rjmp start ; Reset-Einsprung
.ORG OVF0addr ; Interupt-Vektoren
rjmp TIM0_OVF ; Sprung zur ISR
start: ldi r16,LOW(RAMEND) ; Stapel anlegen
out SPL,r16
ldi r16,0x01 ; Bitmuster 0000 0001
out DDRB,r16 ; PortB (PB0 ist Ausgang)
ldi r16,0b00011110 ; PB1-PB4 = PULLUP
out PORTB,r16
;Interrupt-ISR
TIM0_OVF: push r16
in r16,SREG
dec r17
pop r16
out SREG,r16
reti
Der Compiler vom Studio4 gibt Fehlermeldung "TIM0_OVF" undefiniertes Symbol.
Beim Tiny2313 läuft das anstandslos...ich weiß nicht mehr weiter.
Auch wenn ich in der loop-Schleife "rcall zeit4" eingebe, und die Routiene mit ret beende,
kommt die Fehlermeld. zeit4 undef. Symbol
Grüße
Rolf
Sorry, hab den Fehler gefunden!
Vor der ISR und den Aufrufen der Zeiten stand ein ".EXIT", und das hat mich 4 Stunden gekostet.
Ein langsamer Ausgang . . . *ggg*. Aber besser ein .exit in der Software als der .exitus des Controllers.Zitat von hegewald
Ciao sagt der JoeamBerg
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Nein, nur vertauscht, richtig wär's so:
Der Originalcode:Code:TIM0_OVF: push r16 in r16,SREG dec r17 out SREG,r16 pop r16 reti
stellt dagegen SREG mit einem Wert wieder her, den R16 beim Aufruf des Interrupts hatte, was für kreatives Verhalten des Codes sorgt.Code:pop r16 out SREG,r16
Hallo Macig,
den Cod
TIM0_OVF:
push r16
in r16,SREG
dec r17
out SREG,r16
pop r16
reti
hatten mir die Provis vom www.mikrocontroller.net vorgegeben, und daran habe ich mich dann gehalten.
SREG ist doch ein Register (Bit7=I) =sei, wenn gesetzt, läuft der Overflow ständig.
Was mich nun beschäftigt, die Zeiten von 20 | 30 | 40 Minuten zu realisieren...das wird noch an Zeit kosten.
Toleranzen sehe ich mit +/- 5%
Grüße
Rolf
Hallo Hegewald,
Dieser Code jetzt entspricht dem von mir berichtigten.
Vergleich' dazu Dein Post Nr. 6 dieses Threads:Nur darum ging's, das ist falsch.Code:;Interrupt-ISR TIM0_OVF: push r16 in r16,SREG dec r17 pop r16 out SREG,r16 reti
Betrachte genau wo R16 gepoppt wird und wo in's SREG heschrieben wird.
Hallo Macig,
hast Recht, hier war ein Dreher, in meinen Quelltext habe ich es nochmal kontrolliert.
Habe mich mit den PUSH / POP nochmal über Bücher informiert.
Danach würde doch der Ablauf so aussehen:
push r16 ; push kopiert den Inhalt von r16 auf die durch den Stapelzeiger SP adressierte SRAM Speicherstelle
; und vermindert den SP um 1
Nun steht hier weiter für den Mega8:
Der Stapelzeiger (das ist doch eine Adresse im SRAM-Bereich,oder?) wird sofort nach dem Start des Programms
auf die höchste SRAM Adresse gesetzt. In der Deklarationsdatei m8def.inc vordefiniert auf Adresse RAMEND=$045F.
Wie das beim Tiny13 aussieht, kann ich nicht erkennen, oder Datenblatt ranholen.
pop r16 ; pop erhöht erst den Stapelzeiger SP um 1 und lädt dann r16 mit dem adressierten SRAM-Byte
Interessant ist auch, daß die Befehle rcall / icall / call und Inter. die aus 2 Bytes besteh. Rücksprungadresse
auf den Stapel legen, und automatisch durch ret bzw. iret wieder entfernt werden.
Wie gesagt, man schreibt im Quelltext notorisch so viele Befehlsabläufe und wies eigentlich garnicht, was da so
richtig passiert. Alles ist natürlich auch eine Zeitfrage um sich mit der Materie zu beschäftigen.
Ich als Rentner habe die Zeit, und der Geist bleibt dadurch in Bewegung.
Das wars erst mal, hoffentlich langweilt Dich dieses Thema nicht.
Grüße
Rolf
Lesezeichen