so nach laengerer Zeit nun endlich das Programm mit Timer0
Code:
;***** STK500 Lernprogramm Nr.4c
;*** Aufgabe: die der jeweiligen Taste zugeordnete LED auf dem STK500 schalten
;*** 1. Tastendruck: LEDs einschalten
;*** 2. Tastendruck: LEDs ausschalten
;*** zum Entprellen soll kein Interrupt werden
;***
.include "m8515def.inc"
.def Temp = r16 ; Temporary Register
.def Tast_Stat0 = r17 ; Tasten Status
.def Tast_Stat = r18
.def LED_Stat = r19 ; LED Status
.def Tast_Sperre = r0
.def Aus = r20
;
; TimerWerte(bei 1MHz - ca. 0,1sec/Takt)
;.equ Timerwert = -50 ; Timerschritte bis zum Überlauf(fuer Simulatortest)
.equ Timerwert = 61 ; Timerschritte bis zum Überlauf
.def tsw = r5 ; Timer Startwert (Reload)
;
;
.equ LED_PORT = PORTB ; LEDs
.equ LED_DDR = PORTB-1 ; DataDirectory fuer LEDs
.equ TAST_PORT= PORTD ; Tasten
.equ TAST_DDR = PORTD-1 ; DataDirectory fuer TastenEingang
.equ TAST_PIN = PORTD-2 ; TastenEingang
;
;*****
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp RESET ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC1 Capture
reti ;5 TC1 Compare Match A TC2 Overflow
reti ;6 TC1 Compare Match B TC1 Capture
reti ;7 TC1 Overflow TC1 Compare Match A
rjmp TIMER0_OVF ;8 TC0 Overflow TC1 Compare Match B
reti ;9 SPI, STC Serial Transfer Complete TC1 Overflow
reti ;10 UART Rx Complete TC0 Overflow
reti ;11 UART Data Register Empty SPI, STC Serial Transfer Complete
reti ;12 UART Tx Complete UART Rx Complete
reti ;13 Analog Comparator
reti ;14 Int2-Interrupt
reti ;15 Timer 0 Compare Match
reti ;16 EEPROM Ready
reti ;17 Store Program Memory Ready
;*****
RESET:
ldi temp,Timerwert
mov tsw,temp
out TCNT0,tsw
; ldi temp,(1<<CS00) ; Taktfrequenz ohne Vorteiler gewaehlt (fuer Simaulatortest)
ldi temp,(1<<CS00)|(1<<CS02) ; Taktfrequenz mit Vorteiler 1024 gewaehlt
out TCCR0,temp
ldi temp,(1<<TOIE0) ; Timer0 Overflow aktivieren
out TIMSK,temp
ldi r16, LOW(RAMEND) ;Stack initialisieren
out SPL, r16
ldi r16, HIGH(RAMEND)
out SPH, r16
clr Temp ;Temp mit 0b00000000 bzw. 0x00 laden
out TAST_DDR, Temp ;PORTD als Eingang
mov Tast_Sperre, temp
ser Temp ;Temp mit 0b11111111 bzw. 0xFF laden
out TAST_PIN, temp ;STK500 schaltet gegen GND - Taste gedreuckt (Pin==0)
out TAST_PORT, temp ;PullUp an PortD einschalten
out LED_DDR,Temp ;PORTB als Ausgang
out LED_PORT, temp ;PORTB (LEDs) aus
clr Tast_Stat ;Tast_Stat auf def. Zustand
clr Aus
sei ; globale Interruptfreigabe
MAIN:
rcall TASTEN_TEST
rjmp MAIN
TIMER0_OVF:
push TEMP ; TEMP auf Stack sichern
in TEMP,SREG ; SREG auf Stack sichern
push TEMP ;
in Tast_Stat0, TAST_PIN
com Tast_Stat0 ; invertiere
out TCNT0,TSW ; Timer0-Startwert setzen
pop TEMP ;
out SREG,TEMP ; SREG zurueckschreiben
pop TEMP ; TEMP zurueckschreiben
reti
TASTEN_TEST:
mov Tast_Stat, Tast_Stat0
cp Tast_Stat, Aus ; Vergleich - (0b11111111->keine Taste)
brne LED_TOGGLE ; bei != rufe LED_TOGGLE auf
ret
LED_TOGGLE: ; schaltet LED um
in LED_Stat, LED_PORT ; lese LEDs aus und speichere in LED_Stat
com LED_Stat ; invertiere
eor Tast_Stat, Tast_Sperre ; gedrueckt gehaltene Taste sperren
; LED=1 Tast=1 == LED=0
; LED=0 Tast=0 == LED=0
; LED=0 Tast=1 == LED=1
; LED=1 Tast=0 == LED=1
eor LED_Stat, Tast_Stat ; ExclusivODER - schalte die Ausgaenge , wo Tasten gedrueckt werden um
com LED_Stat ; invertiere
out LED_PORT, LED_Stat ; Ausgabe an LEDs
in Tast_Stat0, TAST_PIN ; Wiedereinlesen fuer Tastensperre
com Tast_Stat0 ; invertiere
mov Tast_Sperre, Tast_Stat0
ret
Nur das Problem mit der 2.Tasten, wenn eine vorher "gedrueckte" noch gesetzt ist bzw. nicht losgelassen wurde.
Das will ich noch aendern. - Es soll auch eine 2. oder 3. Eingabe moeglich sein, wenn die 1. oder 2. nicht zurueck gesetzt wurde bzw. die Tasten noch immer gedrueckt sind.
Lesezeichen