Pfad: Home => AVR-Übersicht => Hardware => SIO

; Testet die Serielle Schnittstelle

;
; Sendet auf der Schnittstelle mit 9k6 8N1 einen
; Text und echot dann eingehende Zeichen zurück.
;

; Hardware: Verbindung zwischen Schnittstellen

; Win-Ansteuerung: mit 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
;

; Register

;
.DEF   mpr=R16 ; Universalregister
.DEF   nc=R17 ; Zähler
.DEF   c=R18 ; Zeichen
;

;Reset-/Interrupt-Vektoren

   RJMP   main
;
main:   LDI   mpr,bdteiler ; Baudgenerator
   OUT   UBRR,mpr ; Teiler setzen
   LDI   mpr,0b00011000 ; Enable TX und RX
   OUT   UCR,mpr ; an UART Control Register
;

; Sende alle Grossbuchstaben

;
   LDI   c,'A' ; erster Buchstabe
   LDI   nc,90-65+1 ; Anzahl Buchstaben
tloop:   SBIS   USR,UDRE ; Springe, wenn Senderegister leer
   RJMP   tloop ; Warte noch ein Weilchen
   OUT   UDR,c ; Buchstabe an Senderegister übergeben
   INC   c ; nächster Buchstabe
   DEC   nc ; Zähler Anzahl Buchstaben zu senden abwärts
   BRNE   tloop ; nächster Buchstabe
;

; Warte bis Zeichen empfangen, Echo zurück, für immer

;
rloop:   SBIS   USR,RXC ; Teste RXC-bit auf vorliegendes Zeichen
   RJMP   rloop ; Kein Zeichen vorhanden, warte
   IN   c,UDR ; Hole Zeichen vom UART ab
rwait:   SBIS   USR,UDRE ; Warte bis Sender bereit
   RJMP   rwait ; Sender noch nicht frei
   OUT   UDR,c ; Sende Zeichen aus
   CPI   c,0x0D ; Return-Zeichen?
   BRNE   rloop ; Kein Return, einfach weiter
   LDI   c,0x0A ; Lade Linefeed
   RJMP   rwait ; Sende noch Linefeed hinterher
   


©2002 by http://www.avr-asm-tutorial.net