;------------------------------------------------------------------------------------------------------------------------------------- ; Datum und Autor - So.28.06.2015 / Josh ;------------------------------------------------------------------------------------------------------------------------------------- ;------------------------------------------------------------------------------------------------------------------------------------- ; Definition des AVRs (In diesem Fall ist es ein ATMEGA8) ;------------------------------------------------------------------------------------------------------------------------------------- .nolist .include "m8def.inc" ; ATMEGA8 von Atmel .list ;------------------------------------------------------------------------------------------------------------------------------------- ; Definition der Ein-und Ausgänge an den verschiedenen Ports ;------------------------------------------------------------------------------------------------------------------------------------- ldi r16, 0b11111111 ; Alle Bits in Register 16 auf Hi setzen out DDRB, r16 ; Alle Pins am Port B als Ausgang konfiguriert ("0" bedeutet Eingang, "1" bedeutet Ausgang) ldi r16, 0b00000000 ; Alle Bits in Register 16 auf Low setzen out DDRD, r16 ; Alle Pins am Port D als Eingang konfiguriert ("0" bedeutet Eingang, "1" bedeutet Ausgang) ;------------------------------------------------------------------------------------------------------------------------------------- ; Taktfrequenz festlegen ;------------------------------------------------------------------------------------------------------------------------------------- .EQU fq = 4000000 ; Quazfrequenz wird festgelegt (Hier 4000000 Impulse pro Sekunde ;------------------------------------------------------------------------------------------------------------------------------------- ; PullUp-Widerstände aktivieren ;------------------------------------------------------------------------------------------------------------------------------------- ldi r16, 0b11111111 ; An allen Pins von Port D die Pullup-Widerstände aktivieren out PORTD, r16 ; Dies geht deshalb durch eine Ausgabe nach PORTD, da ja der PORT auf Eingang gestellt ist ;------------------------------------------------------------------------------------------------------------------------------------- ; Hauptprogramm - Aufbau es D-Flip-Flops. Taster drücken zum einschalten und den gleichen Taster drücken um wieder abzuschalten. ;-------------------------------------------------------------------------------------------------------------------------------------;------------------------------------------------------------------------------------------------------------------------------------- LEDaus: ldi r16, 0b11111111 ; Alle 8 BITS in R16 auf 1 setzen, "Hi" bedeutet LED aus, da "Low" benötigt wird. out PORTB, r16 ; Gib Inhalt von Register 16 an PortB aus. Alle LEDs sind aus ;------------------------------------------------------------------------------------------------------------------------------------- ; Es geht los. Taster 1 drücken um die LED 1 anzuschalten ;------------------------------------------------------------------------------------------------------------------------------------- Taster1An: sbic PIND, 0 ; Den nächsten Befehl überspringen, sofern der Taster 1 gedrückt ist rjmp Taster1An ; Taste war nicht gedrückt also zurück zu "Taster1" ;------------------------------------------------------------------------------------------------------------------------------------- ;Taster 1 wurde gedrückt, die erste LED am Ausgang (Port B) wird eingeschaltet ;------------------------------------------------------------------------------------------------------------------------------------- LEDan: ldi r16, 0b11111110 ; Setze das erste Bit im Register 16 auf Low out PORTB, r16 ; Gib Inhalt von Register 16 an PortB aus. Die erste LED leuchtet ;------------------------------------------------------------------------------------------------------------------------------------- ; Zeitverzögerung von 800 ms und abwarten der Low-Flanke von Taster 1 (delay loop generator) ;------------------------------------------------------------------------------------------------------------------------------------- Zeit: ; Warteschleifen-Generator - 400000 Zyklen. Warte 399999 Zyklen: ldi R17, $97 WGLOOP0: ldi R18, $06 WGLOOP1: ldi R19, $92 WGLOOP2: dec R19 brne WGLOOP2 dec R18 brne WGLOOP1 dec R17 brne WGLOOP0 ; warte 1 Zyklus: nop ;------------------------------------------------------------------------------------------------------------------------------------- ; Taste muss losgelassen werden ;------------------------------------------------------------------------------------------------------------------------------------- Taster1los: sbis PIND, 0 ; Den nächsten Befehl erst überspringen, wenn Taster 1 nicht mehr gedrückt ist rjmp Taster1los ; Taster ist noch gedrückt also zurück zu "Taster1los" ;------------------------------------------------------------------------------------------------------------------------------------- ; Taster 1 erneut drücken, um die LED wieder auszuschalten ;------------------------------------------------------------------------------------------------------------------------------------- Taster1Aus: sbic PIND, 0 ; Den nächsten Befehl überspringen, sofern der Taster 1 gedrückt ist rjmp Taster1Aus ; Ansonsten geht es zurück zu "LEDaus" ;------------------------------------------------------------------------------------------------------------------------------------- ; LED wird ausgeschaltet ;------------------------------------------------------------------------------------------------------------------------------------- LEDaus2: ldi r16, 0b11111111 ; Wieder alle 8 Bits in R16 auf 1 setzen um die LED auszuschalten out PORTB, r16 ; Gib Inhalt von Register 16 an PortB aus. Die LED erlischt wieder ;------------------------------------------------------------------------------------------------------------------------------------- ; Zeitverzögerung von 800 ms und abwarten der Low-Flanke von Taster 1 ;------------------------------------------------------------------------------------------------------------------------------------- Zeit2: ; Warteschleifen-Generator - 400000 Zyklen. Warte 399999 Zyklen: ldi R17, $97 WGLOOP01: ldi R18, $06 WGLOOP11: ldi R19, $92 WGLOOP21: dec R19 brne WGLOOP21 dec R18 brne WGLOOP11 dec R17 brne WGLOOP01 ; warte 1 Zyklus: nop ;------------------------------------------------------------------------------------------------------------------------------------- ; Taste muss erneut losgelassen werden ;------------------------------------------------------------------------------------------------------------------------------------- Taster1los2:sbis PIND, 0 ; Den nächsten Befehl erst überspringen, wenn Taster 1 nicht mehr gedrückt ist rjmp Taster1los2 ; Taster ist noch gedrückt also zurück zu "Taster2los" ;------------------------------------------------------------------------------------------------------------------------------------- ; Endlosschleife ;------------------------------------------------------------------------------------------------------------------------------------- Loop: rjmp Taster1An ; Sprung zurück zum Label "Taster1An"