Hallo Leute,
ich bin gerade dabei ein Programm für einen ATmega644 zu schreiben, das
unter anderem über UART Daten an den PC senden soll. Dabei werden immer
3 Bytes als größeres Frame gesehen und versendet. Diese 3 Bytes
enthalten eine 16Bit-Variable, einen 5Bit langen Befehl und 3 Bits zur
Synchronisation.
Zu diesem Zweck habe ich mir eine Funktion geschrieben, die mir diese 3
Bytes aus dem Befehl und den Daten zusammenbauen soll:
1 | void daten_senden(uint8_t befehl, uint16_t daten)
|
2 | {
|
3 | char frame[3];
|
4 | /*
|
5 | Aufbau: Byte Bits Funktion
|
6 | 1 1 Identifikator für erstes Byte (muss 1 sein)
|
7 | 2-6 Befehlsbits (1-31)
|
8 | 7-8 Datenbits 1-2
|
9 | 2 1 Identifikator für Daten-Bytes (muss 0 sein)
|
10 | 2-8 Datenbits 3-9
|
11 | 3 1 Identifikator für Daten-Bytes (muss 0 sein)
|
12 | 2-8 Datenbits 10-16
|
13 | */
|
14 | frame[0] = 0b10000000;
|
15 | frame[0] += (befehl<<2);
|
16 | frame[0] += (uint8_t)(daten>>14);
|
17 | frame[1] = (uint8_t)(daten>>7);
|
18 | daten = daten<<9;
|
19 | frame[2] = (uint8_t)(daten>>9);
|
20 | uart_putc(frame[0]);
|
21 | uart_putc(frame[1]);
|
22 | uart_putc(frame[2]);
|
23 | }
|
Diese Funktion wird im Hauptprogramm aufgerufen, wobei der Befehl als
Konstante übergeben wird:
1 | #define PING_RET 2
|
2 |
|
3 | //...
|
4 |
|
5 | int maint()
|
6 | {
|
7 | //...
|
8 | daten_senden(PING_RET, 1);
|
9 | //...
|
10 | }
|
Mein Problem ist, dass egal was ich beim Aufruf der Funktion als
Parameter übergeben möchte immer nur (0, 0) ankommt. Ich habe auch schon
versuch die Konstanten vorher in einer Variable zu speichern und die
dann zu übergeben aber das hat auch nichts geändert.
Könnt ihr mir sagen, was ich da falsch gemacht habe???
gruß,
Kai L.