#include "tn13def.inc" ; Standard Fuses ; 4 Tasten und Led's an Port B1 bis B4 (Low-Aktiv) ; 1 Piezo Lautsprecher an Port B0 .org 0x000 rjmp reset ; Reset .org 0x002 wdr reti ; Pin-Change Interrupt ;================================================================================================== ; Hauptprogramm ;================================================================================================== ; r19 = Startwert Zufallszahlengenerator ; r20 = aktuelle Zufallszahl 8 bit ; r21 = aktuelle Zufallszahl 2 bit ; r22 = Länge der Melodie ; r23 = Aktueller Ton innerhalb der Melodie (countdown) ; Level 1 = 1-3 Töne ; Level 2 = 4-7 Töne ; Level 3 = 8-15 Töne ; Level 4 = 16-19 Töne ; usw. reset: ; Das Spiel endet rcall watchdog_off ; Watchdog aus schalten rcall io_init ; I/O Pins konfigurieren rcall takt_38khz ; Taktfrequenz herabsetzen rcall ton_falsch ; Erzeuge negativ-ton rcall schlafe ; Schlafen start: ; Das Spiel beginnt rcall watchdog_on ; Watchdog an rcall random_init ; Zufallszahlen-Generator initialisieren ldi r22,2 ; Fange mit 2 Tönen an vorgabe: rcall pause_800ms mov r20,r19 ; Beginne Zufallszahlenkette mit dem init-Wert mov r23,r22 ; Zähle die Töne in r23 (countdown) vg1: rcall random ; Erzeuge Zufallszahl rcall led_x ; Schalte passende Led an rcall ton_x ; Erzeuge passenden Ton rcall pause_200ms ; Pause rcall led_aus ; Led wieder aus rcall pause_200ms ; Pause rcall ton_aus ; Ton wieder aus dec r23 ; Noch ein Ton, falls Countdown>0 brne vg1 nachspielen: mov r20,r19 ; Beginne Zufallszahlenkette mit dem init-Wert mov r23,r22 ; Zähle die Töne in r23 (countdown) ns1: rcall random ; Erzeuge Zufallszahl rcall warte_taste ; Warte auf eine Taste cpse r16,r21 ; Ist die Taste richtig? rjmp reset ; Nein -> Ende richtig: rcall ton_x ; Erzeuge passenden Ton rcall pause_200ms ; Pause rcall ton_aus ; Ton wieder aus rcall warte_keinetaste ; Warte, bis alle Tasten losgelassen dec r23 ; Noch ein Ton, falls Countdown>0 brne ns1 next_level: rcall pause_200ms mov r18,r22 ; Länge durch 4 teilen, um den Level zu berechnen lsr r18 lsr r18 inc r18 nl1: rcall ton_richtig ; Bestätigungston mehrmals entsprechend dem Level abspielen rcall pause_200ms dec r18 brne nl1 inc r22 ; Schwierigkeitsgrad um 1 erhöhen rjmp vorgabe ;================================================================================================== ; Prozeduren ;================================================================================================== io_init: ; I/O Pins konfigurieren ldi r16,0b00011110 ; Pull-Up an allen Tasten einschalten out portb,r16 sbi ddrb,0 ; Lautsprecher-Pin ist ein Ausgang sbi acsr,acd ; Analog Comparator aus schalten ldi r16,(1<