Forum: PC-Programmierung Eigenen Befehlssatz entwickeln zur µC Abfrage


von Board G. (boardgeist)


Lesenswert?

Hallo,
Ich arbeite hier an einem Freescale µC, der Typ tut nichts zur Sache und 
habe mal eine einfache Frage die wohl nicht so einfach zu beantworten 
ist.

Also, an dem µC sind Eingänge, digitaler und analoger Art und Ausgänge 
angeschlossen, sowie ein Display und ein 2. µC.

Meine Frage dreht sich um das reden zwischen PC und µC, ich schreibe 
grad in C# an einer Software die den µC ausliest..,
ein Bsp: Software möchte wissen, welcher der 8 Fehlereingänge grad einen 
Fehler anzeigt (wird eig. am Display gemacht, funkt auch).
Ich habe es so gelöst das 1 Byte als FF 0_Fehler anzeigt, ein BF wär 
Fehler am Vorletzten und ein 7F ein Fehler am letzten Port, das kann man 
ja dann leicht rausfischen.

Möchte der PC nun dieses Byte haben, sendet er ein hallo (0x10), darauf 
ein hallo zurück (0x10) -> Bed. Sie verstehen sich. Jetzt ein 0x11 für 
'Sende mir FehlerByte' -> µC sendet Fehlerbyte + 0x12 für 'Das war grad 
ein Fehlerbyte' (um missverst. durch Bitfehler zu vermeiden).


Das klappt auch alles,flüssig und gut, aber so richtig glücklich bin ich 
mit meiner Lösung nicht. Ich imitiere ein Bissel den IIC Bus indem der 
PC Master spielt und der µC nur auf Fragen Antwortet. (Bis auf 1-2 
Ausnahmen die noch nicht eingbaut sind)

Gibt es da Normen an die ich mich halten muss, laufe ich grad in die 
falsche Richtung oder versperre mir Sachen für später?
Oder kann ich das nach eigenen Gut-dünken tun?

MfG

von Gast (Gast)


Lesenswert?

Wäre es nicht besser einen kleinen Telegrammrahmen zu definieren z.B.

vom PC=>  "Hallo" "Ich möchte" "Checksumme"

vom µC => "Hallo" "Du möchtest" "Hier ist was du möchtest" "Checksumme"

Hiermit kann eine einfache und sichere Kommunikation erfolgen

von Board G. (boardgeist)


Lesenswert?

Meinst du mit Checksumme grad-ungerade Anzeige (Sticky-Bit) oder eine 
echte Funktion?

MfG

von Gast (Gast)


Lesenswert?

einfach : Summe der Übertragenen Byte (Addition!)

kompliziert : CRC16 generieren

Die Checksumme wird u.U. 2Byte benötigen

Dem Empfänger soll nur die Möglichkeit gegeben werden eine 
RICHTIG/FALSCH Beurteilung durchzuführen.

von Board G. (boardgeist)


Lesenswert?

hm, gute idee, könnt mein 0x12 vorsetzen und dahinter ne crc, k.

Ty + MfG

von Frank J. (frajo)


Lesenswert?

Und wenn Du nicht alles neu erfinden willst, sieh Dir mal S.N.A.P. an:
http://www.hth.com/snap/

Frank.

von Christian R. (supachris)


Lesenswert?

Sehr schön ist auch das Serielle Protokoll, was der Bluetooth Chip 
LMX9820 benutzt. Ich nehm das mittlerweile (manchmal leicht abgewandelt) 
für fast alle Kommunikation hier...
Infos z.B. hier: http://www.reimesch.de/download/adeunis/LMX9820mn.pdf 
Seite 24ff

von Board Geist (Gast)


Lesenswert?

Schau ich mir an, Danke!

Als CRC nehm ich, da mein komisches µC-C (CodeWarrior) keine CRC hat die 
was ordentliches liefert, dies:
1
word crc_table[256];;
2
bool crc_table_sema=0;
3
word AS1_CRC16(byte *msg,word cnt)
4
{    int crc_value;
5
 
6
7
//void InitCRC_Table(void)
8
//{
9
  //register WORD b, v;
10
  //register signed char i;
11
  word b,v;
12
  signed char i;
13
14
   if (crc_table_sema==0)
15
   {
16
  for( b = 0; b <= 255; ++b )
17
  {
18
    for( v = b << 8, i = 8; --i >= 0; )
19
    { if ( (v & 0x8000) != 0x0000 )
20
  v = ( v << 1 ) ^POLYNOMIAL;
21
      else
22
        v = v << 1;
23
    }
24
    crc_table[b] = v;
25
  }
26
  crc_table_sema=1;
27
  };
28
//}
29
30
31
  
32
//WORD CRC_calculation(BYTE   *msg, WORD  cnt)
33
//{
34
  while( cnt-- != 0x0000)
35
    crc_value = (crc_value << 8) ^ crc_table[(crc_value >> 8) ^*msg++];
36
  return( crc_value );
37
//}
38
39
}    // ende AS1_CRC16

Ist nat. hier aus dem Forum, aus einem der 1.000.000 >> 2^??
Threads darüber. Extra feste Bereiche zu jedem Forum, indem der 
Moderator solche geklärten sachen einfach komplett angibt, wär toll, 
macht aber halt jemanden auch Arbeit... .

Jut, ran. Ty + MfG

von Board Geist (Gast)


Lesenswert?

Ich bekomme bei 'v << 8' oder 'b<<1' immer Fehler das Int nicht 
implitzit in ushort umgewandelt werden kann, er soll ja nix wandeln 
sondern die Bits schieben... was mach ich da anders in C#?

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.