Forum: Mikrocontroller und Digitale Elektronik Precompiler rechnet falsch


von Momentus (Gast)


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?

von Mark B. (markbrandis)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

Der Präprozessor rechnet überhaupt nicht (ausser im #if).

von wendelsberg (Gast)


Lesenswert?

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

von Klaus R. (klaus2)


Lesenswert?

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.

von Momentus (Gast)


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.

von Peter D. (peda)


Lesenswert?

#define _Counts(a)    ((a*1ULL)*F_CPU/(1000000*8))

von (prx) A. K. (prx)


Lesenswert?

Klaus R. schrieb:
> Ist es wirklich so, dass der PP nichts rechnet in...

Ja. Der Compiler rechnet das aus.

von Mike (Gast)


Lesenswert?

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?

von Pit (Gast)


Lesenswert?

Der Präprozessor macht da ja nur die textuelle Ersetzung und der 
Compiler kann die Rechnung optimieren bzw ersetzt die Rechnung durch das 
Endergebnis.

von Klaus R. (klaus2)


Lesenswert?

OK, jetzt wird ein Schuh draus. Der Unterscheid war mir so nicht 
bewusst, Danke.

Klaus.

von Momentus (Gast)


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.

von Walter Tarpan (Gast)


Lesenswert?

Wieso kann putc Zahlen ausgeben?

von Momentus (Gast)


Lesenswert?

putc sendet ein byte, dass ich mir im Terminal als hex, dez oder bin 
anzeigen lassen kann.

von spess53 (Gast)


Lesenswert?

Hi

>Werde jetzt erst mal den Chip(Atmega168) wechseln.

Bei deinem Fehlerbild würde ich eher auf eine falsche Baudrate tippen.

MfG Spess

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Momentus (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Momentus (Gast)


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.

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
Noch kein Account? Hier anmelden.