Eigenen Befehlssatz entwickeln zur µC Abfrage

#575307
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
Gast #575321
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
Gast #575345
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.
Gast #575977
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
Gast #576158
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#?

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