Pfad: Home =>
AVR-Übersicht =>
Hardware => SIO-hex
Assembler-Quellcode für
das Testen der Seriellen Schnittstelle
;
; 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 "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
;
©2002 by http://www.avr-asm-tutorial.net