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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.