Precompiler rechnet falsch

Gast #3858280
Lesenswert?

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?
Gast #3858343
Lesenswert?

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.
Gast #3858616
Lesenswert?

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.
Gast #3871228
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren