; ; Testet die Serielle Schnittstelle ; ; Empfängt auf der SIO-Schnittstelle mit 9k6 8N1 Zeichen und ; sendet die Hex-Werte dieser Zeichen zurück. ; ; Hardware: Verbindung zwischen Schnittstellen ; Ansteuerung: Terminalprogramm, z.B. HyperTerminal (siehe Anleitung) ; .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; ; Konstanten ; .EQU fq=4000000 ; Quarzfrequenz .EQU baud=9600 ; Baudrate .EQU bdteiler=(fq/(16*baud))-1 ; Baud-Teiler .EQU RamStart = 0x0060 ; ; Register ; .DEF mpr=R16 ; Universalregister .DEF cc=R17 ; Zeichenkopie .DEF h=R18 ; Hilfsregister ; ; XL/XH = R26/R27 werden als Pointer in das SRAM verwendet ; YL/YH = R28/R29 werden als Pointer in das SRAM verwendet ; ; Programmcode beginnt hier ; .CSEG ; ; Reset-/Interrupt-Vektoren ; rjmp main ; Reset-Vektor ; main: ldi XH,HIGH(RamStart) ldi XL,LOW(RamStart) ldi YH,HIGH(RamStart) ldi YL,LOW(RamStart) ldi mpr,0x0D ; Neue Zeile beginnen st X+,mpr ; im SRAM ablegen und Pointer erhöhen ldi mpr,0x0A ; Linefeed dazu st X+,mpr ldi mpr,bdteiler ; Baudgenerator out UBRR,mpr ; Teiler setzen ldi mpr,0b00011000 ; Enable TX und RX out UCR,mpr ; an UART Control Register ; ; Hauptprogrammschleife fragt SIO-Schnittstelle ab und sendet die im SRAM ; gespeicherten Zeichen aus ; tloop: sbic USR,RXC ; Springe, wenn das Empfangsregister leer ist rjmp rx ; Empfange nächstes Zeichen sbic USR,UDRE ; Springe, wenn das Senderegister nicht verfügbar ist rjmp tx ; Sende nächstes Zeichen rjmp tloop ; Alles wieder von vorne ; ; Empfange ein Zeichen und speichere es im SRAM ; rx: ldi mpr,' ' ; Sende ein Leerzeichen als Trennzeichen st X+,mpr ; Speichern im SRAM und Eingabeadresse in X erhöhen in mpr,UDR ; Hole Zeichen von der SIO-Schnittstelle ab mov cc,mpr ; Lege Kopie an swap mpr ; Oberes und unteres Nibble vertauschen andi mpr,0x0F ; Oberes Nibble löschen cpi mpr,10 ; Nibble > 9? brcs rx1 ; Nein ldi h,7 ; Addiere 7 für hex A bis F add mpr,h rx1: ldi h,'0' ; von 0 nach '0' add mpr,h st X+,mpr ; und in das SRAM legen andi cc,0x0F ; Unteres Nibble gleich behandeln cpi cc,10 brcs rx2 ldi h,7 add cc,h rx2: ldi h,'0' add cc,h st X+,cc ldi cc,'h' ; hex-Kennzeichnung mitsenden st X+,cc ; auch ins SRAM ablegen rjmp tloop ; wieder zurück zur Hauptprogrammschleife ; ; Sende Zeichen aus dem SRAM-Puffer, wenn welche dort liegen ; tx: cp XL,YL ; Zu sendende Zeichen im Puffer vorhanden? breq tx1 ; Keine Zeichen zu senden ld mpr,Y+ ; Hole Zeichen aus dem SRAM und erhöhe Y-Pointer out UDR,mpr ; Zeichen an Senderegister übergeben rjmp tloop ; und wieder zurück in die Hauptprogrammschleife tx1: ldi XH,HIGH(RamStart) ; Setze Pointer wieder an den Anfang des SRAM ldi XL,LOW(RamStart) ldi YH,HIGH(RamStart) ldi YL,LOW(RamStart) rjmp tloop ; und zurück in die Hauptprogrammschleife ; ; Code Ende ;