www.mikrocontroller.net

Forum: Mikrocontroller und Elektronik Atmega48 & UART

Autor: Tom Meyer (dertom)
Datum: 08.05.2008 22:08

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 Mail@laeubi.de (laeubi) Benutzerseite
Datum: 08.05.2008 22:56

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: 09.05.2008 10:02

Wie kann man eine falsche Baudrate/Quarz erkennen?
Autor: Stefan "stefb" B. (stefan) Benutzerseite
Datum: 09.05.2008 10:35

> 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: 09.05.2008 14:24

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 Mail@laeubi.de (laeubi) Benutzerseite
Datum: 09.05.2008 14:53

Hast du den mal meien Hinweise zum Programm beachtet?
Autor: Tom Meyer (dertom)
Datum: 09.05.2008 15:12

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 Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
  • Aussagekräftigen Betreff wählen
  • Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
  • JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel






webmaster@mikrocontroller.netImpressumWerbung auf Mikrocontroller.net