; Test 2: Board kennenlernen: Eingabe von einem Port ; Was man hier dazu lernen kann: ; - Eingabe von einem Port lesen ; - Das Aufrufen von Unterprogrammen, Stack- (Stapel-Befehle) ; - Binäre Rechen Operationen (AND, OR, ROL, etc.) ; - Bedingte Verzweigungen (SBIx, BRxx) .NOLIST .INCLUDE "8515def.inc" .LIST ; Ein Universalregister definieren: .DEF temp = R16 .DEF SR_Backup = R0 .DEF zaehler = R17 .DEF output = R2 ; Der Rest-Sprungbefehl an Adresse 0: rjmp main ; Interrupt-Vektoren, fast alle blindgesetzt ausser dem Timer-Overflow ; RETI ist Rückkehr vom Interrupt mit Wiederherstellung des Interrupt- ; Flags im Status-Register. Wichtig: Sprung zur Interrupt-Service- ; Routine tc0i muss an der Adresse 0007 stehen. ; Mechanismus des Interrupts: Ist der Timer von 255 auf Null überge- ; laufen, dann wird das Programm unterbrochen, der Programmzähler auf ; dem Stapel abgelegt, der Befehl an der Adresse 0007 ausgeführt. Nach ; Beendigung des Interrupts wird der Programmzähler wieder hergestellt ; und mit dem unterbrochenen Programm fortgefahren. ; Die Interrupt-Vektoren zu je 1 Byte: reti ; Int0-Interrupt reti ; Int1-Interrupt reti ; TC1-Capture reti ; TC1-Compare A reti ; TC1-Compare B reti ; TC1-Overflow rjmp timerEvent ; Timer/Counter 0 Overflow, mein Sprung-Vektor reti ; Serial Transfer complete reti ; UART Rx complete reti ; UART Data register empty reti ; UART Tx complete reti ; Analog Comparator ; Hier beginnt das Hauptprogramm main: ;Stackpointer initialisieren ldi temp,LOW(RAMEND) ;Initiate Stackpointer out SPL,temp ldi temp,HIGH(RAMEND) out SPH,temp ;Clear output clr output ;********TIMER initilaisieren******* ldi temp,0x00 mov zaehler,temp ; Vorteiler des Zählers = 256, 1 MHz/1024 = 976 Hz ; => 5 sek = 19 Durchläufe ldi temp,0x05 ;Initiate Timer/Counter 0 Vorteiler out TCCR0,temp ; an Timer 0 Control Register ldi temp,$02 ; Bit 1 setzen out TIMSK,temp ; in Timer Interupt Mask Register ; Alle Interrupts allgemein freigeben sei ; Gib Interrupts im Status-Register frei ;*******Timer läuft****************** loop: ;schon 19 Durchlaeufe? cpi zaehler,19 breq incoutput rjmp loop incoutput: inc output clr zaehler rjmp loop ; Interrupt-Service-Routine für den Zähler timerEvent: in SR_Backup,SREG ; Rette den Inhalt des Flag-Registers inc zaehler ; Erhöhe Software-Zähler mit Bit 8-15 out SREG,SR_Backup ; Stelle Flag-Register wieder her reti ; Kehre vom Interrupt zurück