; Würfel mit ATtiny2313 ; Quelle MCT S436 für ATtiny12 ; mit Sonderfunktion 1..6 und 1..7 ; PortB PB0 bis PB3 LED-Ausgabe ; PB4 Tasteneingabe ; Gespeichert in ATtiny2313 Bez.:K3 ; 08.03.2009 KW .INCLUDE "2313def.inc" .EQU TAKT = 1000000 .DEF akku = r16 .DEF zaehl = r17 .DEF anz = r18 .CSEG rjmp start .ORG $10 start: ldi akku,LOW(RAMEND) out SPL,akku ldi akku,0b00001111 out DDRB,akku ; Taste bei start nicht gedrückt Endwert = 6 ; Taste bei start gedrückt Endwert = 7 ldi anz,6 sbis PINB,PB4 ldi anz,7 ; Lampentest alle LEDs 500ms anschalten mov zaehl,anz ldi ZL,LOW(tab*2) ldi ZH,HIGH(tab*2) ldi akku,50 haupt1: lpm adiw ZL,1 com r0 out PORTB,r0 rcall wartex10ms dec zaehl brne haupt1 ldi akku,$ff out PORTB,akku ; Anfangswerte der Würfelschleife laden haupt2: mov zaehl,anz ; kopiert anz in zaehl ldi ZL,LOW(tab*2) ; lädt NWB von tab in Z ldi ZH,HIGH(tab*2) ; lädt HWB von tab in Z ; Würfelschleife mit Tastenkontrolle haupt3: sbis PINB,PINB4 ; ist Pin4=1 -> PC+2 rjmp haupt4 ; Sprung zu haupt4 adiw ZL,1 ; erhöht tab-Adresse um 1 dec zaehl ; dec zaehl breq haupt2 ; wenn zaehl=0 -> haupt2 nop nop rjmp haupt3 ; Fallende Flanke Augen anzeigen ; drücken haupt4: lpm ; ro <- Inhalt von Z-Adr tab com r0 ; Compliment weil LOW-aktiv out PORTB,r0 ; Ausgabe der Augen ldi akku,1 ; Pause 20 ms rcall wartex10ms ; Pause ; Steigende Flanke ; loslassen haupt5: sbis PINB,PINB4 ; Pin4 von PORTB lesen rjmp haupt5 ; wdh. solange noch 0 ldi akku,100 ; 500 ms anzeigen rcall wartex10ms ; warte 500 ms = Entprellung ldi akku,$ff ; Ausgänge auf high out PORTB,akku ; alle LEDs aus rjmp haupt2 ; Sprung zu haupt2 ; ; Unterprogramm für wartex10ms wartex10ms: tst r16 breq wartex10msc push r16 push XL push XH wartex10msa: ldi XL,LOW(TAKT/400) ;bei Simulation 20 ldi XH,HIGH(TAKT/400) ;bei Simulation 20 wartex10msb: sbiw XL,1 brne wartex10msb dec r16 brne wartex10msa pop XH pop XL pop r16 wartex10msc: ret ; Tabelle für Ausgabenmuster tab: .DB $01, $02, $03, $06, $07, $0e, $0f, 0 ; Erkennung text: .DB "-KLAUS-WUERFEL1-", 0 ; Ende .EXIT