so nach laengerer Zeit nun endlich das Programm mit Timer0
Nur das Problem mit der 2.Tasten, wenn eine vorher "gedrueckte" noch gesetzt ist bzw. nicht losgelassen wurde.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
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.







Zitieren

Lesezeichen