Forum: Mikrocontroller und Digitale Elektronik UART Probleme beim Mega48


von Marco O. (xray272)


Lesenswert?

Mahlzeit


Ich habe folgendes Problem:

beim konfigurieren des Uarts beim atmega48 passieren merkwürdige dinge:
1
ldi    temp1,(1<<TXEN0)|(1<<RXEN0); // Sender und Empfänger an
2
sts    UCSR0B,temp1

klappt laut simulator
1
ldi    temp1,(1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N1
2
sts    UCSR0C,temp1

klappt nicht laut simulator schreibt er den inhalt von temp1 ins UBRR0H
Register (0xC5) anstatt ins UCSR0C (0xC2) !

In der m48def.inc steht alles so wie es sein soll ( UBRR0H=0xC5) und
( UCSR0C=0xC2 )

mir ist das aufgefallen weil kein einziges gesendetes zeichen vom 
atmega48 zum pc so ankamm wie ich es gesendet habe !

was läuft denn da schief ?

mfg marco

von Oliver J. (skriptkiddy)


Lesenswert?

Marco Oklitz schrieb:
> klappt nicht laut Simulator schreibt er den Inhalt von temp1 ins UBRR0H
> Register (0xC5) anstatt ins UCSR0C (0xC2) !
UBRRH und UCSRC haben bei einigen AVR, wie z.B. dem ATMEGA32, die selbe 
Adresse. Lediglich das 7. Bit entscheidet beim Schreiben, welches 
Register gemeint ist. Bei deinem AVR ist das allerdings nicht so. 
Eventuell stolpert der Simulator trotzdem darüber oder du hast den 
falschen AVR ausgewählt.


> mir ist das aufgefallen weil kein einziges gesendetes Zeichen vom
> atmega48 zum PC so ankam wie ich es gesendet habe !
- Zeig mal deinen Code (bitte komplett), sonst wird
  der Thread zum Ratespiel.
- Wie sind die Fuses im AVR eingestellt und was hängt
  für ein Quarz dran, sofern vorhanden.
- Welche Einstellungen hast du in der Terminalemulation
  deiner Wahl gemacht?
  (Baudrate, Stopbits, Datenbits ...)

Gruß Skriptkiddy

von spess53 (Gast)


Lesenswert?

Hi

Simulator Hilfe -> Known Issues:

When writing to UCSRC, the value will be copied to UBRRH unless bit 7 is 
also set in in the same write operation. This behaviour is erroneous on 
devices that have separate locations for these registers. Another 
workaround is to write UBRRH after UCSRC.

MfG Spess

von Marco O. (xray272)


Angehängte Dateien:

Lesenswert?

So hier ist alles :
1
.nolist
2
.include "m48def.inc"
3
.list
4
.equ XTAL = 8000000  ; Quartz Frequenz 8MHz
5
    ; ------
6
    ; RS232 Einstellungen
7
    ; ------
8
.equ BAUD  = 9600                               ; Baudrate
9
.equ UBRR_VAL   = ((XTAL+BAUD*8)/(BAUD*16)-1)    ; clever runden
10
.equ BAUD_REAL  = (XTAL/(16*(UBRR_VAL+1)))       ; Reale Baudrate
11
.equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
12
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
13
  .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
14
.endif
15
16
;------------------IMMEDIATE-------------------
17
.def temp1      = r16    ; Arbeitsregister 1
18
.def temp2      = r17    ; Arbeitsregister 2
19
.def temp3      = r18    ; Arbeitsregister 3
20
21
; ------
22
; Stackpointer einrichten
23
; ------
24
ldi   temp1, HIGH(RAMEND)       ; Oberes Byte von RAMEND
25
out   SPH,temp1             ; an Stapelzeiger
26
ldi   temp1, LOW(RAMEND)         ; Unteres Byte von RAMEND
27
out   SPL,temp1             ; an Stapelzeiger
28
29
ldi     temp1, HIGH(UBRR_VAL)
30
sts     UBRR0H, temp1
31
ldi     temp1, LOW(UBRR_VAL)
32
sts     UBRR0L, temp1
33
34
clr   temp1
35
ldi    temp1,(1<<TXEN0)|(1<<RXEN0); // Sender und Empfänger an
36
sts    UCSR0B,temp1
37
38
clr   temp1
39
ldi    temp1,(1<<UCSZ01)|(1<<UCSZ00); // Asynchron 8N1
40
sts    UCSR0C,temp1 
41
42
43
44
; ---------------------------------------------
45
; MAIN     Hauptprogramm
46
; ---------------------------------------------
47
main:
48
49
nop
50
nop
51
nop
52
53
ldi  temp1,'e'
54
rcall  ser_out
55
56
loop:
57
rjmp loop
58
59
rjmp main
60
61
ser_out:
62
lds    temp2,UCSR0A
63
sbrs    temp2,UDRE0                  ; Warten bis UDR für das nächste Byte bereit ist
64
rjmp    ser_out        ; Noch nicht bereit also zurück
65
sts     UDR0, temp1         ; schreibe Register serial_sign ins USART Daten Register
66
ret

Das sollte eigentlich nur n testprogramm zum ausprobieren des UARTS 
sein.
Und da nur murks gesendet worden ist:
laut Programm ein ASCII "e"   es kommt aber nur 0xFE am computer an.

wie gesagt ich hab den fehler so weit verfolgt bis die UART 
Controllregister beschrieben werden da werde ich nicht schlau draus.

anbei screenshots der fuses und des simulators vorher und nachher

mfg marco

von Marco O. (xray272)


Lesenswert?

spess53 schrieb:
> Hi
>
> Simulator Hilfe -> Known Issues:
>
> When writing to UCSRC, the value will be copied to UBRRH unless bit 7 is
> also set in in the same write operation. This behaviour is erroneous on
> devices that have separate locations for these registers. Another
> workaround is to write UBRRH after UCSRC.
>
> MfG Spess

mmmh ich hab das bei mir in der hilfe nicht gefunden aber danke !

macht das jetzt nur der simulator oder auch der atmega48 ??

von Marco O. (xray272)


Lesenswert?

Ja gut das hab ich jetzt gemacht:
das baudratenregister als letztes beschrieben, dann klappts inner 
simulation
aber nicht in der realität

ich benutzte puttytel mit COM1 (echte RS232) 9600 8N1 Einstellungen.
Ich hab mir sogar extra das HTerm hier ausm Forum runtergeladen um auch 
mal binär oder hex zu schauen was ankommt.

sende ich Dezimal 50 kommt Dezimal 250 am Rechner an
sende ich Dezimal 90 kommt Dezimal 254 am Rechner an

marco -----> am verzweifeln !!


mfg

von spess53 (Gast)


Lesenswert?

Hi

>macht das jetzt nur der simulator oder auch der atmega48 ??

Nur der Simulator.

MfG Spess

von Marco O. (xray272)


Lesenswert?

Also ich hab mal weiter Fehler gesucht und fand folgendes:

Wenn ich die Baudrate am PC auf 19k2 stelle kommen die Daten alle
sauber an !!

Das bedeutet der atmega48 verhält sich so als ob das U2X0 Bit gesetzt
wäre ! ist es aber nicht !

von Marco O. (xray272)


Lesenswert?

ooh  ups was macht eigentlich n AVR wenn er auf int.8MHZ gefused ist 
aber an den XTAL Anschlüssen n Quartz hängt ?

von Oliver J. (skriptkiddy)


Lesenswert?

Marco Oklitz schrieb:
> ooh  ups was macht eigentlich n AVR wenn er auf int.8MHZ gefused ist
> aber an den XTAL Anschlüssen n Quartz hängt ?
Ist ihm egal.

von Marco O. (xray272)


Lesenswert?

Ok Fehler gefunden !

lag an der falschen einstellung zur takterzeugung.
wie man im screenshot sehen kann war der mega48 nicht auf intern sondern 
extern gefused und da hing n 16mhz quartz dran.
abgelenkt hatte mich aber bei der fehlersuche

> When writing to UCSRC, the value will be copied to UBRRH unless bit 7 is
> also set in in the same write operation. This behaviour is erroneous on
> devices that have separate locations for these registers. Another
> workaround is to write UBRRH after UCSRC.

danke spess ^^

von Oliver J. (skriptkiddy)


Lesenswert?

Marco Oklitz schrieb:
> danke spess ^^
Und mir wird nicht gedankt? Sowas aber auch. :)

von spess53 (Gast)


Lesenswert?

Hi

>Und mir wird nicht gedankt? Sowas aber auch. :)

Kannst eine von meinen beiden Danksagungen abhaben.

MfG Spess

von Oliver J. (skriptkiddy)


Lesenswert?

spess53 schrieb:
> Kannst eine von meinen beiden Danksagungen abhaben.
>
> MfG Spess
Danke dir spess. Mein Tag ist gerettet.

;D

Gruß Skriptkiddy

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.