PeDa's Baudratenerkennung

Gast #1989133
Lesenswert?
• ▲
▼
Hallo,

Peter Danegger hat in seinem Fastboot-Bootloader eine automatische 
Baudraten-Erkennung verbaut, die ich gerne verstehen möchte.

Der Assemblerfetzen ist allerdings, gelinde gesagt, ein undurchsichtiges 
Massaker... Ich wäre dem Autor unheimlich dankbar, wenn er die 
Funktionsweise etwas näher erläutern könnte :-)

Vielen Dank und Frohes Fest.
Kama



PS: Quelltext gibt es z.B. hier:
Beitrag "Re: UART Bootloader ATtiny13 - ATmega644"
Gast #1989666
Lesenswert?
• ▲
▼
Nun,

nach längerem Nachdenken habe ich das Prinzip verstanden. Lediglich 
diese Korrektur ist mir noch schleierhaft:
1
;------------------------------ correction for USB dongle !!! ------------
2
  mov  r0, zh
3
_aba5:
4
  asr  yl      ; shift signed !
5
  lsr  r0
6
  brne  _aba5

Was hat es mit den USB-Dongles auf sich?
In meiner Implementierung habe ich eine solche Korrektur nämlich nicht 
und bemerke, dass die Erkennung sporadisch nicht funktioniert, was 
vermutlich am USB-Dongle liegt :-)


Danke und Gruß!
#1989700
Lesenswert?
• ▲
▼
Die Baudratenerkennung versucht 2 low-Impulse auszumessen, deren 
Verhältnis etwa 1:4 beträgt. Dadurch verringere ich die Gefahr einer 
Fehlerkennung.
Damit das auch auf AVRs ohne 16Bit-Timer funktioniert, erfolgt das 
Messen durch Zählschleifen.

Zieht man nun ein Toleranzfenster ab, ist dieses absolut. D.h. bei 
kleinen Counts kann die Tolelanz zu groß sein bzw. bei großen Counts zu 
klein. Daher wird bei großen Counts der Wert solange halbiert, bis der 
Countwert unter 8 Bit ist. Damit spart man sich eine Division zur 
Ermittlung der relativen Toleranz.

Insbesondere bei USB-Dongle ist mir eine deutlich höherer Fehler 
aufgefallen im Vergleich zu einer echten UART.
Vermutlich liegt das daran, daß USB glatte MHz-Quarze benötigt, d.h. 
keine Baudratenquarze und dadurch ergibt sich ein Rechenfehler bei der 
Biterzeugung.


Peter
Gast #1989738
Lesenswert?
• ▲
▼
Man könnte also auch sagen, diese Korrektur ist für lahme Taktraten 
gedacht? Denn dort entstünden ja hohe Zählwerte --

Ich versuchs mal zu verstehen:
1
; Prolog...
2
; Y hält die Länge des vorigen SPACE
3
; Z zählt die Länge des aktuellen SPACE vierfach
4
; --> bei 1:4 landet Y idealerweise bei Null
5
  sbiw  yl, 1    ;2
6
  adiw  zl, 4    ;2  count bit time
7
  brcs  timeout      ;1  time to long
8
  SKIP_RXD_1      ;1   wait until RXD = 1
9
  rjmp  _aba4      ;2 = 8
10

11

12
; Z sichern, wird später noch gebraucht für die ermittelte Baudrate
13
  mov  r0, zh
14

15
; Warum jetzt Y und Z vermischt?
16
; Und warum arithmetisch schieben, es sollte doch halbiert werden?
17
_aba5:
18
  asr  yl      ; shift signed !
19
  lsr  r0
20
  brne  _aba5
21

22

23
; Kurzform für:
24
; Wenn der Übertrag erscheint, lagen wir nahe bei Null
25
  sbiw  yl, TOLERANCE
26
  adiw  yl, 2 * TOLERANCE

Danke!

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.