Hallo Forum, ich habe eine Programm, das Manchester-Code auswertet. Dazu benutze ich Zeitkonstanten zur Erkennung von langen und kurzen Bits. Diese Zeiten möchte ich je nach CPU-Takt berechen: #define _Counts(a) (a*F_CPU/(1000000*8)) #define SHORT_MIN 200 #define SHORT_MAX 300 #define LONG_MIN 380 #define LONG_MAX 600 F_CPU ist bei mir 1Mz, d.h. _Counts(a) sollte alle Werte durch 8 teilen. Zum Test habe ich mir mal alle 4 Zeiten ausgeben lassen: uart_putc(_Counts(SHORT_MIN)); uart_putc(_Counts(SHORT_MAX)); uart_putc(_Counts(LONG_MIN)); uart_putc(_Counts(LONG_MAX)); Ich erwarte: 25 37 47 203 Das Ergebnis sieht im Terminal so aus: 025 037 047 203 Die ersten 3 Werte werden richtig berechnet, der letzte Wert Falsch, müßte eigentlich 75 sein.(Bit 7 ist zuviel gesetzt). Was mache ich falsch, habe ich ein Vorzeichenproblem oder muss ich irgendwo Casten?
Momentus schrieb: > F_CPU ist bei mir 1Mz, d.h. _Counts(a) sollte alle Werte durch 8 teilen. Und wenn Du das stattdessen machst, kommt dann das richtige heraus?
Momentus schrieb: > Ich erwarte: 25 37 47 203 > > Das Ergebnis sieht im Terminal so aus: > > 025 037 047 203 Sieht fuer mich gleich aus, wo ist das Problem? wendelsberg
Hab ich auch nicht gerafft... Ist es wirklich so, dass der PP nichts rechnet in... #define _Counts(a) (a*F_CPU/(1000000*8))4 ...? Hätte ich auch erwartet, aber nun gut. Klaus.
So muß es richtig heißen: Ich erwarte: 25 37 47 75 Mittlerweile glaube ich es liegt an der UART, wenn ich die Zahlen von 0-255 ausgebe for(uint8_t i =0 ;i<=255; i++) uart_putc(i); dann kommt das: 0...63 dann gehts bei 192 weiter Teste jetzT erst mal die Uart genauer.
Klaus R. schrieb: > Ist es wirklich so, dass der PP nichts rechnet in... Ja. Der Compiler rechnet das aus.
Klaus R. schrieb: > #define _Counts(a) (a*F_CPU/(1000000*8))4 Und du bist sicher, dass du mit /(1000000*8)/ keinen Zahlenüberlauf produzierst?
Der Präprozessor macht da ja nur die textuelle Ersetzung und der Compiler kann die Rechnung optimieren bzw ersetzt die Rechnung durch das Endergebnis.
OK, jetzt wird ein Schuh draus. Der Unterscheid war mir so nicht bewusst, Danke. Klaus.
Glaube mittlerweile, der Prozessor hat einen weg. Ich hab mal die Taktfrequenz gemessen bis auf 3 Stellen genau 1Mhz, trotzdem gibt die UART bei Werten über 63 immer Bit 7 mit aus, auf einem anderen Prozessor läuft der Code. Werde jetzt erst mal den Chip(Atmega168) wechseln. Danke schon mal für die Antworten.
putc sendet ein byte, dass ich mir im Terminal als hex, dez oder bin anzeigen lassen kann.
Hi
>Werde jetzt erst mal den Chip(Atmega168) wechseln.
Bei deinem Fehlerbild würde ich eher auf eine falsche Baudrate tippen.
MfG Spess
Standard-Ermahung: der Name _Counts liegt im implementation namespace, der ist für deine Applikation tabu, sofern du nicht durch Dokumentation von Compiler oder Standardbibliothek explizit zu dessen Benutzung aufgefordert worden bist.
spess53 schrieb: > Bei deinem Fehlerbild würde ich eher auf eine falsche Baudrate tippen. Zahlen von 0-63 werden richtig dargestellt, ab 64 ist Bit 7 gesetzt. Der Bootloader über die serielle funktioniert einwandfrei. Alles sehr merkwürdig.
Momentus schrieb: > Zahlen von 0-63 werden richtig dargestellt, ab 64 ist Bit 7 gesetzt. Ja, die niederwertigen Bits werden ja auch zuerst ausgegeben. Wenn die UART-Taktfrequenz daneben ist, dann kann es also passieren, dass dein gesetztes Bit 6 vom Empfänger auch noch als Bit 7 abgetastet wird.
Jörg Wunsch schrieb: > Ja, die niederwertigen Bits werden ja auch zuerst ausgegeben. Wenn > die UART-Taktfrequenz daneben ist, dann kann es also passieren, dass > dein gesetztes Bit 6 vom Empfänger auch noch als Bit 7 abgetastet wird. Das war die Ursache, ich habe die Baudrate von 9600 auf 4800 gesenkt, um den Fehler zu verkleinern, und jetzt geht es. Komischerweise hatte ich den Fehler bei einem anderen Prozessor nicht, wahrscheinlich war dieser nicht genau kalibriert, und dadurch hat die Baudrate besser gepasst. Danke für alle Antworten.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.