PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ich wieder: 16bit Timer1 will nich (Mega128)



BlackDevil
21.11.2008, 14:12
Servus

Ich wieder 8-[ Folgende Aufgabe gilt es zu lösen (ist gelöst, ich such nur den Fehler :D): Die LEDs solen Binär zählen und zwar per 10bit geteiltem 16bit Timer1, Zeit einstellbar (0...255 entsprechen dann 2,22 bis 5,xms). Geschrieben haben wir folgenden Code



.nolist ; include-file nicht in Listing
.include "m128def.inc" ; Definitionen für ATmega 128 einbinden


.list ; Listing erstellen


.def akku = r16 ; r16 als Rechenregister "akku" definieren
.def msTimer = r23 ; r23 als Zeit-Einstellungsregister
; r24 als Zählregister
.def templ = r17 ; Zwischenspeicher 1
.def temp2 = r18 ; Zwischenspeicher 2
.def PulsCounter = r19
.equ key_pin = PINA ; Tasterpins
.equ key_port = PORTA ; Datenregister (Taster)
.equ key_ddr = DDRA ; Datenrichtungsregister (Taster)

.equ led_port = PORTB ; Datenregister (LED)
.equ led_pin = PINB
.equ led_ddr = DDRB ; Datenrichtungsregister (LED)


.cseg

;-------Adress Tabelle für Interrupt-Vektoren-----------------------------

.org 0x0000 ; Interrupt-Vektor für RESET
rjmp Init

.org 0x0002 ; Interrupt-Vektor für externen Interrupt 1
rjmp Extint1

.org 0x0018 ; Interrupt-Vektor für Timer/Counter-0-Interrupt
rjmp TC1int

.org 0x0045 ; Ende der Interrupt-Vektor-Tabelle

;-------Macros-------------------------------------------------------------
; Pin Toggeln
.macro TogPin
SBIS @0,@1 ; Wenn Bit (@1) in I/O-Reg. (@2) gesetzt, überspringe nächsten Befehl
rjmp SetPin
ClrPin:
cbi @0,@1
rjmp TogPinx
SetPin:
SBI @0,@1
TogPinx:
.endmacro
;--------------------------------------------------------------------------

Init: ; Beginn des Hauptprogrammes

ldi r16,LOW(RAMEND) ; Stack Initialisieren
out SPL,r16
ldi r16,HIGH(RAMEND)
out SPH,r16

ser akku ; Alle Bits in Akku setzen
out DDRB,akku ; PORTB als Ausgang (alle Bits 1)

ldi msTimer,0x99
out OCR1AL,msTimer

ldi templ,0
out OCR1AH,templ

ldi templ,0x0
out TCNT1L,templ

ldi templ,0x0
out TCNT1H,templ

ldi akku,0b00011000
out TIMSK,akku

ldi akku,0b00000100
out TCCR1B,akku ; Übertrage auf Timer Counter Control Register


ldi PulsCounter,255




Prog:

in templ,TIFR
SBRC templ,4
rcall Count
rjmp Prog


;-------Unterprogramme----------------------------------------------------
Extint1: ; ISR für externen Interrupt 1

reti

Count:
TogPin led_port,0

ret

TC1int: ; ISR für Timer/Counter 1 Interrupt

reti
.exit


Der tuts aber nicht! Wenn ich den Makro Aufruf statt in Count in TC1int schreibe funktioniert alles Tadellos, die LED wird umgeschaltet.. .Ich gehe damit davon aus das der Timer sowie die einstellung von OCR funktionieren.

Wenn ich den eigentlichen Zähl Code


dec PulsCounter
out led_port,PulsCounter


irgendwohin, also entweder in Count, die Programmschleife selbst (das Dekrementieren dann hinter den SBRC Befehl) oder in den Interrupt selbst packe funktioniert es auch nicht.
Die LED sind Low Aktiv.

Die überprüfung des Bits im TIFR Register hat der ING genauso in der Musterlösung, bei ihm soll es funktionieren (ebenfalls Mega128).

Weder der LaborING noch mein Laborpartner noch ich wissen was wirklih los ist ...


Findet jemand den Fehler? :-s


Grüße

bax
21.11.2008, 14:44
Ohne mich genauer mit Deinem Programm zu befassen denke ich, das das Problem darin besteht, das Du die ISR im TIMSK freigegeben hast, darum springt er die ISR ja auch an. Dabei wird aber (hardwareseitig) das Interuptflag zurückgesetzt.

Wenn Du es per polling auswerten willst mußt Du es über eine Hilfsvariable in der ISR lösen bzw die ISR ganz deaktivieren. Dann mußt Du aber daran denken, das Interupt-Flag per Software zurücksetzen.

Rajko

BlackDevil
21.11.2008, 14:53
Die Globalen Interrupts sind aber Deaktiviert, ergo sollte er da nicht reinspringen. Abgesehen davon läuft ein anderes Programm in der die Globalen Interrupts Aktiviert sind ebenfalls über Polling... Das komplette entfernen der Sprungadresse + Unterprogramm half übrigens auch nicht.

bax
21.11.2008, 15:05
Dann musst Du aber daran denken, das Interupt-Flag per Software zurücksetzen.

Rajko

BlackDevil
21.11.2008, 15:16
Warum tuts das aber beim 8bit Timer von alleine trotz aktiviertem sei und angegebener Routine und beim 16bit Timer nicht?