hallo mare_crisium,
klar doch wollte eh das Programm abaendern, dass jeder Taster verwendet werden kann. Somit muss ich mich um ein anderes entprellen kuemmern.
Aber eine Schaltung habe ich noch zwischenzeitlich gemacht.
Angelehnt an das Hundegeschirr von unseren Berner.
hier dieser Code:
Als naechstes wird das generelle entprelle in Angriff genommenCode:;***** STK500 Lernprogramm Nr.3 ;*** Aufgabe: alle LEDs mit einem Taster auf dem STK500 schalten ;*** 1. Tastendruck: LEDs einschalten ;*** 2. Tastendruck: LEDs blinken ;*** 3. Tastendruck: LEDs ausschalten ;*** zum Entprellen soll ein Interrupt(Int0) benutzt werden ;*** .include "m8515def.inc" .def Temp = r16 ; Temporary register .def Tast_Stat = r17 ; Zaehler fuer Taste .def Delay = R18 ; Wartezeit .def Delay2 = R19 ; Wartezeit ;***** ;Reset and Interrupt vector ;VNr. Beschreibung rjmp RESET ;1 POWER ON RESET rjmp INT0_ISR ;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 reti ;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 r16, LOW(RAMEND) ;Stack initialisieren out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ldi temp, (1<<ISC00)|(1<<ISC01)|(1<<SE) out MCUCR, temp ;Interrupt INT0 und Sleep enable konfiguriert ldi temp, 1 << INTF0 ;InterruptFlagregister geloescht out GIFR, temp ldi temp, 1 << INT0 ;Interrupt INT0 aktiviert out GICR, temp clr Temp ;Temp mit 0b00000000 bzw. 0x00 laden out DDRD, Temp ;PORTD als Eingang ser Temp ;Temp mit 0b11111111 bzw. 0xFF laden out PORTD, temp ;PullUp an PortD einschalten out DDRB,Temp ;PORTB als Ausgang out PORTB, temp ;PORTB (LEDs) aus sei ;Interrupts zulassen MAIN: rcall TESTE rjmp MAIN TESTE: clr temp ;loesche temp inc temp ;increment von temp - "1" cp Tast_Stat,temp ;ist TastStat = 1 dann Rufe Sub LED_AN auf, sonst ueberspringe naechsten Befehl breq LED_AN inc temp ;increment von temp - "2" cp Tast_Stat,temp ;ist TastStat = 2 dann Rufe Sub LED_BLINK auf, sonst ueberspringe naechsten Befehl breq LED_BLINK inc temp ;increment von temp - "3" cp Tast_Stat,temp ;ist TastStat = 3 dann Rufe Sub LED_AUS auf, sonst ueberspringe naechsten Befehl breq LED_AUS sleep ret LED_AN: ;loesche temp clr temp ;setze alle Bit in temp (0b00000000 bzw. 0x00) out PORTB, temp ;Ausgabe an PortB sleep ret LED_BLINK: in temp,PORTB ;lese PORTB in temp com temp ;Einercomplement von temp (ist 0b00000000 > 0b11111111 oder umgekehrt) out PORTB,temp ;Ausgabe an PortB Tot_Zeit: dec Delay ;zaehle ein Register R18 - 0b0000000 runter und springe danach aus der Schleife brne Tot_Zeit dec Delay2 ;zaehle ein Register R19 - 0b0000000 runter und springe danach aus der Schleife brne Tot_Zeit ret LED_AUS: ser temp ;setze alle Bits in temp (0b11111111 bzw. 0xFF) out PORTB,temp ;Ausgabe an PORTB clr Tast_Stat ;Loesche Tast_Stat sleep ret INT0_ISR: ldi Delay, 0b00000001 ;Ruecksprung aus LED_BLINK beschleunigen ldi Delay2, 0b00000001 ;Ruecksprung aus LED_BLINK beschleunigen push R16 ;Inhalt von R16 auf Stack ablegen in R16, SREG ;Statusregister in R16 lesen push R16 ;Inhalt von R16(SREG) auf den Stack ablegen inc Tast_Stat pop R16 ;Ruecksichern von R16(SREG) out SREG, R16 ;Ruecksichern von SREG pop R16 ;Ruecksichern von R16 reti![]()







Zitieren

Lesezeichen