Forum: Mikrocontroller und Digitale Elektronik Atmega48 & UART


von Tom M. (dertom)


Lesenswert?

Hallo.
Das TerminalProgramm zeigt immer nur das gleiche Zeichen.
Mein Programm:

.include <m48def.inc>

.equ  XTAL= 10000000
.equ  Baud= 9600

; Berechnungen
.equ UBRR_VAL   = ((XTAL+baud*8)/(BAUD*16)-1)   ; berechnet die Baudrate
;.equ UBRR_VAL = xtal/(baud*16)-1
.equ BAUD_REAL  = (XTAL/(16*(UBRR_VAL+1)))      ; und den Fehler
.equ BAUD_ERROR = ((BAUD_REAL*1000)/baud-1000)  ;
.if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ;
  .error "Fehler der Baudrate > 1%!"
.endif

.def  i    = r16
.def  s    = r17
.def  l    = r18

.def  zahl  = r19

.def  temp1  = r23
.def  temp2  = r24
.def  temp3  = r25


init:
  ldi    i, LOW(RAMEND)
  out    SPL, i
  ldi    i, HIGH(RAMEND)
  out   SPH, i

  ;ldi    i, 0x0c
  ;out    DDRD, i    ; Ein- & Ausgänge PORTD festlegen
  ;ldi    i, 0x10
  ;out    PORTD, i  ; Pullup einschalten

  ldi    i, LOW(UBRR_VAL)  ; eintragen
  sts    UBRR0L, i
  ldi    i, HIGH(UBRR_VAL)  ; Übertragungsrate ins
  sts    UBRR0H, i      ; entsprechende Register

  ldi    i, (1<<USBS0) | (3<<UCSZ00)  ; 8bit Mode
  sts    UCSR0C, i

  lds    i, UCSR0B
  ldi    i, (1<<TXEN0);  senden aktivieren
  sts    UCSR0B, i

loop:
  ldi    i, 'A'
  rcall  sertrans
  ldi    i, '7'
  rcall  sertrans
  ldi    i, 'c'
  ;rcall  sertrans
  ldi    i, 'h'
  ;rcall  sertrans
  ldi    i, '!'
  ;rcall  sertrans
  ldi    i, 10
  ;rcall  sertrans
  ldi    i, 13
  ;rcall  sertrans
  rcall  delay5ms
  rjmp  loop
sertrans:
  lds    s, UCSR0A
  sbrs  s, UDRE0  ; kiecken ob noch übertragen wird
  rjmp  sertrans

  sts   UDR0, i
  ret


delay5ms:

  push  i
  push  s      ; i & s auf dem stack sichern

  ldi    i, 65    ; 65 Durchläufe für 5ms
 delay50ms0:
   ldi    s, 0xff
 delay50ms1:
   dec    s
  brne  delay50ms1

  dec    i
  brne  delay50ms0

  pop   s
  pop    i

  ret

Die Fusebits sind korrekt gesetzt (CKSEL0111), hab schon verschiedene 
Quarze probiert und das Signal am 9pol Stecker sieht auch sauber aus und 
ändert wenn ick verschiedene Zeichen sende. Hab keine Ahnung wo die Säge 
klemmt.
Kann mir jemand sagen, weswegen Hyperterm nur Kästchen zeigt und HTerm 
nur 0x00 & 0x80 empfängt?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Versuch mal TX auf Ausgang zu konfigurieren. und WELCHES Zeichen kommt 
immer an?
Envetuell doch falsche Baudrate/Quarz?
1
  lds    i, UCSR0B
2
  ldi    i, (1<<TXEN0);  senden aktivieren
3
  sts    UCSR0B, i
Die erste Zeile ist ohne effekt da du i gleich wieder überschreibst.

Wenn das nicht geplant ist muß es heißen:
1
  lds    i, UCSR0B
2
  ori    i, (1<<TXEN0);  senden aktivieren
3
  sts    UCSR0B, i

>To do a 16-bit write, the high byte must be written before the low byte.
>For a 16-bit read, the low byte must be read before the high byte.
1
  ldi    i, LOW(UBRR_VAL)  ; eintragen
2
  sts    UBRR0L, i
3
  ldi    i, HIGH(UBRR_VAL)  ; Übertragungsrate ins
4
  sts    UBRR0H, i      ; entsprechende Register
Muß also hier umgekehrt erfolgen (ebenso der zugriff auf den 
Stackpointer!)
1
  ldi    i, HIGH(UBRR_VAL)  ; Übertragungsrate ins
2
  sts    UBRR0H, i      ; entsprechende Register
3
  ldi    i, LOW(UBRR_VAL)  ; eintragen
4
  sts    UBRR0L, i

von Tom M. (dertom)


Lesenswert?

Wie kann man eine falsche Baudrate/Quarz erkennen?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

> Wie kann man eine falsche Baudrate/Quarz erkennen?
                            ^^^^^^^^

z.B. Wenn nichts oder das falsche beim Empfänger ankommt. Das kann an 
der Baudrate liegen, muss aber nicht (besondern im Fall nixhts kommt an)

> Wie kann man eine falsche Baudrate/Quarz erkennen?
                                     ^^^^^

Auf dem nach AVR Datenblatt angeschlossenen Quarz steht was anderes als 
10 MHz drauf und die Fuses im AVR sind nicht so gesetzt, dass dieser 
External Crystal zum Schwingen angeregt wird.

von Tom M. (dertom)


Lesenswert?

Tatsächlich kommt etwas falsches an, 0x00 und 0x80, keine anderen 
Zeichen.
Verschiedene Quarze hab ick  schon probiert und ohne Quarz tut sich gar 
nichts. Am Ende meiner Schaltung lassen sich die Daten wunderbar mit dem 
OSZi ankiecken.
Und wenn ick auf der Atmega-Fassung Tx und Rx verbinde, funktioniert der 
EchoTrick im TerminalProgramm wunderbar.
Mir fällt nichts mehr ein!

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Hast du den mal meien Hinweise zum Programm beachtet?

von Tom M. (dertom)


Lesenswert?

Ja, vielen Dank. Hab das LOW & HIGH-Byte wieder getauscht.
Das Programm funktioniert. Irgendwie versteht der Rechner wohl nicht, 
was vom µC kommt????!!!!!

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.