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.
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.
Standard-Ermahung: der Name _Counts liegt im implementationnamespace, 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.