BlackDevil
21.11.2008, 15: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
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