UART_mit_2313.asm


1
.include "2313def.inc"
2
3
.def temp = R16
4
5
        ldi R16, RAMEND
6
        out SPL, R16                      ; Stackpointer initialisieren
7
8
        sbi UCR,TXEN                    ; UART TX aktivieren
9
        ldi temp,25  ;4000000/(9600*16)-1      ; Baudrate 9600 einstellen
10
        out UBRR,temp
11
12
start:
13
        ldi ZL, LOW(text*2)               ; Adresse des Strings in den
14
        ldi ZH, HIGH(text*2)              ; Z-Pointer laden
15
        rcall print                       ; Unterfunktion print aufrufen
16
17
        ldi R16, 10                       ; die Bytes 10 und 13 senden
18
        rcall sendbyte                    ; (Zeilenumbruch im Terminal)
19
        ldi R16, 13
20
        rcall sendbyte
21
22
        rjmp start                        ; das Ganze wiederholen
23
24
25
; print: sendet die durch den Z-Pointer adressierte Zeichenkette
26
print:
27
        lpm                               ; Erstes Byte des Strings nach R0 lesen
28
        tst R0                            ; R0 auf 0 testen
29
        breq print_end                    ; wenn 0, dann zu print_end
30
        mov r16, r0                       ; Inhalt von R0 nach R16 kopieren
31
        rcall sendbyte                    ; UART-Sendefunktion aufrufen
32
        adiw ZL, 1                        ; Adresse des Z-Pointers um 1 erhöhen
33
        rjmp print                        ; wieder zum Anfang springen
34
print_end:
35
        ret
36
37
; sendbyte: sendet das Byte aus R16 über das UART
38
sendbyte:
39
        sbis USR, UDRE                  ; warten bis das UART bereit ist
40
        rjmp sendbyte
41
        out UDR, R16
42
        ret
43
44
text:
45
.db "AVR-Assembler ist ganz einfach",0    ; Stringkonstante, durch eine 0 abgeschlossen