Binärwert einer Variable per UART senden

Gast #3720014
Lesenswert?

Guten Morgen,
Ich hab ein vmtl dummes Problem.. Ich will meinen Atmega dazu bringen 
mit meinem Motorsteuergerät über CAN zu kommunizieren. Nachrichten 
empfangen geht, jedoch passen meine Bit-Shifting Operationen offenbar 
nicht, ich krieg nur Müll aus der ID raus.
Jetzt hab ich mir gedacht lass ich mir den Header in Binär über UART am 
PC schicken, dann seh ich ja warums net geht.. aber das is irgentwie 
nicht so einfach.

Nachdem msg[i] ja blöderweis net geht dacht ich mir ich mach einen 
Pointer auf meine Variable, vergleich jeweils ob der Wert dort 1 oder 0 
ist und schick dementsprechend eine 1 oder 0 übern Uart.

for(int i=0;i<32;i++)
{
 uint8_t* id= &msg.id;
 if(*id & 0b1)
    transmit_string_USART0("1");
 else
    transmit_string_USART0("0");
 id++;
}
transmit_string_USART0("\n\r");

Aber so gehts nicht... kann mir vlt jmd helfn? Bin ma sicher dass ich da 
einfach an groben Denkfehler drinnen hab.

lg andi
Gast #3720043
Lesenswert?

Nachtrag:

du kannst auch nicht mit einen Pointer über bits gehen. Bits haben keine 
Adresse. Du liest mit deinen Code als 31byte irgendwo aus dem Speicher, 
das kann so nicht gehen.

Vermutlich geht es so:
1
transmit_string_USART0(msg.id     & 0xff );
2
transmit_string_USART0(msg.id>>8  & 0xff );
3
transmit_string_USART0(msg.id>>16 & 0xff );
4
transmit_string_USART0(msg.id>>24 & 0xff );

jetzt müsste man nur noch die Reihenfolge wissen, wie die Bits gebraucht 
werden.
#3720286
Lesenswert?

Peter II schrieb:
> Dr. Sommer schrieb:
>> Und deswegen, Kinder, wurde der Debugger erfunden...
>
> ein Debugger ist wenig hilfreich, wenn man gar nicht versteht wie
> Binärdaten gesendet werden.

Ich bin mir gar nicht sicher, ob er das überhaupt will.
Ich interpretiere mal frei

> Jetzt hab ich mir gedacht lass ich mir den Header in Binär über UART
> am PC schicken, dann seh ich ja warums net geht.. aber das is
> irgentwie nicht so einfach.

Ich denke, er denkt über Debug-Möglichkeiten nach.
Er will sich am PC (in einem Terminalprgramm) die 8 Bytes aus der CAN 
Nachricht in Bitform anzeigen lassen (um zu erkennen, welche Bits gestzt 
sind und welche nicht).

D.h was er wirklich will, ist sich die Daten die er vom CAN bekommt, 
aufgedröselt in 0-en und 1-en in Textform anzeigen lassen.

Ist wie gesagt nur meine Interpretation. Vielleicht liege ich auch 
komplett falsch, die Fragestellung bzw. das Erraten wonach eigentlich 
gefragt wird, ist zumindest für mich nicht ganz eindeutig. AUf jeden 
Fall dürfte aber wieder der Fall vorliegen, dass nach etwas gefragt 
wird, was schon von der Idee her der komplett falsche Ansatz ist.

Wenn ich richtig liege, dann würde ich mir erst mal eine kleine 
Hilfsfunktion bauen. Eine Funktion, die 1 Byte aufgedröselt in Bits in 
Textform ausgibt.
1
void transmit_uint8_string_USART0( uint8_t value )
2
{
3
  char str[9];
4
  utoa( value, str, 2 );
5
  transmit_string_USART0( str );
6
}
Die Funktion gibt den Byte-Wert in seiner Binärdarstellung in Textform 
aus.
Damit sollte es dann eigentlich recht leicht sein, die gewünschte 
Funktionalität, nämlich alle Bytes einer CAN-Msg in lesbarer Form aufs 
Terminal zu kriegen, bzw. darauf aufbauend sich weitere Hilfsfunktionen 
zu machen, die nicht nur 1 Byte ausgeben können, sondern dasselbe mit 
einem 16 Bit Wert bzw. einem 32 Bit Wert zu machen
1
void transmit_uint16_string_USART0( uint16_t value )
2
{
3
  transmit_uint8_string_USART0( value >> 8 );
4
  transmit_uint8_string_USART0( value );
5
}
6

7
void transmit_uint32_string_USART0( uint32_t value )
8
{
9
  transmit_uint16_string_USART0( value >> 16 );
10
  transmit_uint16_string_USART0( value );
11
}

Wenn ich jetzt richtig liege, dann 'vereinfacht' sich damit die 
ursprüngliche Aufgabenstellung zu einem simplen
1
  transmit_string_USART0( "Id = " );
2
  transmit_uint32_string_USART0( msg.id );
3
  transmit_string_USART0( "\n" );
um die gewünschte Einsicht in das per CAN Empfangene zu erhalten.
Gast #3720610
Lesenswert?

KarlHeinz, dankedankedankedanke!

Ich wusst ja das muss viel einfacher gehn :D
du hasts erkannt, ich will wirklich die Register in lesbarem Binärcode 
sehen, damit ich das ganze eben einfach debuggen kann.

beste grüße,
andi
Gast #3720798
Lesenswert?

also ich hab das jetzt eingefügt, jetzt hab ich nur mehr das Problem das 
nicht alle 0en ausgegeben werden.. Deswegen hab ichs gesplittet mit 
Zwischenzeichen:

void transmit_uint32_string_USART0( uint32_t value )
{
  transmit_string_USART0("|");
  transmit_uint8_string_USART0(value >> 24);
  transmit_string_USART0("-");
  transmit_uint8_string_USART0(value >> 16);
  transmit_string_USART0("-");
  transmit_uint8_string_USART0(value >> 8);
  transmit_string_USART0("-");
  transmit_uint8_string_USART0(value);
  transmit_string_USART0("|");
}

Jetzt krieg ich folgende Sachen raus:
|0-1000-10000010-10110000|
|0-0-0-0|
|0-0-10-10001001|

Hier sind jetzt einfach nur die führenden nullen weggelassen, oder?

beste Grüße,
Andi

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