Forum: Mikrocontroller und Digitale Elektronik ATmega328P UART in Assembler


von Holger (Gast)


Lesenswert?

Moin,

aus dem Turorial habe ich den nachfolgenden Quellcode weitestgehend 
übernommen und für den ATmega328P angepasst. Aber es kommt absolut 
nichts raus. Ich verwende einen USB-RS232-Adapter. Wenn ich das RX und 
TX verbinde, und mittels HTERM etwas ausgebe, dann erscheint es im RX 
Fenster. Also der Adapter geht und richtig verkabelt ist auch alles 
korrekt. Wo mag der Fehler liegen?


Holger



1
;
2
; ATmega328_Hardware_UART.asm
3
;
4
; Created: 07.11.2015 16:23:15
5
; Author : Holger
6
;
7
8
.include "m328Pdef.inc"
9
10
.DEF temp = r16
11
12
 
13
.equ F_CPU = 10000000
14
15
.equ BAUD  = 9600                               ;Baudrate
16
 
17
; Berechnungen
18
.equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ;clever runden
19
.equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))     ;Reale Baudrate
20
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ;Fehler in Promille
21
 
22
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ;max. +/-10 Promille Fehler
23
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
24
.endif
25
 
26
.org 0x000
27
     rjmp    start
28
   
29
30
start:
31
    ;Stackpointer initialisieren 
32
    ldi     temp, HIGH(RAMEND)
33
    out     SPH, temp
34
    ldi     temp, LOW(RAMEND)
35
    out     SPL, temp
36
 
37
    ;Baudrate einstellen
38
    ldi     temp, HIGH(UBRR_VAL)
39
    sts     UBRR0H, temp
40
    ldi     temp, LOW(UBRR_VAL)
41
    sts     UBRR0L, temp
42
 
43
    ;Frame-Format: 8 Bit
44
    ldi     temp, (1<<USBS0)|(3<<UCSZ00)
45
    sts     UCSR0C, temp
46
 
47
    ldi     temp, (1<<TXEN0)        ;TX aktivieren
48
  sts     UCSR0B, temp
49
 
50
loop:
51
    ldi     zl,low(my_string*2);            ;Z Pointer laden
52
    ldi     zh,high(my_string*2);
53
    rcall   serout_string
54
    rjmp    loop
55
 
56
;Ausgabe eines Strings aus dem Flash
57
 
58
serout_string:
59
    lpm                    ;nächstes Byte aus dem Flash laden
60
    and     r0,r0              ;= Null? 
61
    breq    serout_string_ende        ;wenn ja, -> Ende
62
serout_string_wait:
63
  lds    temp, UCSR0A          ;Warten bis UDRE0 für das nächste
64
                      ;Byte bereit ist
65
  sbrs  temp, UDRE0  
66
            
67
    rjmp    serout_string_wait
68
    out     UDRE0, r0
69
    adiw    zl:zh,1              ;Zeiger erhöhen
70
    rjmp    serout_string          ;nächstes Zeichen bearbeiten
71
serout_string_ende:
72
    ret                    ;zurück zum Hauptprogramm
73
 
74
; Hier wird jetzt der String definiert und im Flash gespeichert
75
 
76
my_string:  .db "Test!",10,13,0

von spess53 (Gast)


Lesenswert?

Hi

>Wo mag der Fehler liegen?

Bei 1MHz Takt hast du bei 9600Bd schon 7% Fehler. Mit internem 
RC-Oszillator kann es noch mehr werden. Gehe mal auf 4800Bd runter.

MfG Spess

von holger (Gast)


Lesenswert?

out     UDRE0, r0

Es gibt kein Register mit diesem Namen;)

von holger (Gast)


Lesenswert?

>Bei 1MHz Takt hast

>.equ F_CPU = 10000000

Ich sehe 10MHz.

von Holger (Gast)


Lesenswert?

holger schrieb:
> Es gibt kein Register mit diesem Namen;)

Danke!!! Es sind übrigens 10 MHz.



Holger

von J. P. (Gast)


Lesenswert?

Wenn das ein echter USB-RS232-Adapter ist, wird es in nahezu allen 
Fällen sowieso nicht funktionieren, weil die Pegel nicht zueinander 
passen. Bei den USB-RS232-Adaptern ist meist ein FT232R und ein MAX232 
verbaut:
(USB) |--[FT232R]---[MAX232]--| (D-Sub DE-9)
wobei zwischen FT232R und MAX232 5-V-Pegel vorliegen, an der D-Sub DE-9 
aber die für diese Adapter typischen Werte über und unter der 
Signalmasse.

Entweder man nimmt einen weiteren MAX232 um wieder auf 5-V-Logikpegel zu 
kommen, oder man weicht auf einen USB-UART-Adapter aus, bei dem kein 
MAX232 nachgeschaltet ist und die 5-V-Pegel des FT232R direkt zugänglich 
sind.

von Pastor Braune (Gast)


Lesenswert?

"out" durch "sts" ersetzen da extended I/O

von Pastor Braune (Gast)


Lesenswert?

out     UDRE0, r0  --> sts UDR0,r0  ; UDRE0 ist ein Bit im reg. UCSR0A
                                      UDR0 ist das Datenregister

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.