robin
10.05.2012, 23:26
Hi,
hab grad ein Problem und komm nicht weiter.
Bin grad am USART für den XMEGA zu programmieren, genauer die Baudrate bestimmen
Hat von euch mal einer versucht mit einem .equ potenzrechnung zu benutzten?
.equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
liefert als Ergebnis nur F_PER / 2 bricht also bei dem ^ ab.
alternativ hab ich auch POW(2,BSCALE) versucht aber will auch nicht, kennt er nicht und bringt ein '(' fehler.
Die Formeln sind in dem "XMEGA A Manual.pdf" auf Seite 238 zu finden
hier noch mal die gesamte abfrage:
.equ Baud = 9600
.equ CLK2X = 0
.equ BSCALE = 0
.equ F_PER = 2000000
.if (CLK2X < 1)
.if (BSCALE >= 0)
.equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
.equ BAUD_REAL = F_PER / (2^BSCALE * 16 * (BSEL + 1))
.else
.equ BSEL = 1 / (2^BSCALE) * ((F_PER / 16 * BAUD) - 1)
.equ BAUD_REAL = F_PER / (16 * ((pow(2,BSCALE) * BSEL) + 1))
.endif
.if (BAUD > (F_PER / 16))
.error "BAUD zu groß, oder Periferie clock zu klein: (vllt. CLK2X?)"
.endif
.else
.if (BSCALE >= 0)
.equ BSEL = (F_PER / (2^BSCALE * 8 * BAUD) - 1)
.equ BAUD_REAL = (F_PER / (2^BSCALE * 8 * (BSEL + 1)))
.else
.equ BSEL = (1 / (2^BSCALE) * ((F_PER / 8 * BAUD) - 1))
.equ BAUD_REAL = (F_PER / (8 * ((2^BSCALE * BSEL) + 1))
.endif
.if (BAUD > (F_PER / 8))
.error "BAUD zu groß, oder Periferie clock zu klein: Periferieclock erhöhen"
.endif
.endif
.equ BAUD_ERROR = ((BAUD_REAL * 1000) / BAUD - 1000)
.if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10)) ; max. +/-10 Promille Fehler
; .error "Systematischer Fehler der Baudrate groesser 1 Prozent und damit zu hoch!"
.endif
Baud_ERROR gibt die Abweichung des eingestellten Werts in Promille an, laut Taschenrechner stimmt alles, also ~0,15% Abweichung
Wäre cool, wenn jemand mir helfen könnte.
hab grad ein Problem und komm nicht weiter.
Bin grad am USART für den XMEGA zu programmieren, genauer die Baudrate bestimmen
Hat von euch mal einer versucht mit einem .equ potenzrechnung zu benutzten?
.equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
liefert als Ergebnis nur F_PER / 2 bricht also bei dem ^ ab.
alternativ hab ich auch POW(2,BSCALE) versucht aber will auch nicht, kennt er nicht und bringt ein '(' fehler.
Die Formeln sind in dem "XMEGA A Manual.pdf" auf Seite 238 zu finden
hier noch mal die gesamte abfrage:
.equ Baud = 9600
.equ CLK2X = 0
.equ BSCALE = 0
.equ F_PER = 2000000
.if (CLK2X < 1)
.if (BSCALE >= 0)
.equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
.equ BAUD_REAL = F_PER / (2^BSCALE * 16 * (BSEL + 1))
.else
.equ BSEL = 1 / (2^BSCALE) * ((F_PER / 16 * BAUD) - 1)
.equ BAUD_REAL = F_PER / (16 * ((pow(2,BSCALE) * BSEL) + 1))
.endif
.if (BAUD > (F_PER / 16))
.error "BAUD zu groß, oder Periferie clock zu klein: (vllt. CLK2X?)"
.endif
.else
.if (BSCALE >= 0)
.equ BSEL = (F_PER / (2^BSCALE * 8 * BAUD) - 1)
.equ BAUD_REAL = (F_PER / (2^BSCALE * 8 * (BSEL + 1)))
.else
.equ BSEL = (1 / (2^BSCALE) * ((F_PER / 8 * BAUD) - 1))
.equ BAUD_REAL = (F_PER / (8 * ((2^BSCALE * BSEL) + 1))
.endif
.if (BAUD > (F_PER / 8))
.error "BAUD zu groß, oder Periferie clock zu klein: Periferieclock erhöhen"
.endif
.endif
.equ BAUD_ERROR = ((BAUD_REAL * 1000) / BAUD - 1000)
.if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10)) ; max. +/-10 Promille Fehler
; .error "Systematischer Fehler der Baudrate groesser 1 Prozent und damit zu hoch!"
.endif
Baud_ERROR gibt die Abweichung des eingestellten Werts in Promille an, laut Taschenrechner stimmt alles, also ~0,15% Abweichung
Wäre cool, wenn jemand mir helfen könnte.