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