mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega48 & UART


Autor: Tom Meyer (dertom)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Wenn das nicht geplant ist muß es heißen:
  lds    i, UCSR0B
  ori    i, (1<<TXEN0);  senden aktivieren
  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.
  ldi    i, LOW(UBRR_VAL)  ; eintragen
  sts    UBRR0L, i
  ldi    i, HIGH(UBRR_VAL)  ; Übertragungsrate ins
  sts    UBRR0H, i      ; entsprechende Register
Muß also hier umgekehrt erfolgen (ebenso der zugriff auf den 
Stackpointer!)
  ldi    i, HIGH(UBRR_VAL)  ; Übertragungsrate ins
  sts    UBRR0H, i      ; entsprechende Register
  ldi    i, LOW(UBRR_VAL)  ; eintragen
  sts    UBRR0L, i

Autor: Tom Meyer (dertom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie kann man eine falsche Baudrate/Quarz erkennen?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom Meyer (dertom)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du den mal meien Hinweise zum Programm beachtet?

Autor: Tom Meyer (dertom)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.