Assembler UART Konfiguration

TommyB

Team Bitschubse
17. Mai 2010
2.151
80
48
40
127.0.0.1 ;)
Sprachen
  1. C#
  2. VB.Net
  3. LunaAVR
  4. Assembler
  5. Python
Also, ich weiß nicht mehr wo, aber irgendwo hatte ich mal dieses Snippet gefunden:
Code:
.EQU F_CPU = 8000000			; System clock in Hz
.EQU BAUD = 9600				; Baudrate

.EQU UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.EQU BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1)))
.EQU BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)
.IF ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
	.ERROR "Baudrate error larger than 1%!"
.ENDIF

LDI	Temp1	, HIGH(UBRR_VAL)
OUT	UBRR0H	, Temp1
LDI	Temp1	, LOW(UBRR_VAL)
OUT	UBRR0L	, Temp1

Wenn ich nu ins Datenblatt schau:
GbWC96vVuywjiOO-ATmega168pdfSECU.png

Denn seh ich dass ich mit U2Xn = 1 eine schnellere Übertragung bekommen könnte (blau) als ohne (gelb). Frage ist nun wie könnte man dieses Script am besten anpassen um mit vorzugsweise einem EQU mehr auch die doppelte Geschwindigkeit zu erhalten?
 
Hallo Tommy,

es ist jetzt nicht direkt eine Antwort auf deine Frage, aber vielleicht helfen dir die Bemerkungen und Hinweise weiter.

U2Xn ist ein Bit im USART Kofigurationsregister. Es macht eigentlich nur Sinn es zu setzen, um die höchsmögliche Baudrate zu erreichen. Wenn du das Bit setzt, passt natürlich die EQU Anweisungen nicht mehr, welche UBBR berechnet. Diese kann man sich dann anpassen.

Du kannst dir auch UBBR direkt über unseren AVR-USART-Calculator berechnen. Den berechneten UBBR-Wert musst du dann nur in das 16Bit Register UBBRn schreiben und ggf. das Bit U2Xn setzen.

avr-usart-calculator.png

Gruß,
Dirk
 
Ich kenn wohl deine Tools, hab auch einige schon runter geladen und in Verwendung. Ich würds nur gerne direkt im Code haben.

...U2Xn ist ein Bit im USART Kofigurationsregister. Es macht eigentlich nur Sinn es zu setzen, um die höchsmögliche Baudrate zu erreichen. ...
Also das würde ich so nicht unterschreiben. Wenn du mal in die Tabelle schaust bekomm ich bei gleicher Fehlerrate die doppelte Frequenz, von daher macht es auch so Sinn ;) Ist immerhin ein Unterschied von 7,2%.
 
Hi Tommy,

Frage ist nun wie könnte man dieses Script am besten anpassen um mit vorzugsweise einem EQU mehr auch die doppelte Geschwindigkeit zu erhalten?

Du möchtest das Script anpassen, so dass ein gesetztes U2X-Bit berücksichtigt wird ? Da sich die Baudrate dabei stets verdoppelt, würde ich den Wert für die Baudrate einfach vor der Berechnung halbieren :

Code:
.EQU F_CPU = 8000000			; System clock in Hz
.EQU [B]BAUDU2X1[/B] = 9600				; Baudrate bei U2X = 1

[B].EQU BAUD = (BAUDU2X1 / 2)[/B]
.EQU UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.EQU BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1)))
.EQU BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)
.IF ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
	.ERROR "Baudrate error larger than 1%!"
.ENDIF

LDI	Temp1	, HIGH(UBRR_VAL)
OUT	UBRR0H	, Temp1
LDI	Temp1	, LOW(UBRR_VAL)
OUT	UBRR0L	, Temp1

Gruß
Pirx
 
So würds natürlich auch gehen ^^
Daran hatt ich noch nicht gedacht.

Mir schwebte erst was dynamischeres vor, wie (Pseudocode!):
Code:
.EQU F_CPU = 8000000			; System clock in Hz
.EQU BAUD = 9600				; Baudrate bei U2X = 1
.EQU U2X = True

.IF U2X
.EQU BAUD = (BAUD / 2)
.ENDIF
.EQU UBRR_VAL = ((F_CPU+BAUD*8)/(BAUD*16)-1)
.EQU BAUD_REAL = (F_CPU/(16*(UBRR_VAL+1)))
.EQU BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)
.IF ((BAUD_ERROR>10) || (BAUD_ERROR<-10))
	.ERROR "Baudrate error larger than 1%!"
.ENDIF

LDI	Temp1	, HIGH(UBRR_VAL)
OUT	UBRR0H	, Temp1
LDI	Temp1	, LOW(UBRR_VAL)
OUT	UBRR0L	, Temp1

.IF U2X
LDI	Temp1	, (1<<U2X0)
OutX	UCSR0A	, Temp1
.ENDIF
 
Man kann natürlich auch die Berechnung anpassen, muss dann aber die Rundung mit anpassen (sonst gibt's falsche Werte). Nur die Frequenz zu halbieren, war so auf die Schnelle einfacher.

Gruß
Pirx
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)