UART Probleme beim Mega48

OP #2312182
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
#2312230
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
Gast #2312243
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
OP #2312247
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
Angehängte Dateien:
OP #2312255
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 ??
OP #2312266
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
OP #2312502
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 ^^

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren