hallo ich habe vor ca. 10 relais über die serielle schnittstelle anzusteuern. idee ist eine bitfolge in der form "110011010" an die relais weiterzuleiten. meine frag ist, wie verteile ich diese bitfolge auf die Ports eines AVR Controlers? ich würde z.B. diese Bitfolge "110011010" empfangen und muss die nun auf die ports verteilen. wie geht das? macht ihr es über eine switch case abfrage? oder if? if(Bitfolge=="110011010"){ portA1 auf high portA2 auf high usw....} ?? danke
@ dertum (Gast) >ich habe vor ca. 10 relais über die serielle schnittstelle anzusteuern. >idee ist eine bitfolge in der form "110011010" an die relais >weiterzuleiten. Kann man machen. Relais mit Logik ansteuern >meine frag ist, wie verteile ich diese bitfolge auf die Ports eines AVR >Controlers? Vollkommen beliebig. >ich würde z.B. diese Bitfolge "110011010" empfangen und muss die nun auf >die ports verteilen. wie geht das? Mit Bitmanipulation. >macht ihr es über eine switch case abfrage? oder if? >if(Bitfolge=="110011010"){ >portA1 auf high >portA2 auf high usw....} Nö, man muss die Bits einzeln abfragen und reagieren, siehe Artikel oben. Mfg Falk
wie würde ein anschauliches beispiel aussehen mit der oberen bitfolge? die bitfolge würde ja über RX Port Pin eingelesen und wie gehts dann weiter? beispiel? :)
Da Du 10 Bit Nutzdaten (also 2 Byte) benötigst, sende vom PC ein beliebiges Zeichen zur Synchronisation (z. B. @) und anschliessend 2 Byte Nutzdaten - z. B.: @ A A. Warte im Controller auf das @, und lies 1. und 2. Byte ein. Frage die Bits ab (Bitmanipulation) und setzte oder rücksetze das korresponierende Relais. Otto
Der Code könnte z.B. so aussehen:
1 | if(byte1 & 0x01) PORTA|=(1<<PA0); |
2 | if(byte1 & 0x02) PORTA|=(1<<PA1); |
3 | if(byte1 & 0x04) PORTA|=(1<<PA2); |
4 | if(byte1 & 0x08) PORTA|=(1<<PA3); |
5 | if(byte1 & 0x10) PORTA|=(1<<PA4); |
6 | if(byte1 & 0x20) PORTA|=(1<<PA5); |
7 | if(byte1 & 0x40) PORTA|=(1<<PA6); |
8 | if(byte1 & 0x80) PORTA|=(1<<PA7); |
9 | if(byte2 & 0x01) PORTB|=(1<<PB0); |
10 | if(byte2 & 0x02) PORTB|=(1<<PB1); |
Markus F. schrieb: > Der Code könnte z.B. so aussehen: > >
1 | if(byte1 & 0x01) PORTA|=(1<<PA0); |
2 | > if(byte1 & 0x02) PORTA|=(1<<PA1); |
3 | > if(byte1 & 0x04) PORTA|=(1<<PA2); |
4 | > if(byte1 & 0x08) PORTA|=(1<<PA3); |
5 | > if(byte1 & 0x10) PORTA|=(1<<PA4); |
6 | > if(byte1 & 0x20) PORTA|=(1<<PA5); |
7 | > if(byte1 & 0x40) PORTA|=(1<<PA6); |
8 | > if(byte1 & 0x80) PORTA|=(1<<PA7); |
9 | > if(byte2 & 0x01) PORTB|=(1<<PB0); |
10 | > if(byte2 & 0x02) PORTB|=(1<<PB1); |
11 | >
|
Das reicht nicht.
1 | if (byte1 & 0x01) |
2 | PORTA |= (1 << PA0); |
3 | else
|
4 | PORTA &= ~(1 << PA0); |
5 | |
6 | if (byte1 & 0x02) |
7 | PORTA |= (1 << PA1); |
8 | else
|
9 | PORTA &= ~(1 << PA1); |
10 | |
11 | // etc. pp.
|
Aber auch das ist Unfug, denn es werden ja alle 8 Bits von PortA übertragen. Dann genügt auch
1 | PORTA = byte1; |
Ich würde das überhaupt nicht mit der Übertragung einer Bitfolge machen. Der Sender muss dezidiert sagen, welches Relais er ein bzw. ausschalten muss. Zb. @S05; // bedeutet: Set Relais Nummer 5 @S00; // bedeutet: Set Relais Nummer 0 @R04; // bedeutet: Reset Relais Nummer 4 Das @ am Anfang dient zur Synchronisierung, damit der µC erkennen kann wann ein Kommando beginnt. Das ; am Ende dient dem Abschluss eines Kommandos, damit der µC erkennen kann, wann eine Zahl zu Ende ist. Warum eigene Set und Reset Befehle: Dann muss der Sender nicht buchführen welches Relais gerade wie steht. Wenn er Relais Nummer 6 einschalten will, dann teilt er es dem µC auch genau so mit und muss nicht erst eine Gesamtansicht aller Relais erstellen um ein 10-Bit Datenwort zu erstellen in dem nur das Bit für Relais 6 anders ist. Das ist das eine. Das andere ist, dass es mit so einem 'Protokoll' leicht ist, das ganze ohne fertiges PC-Programm zu testen. Einfach ein Terminal an die serielle Schnittstelle anschliessen und ich kann das µC Programm testen, indem ich selbst entsprechende Kommandos schicke ohne da lang in Bits rumwühlen zu müssen. Und da es sich um Relais handelt, ist auch nicht damit zu rechnen, dass da grossartig viele Umsetzaktionen in der Sekunde kommen werden, d.h. das Ganze wird nicht sonderlich zeitkritisch sein, so dass ich mir einen (kleinen) Protokolloverhead erlauben kann.
Man weiß ja nicht, ob "hallo" eine Lichtorgel oder ein Atomkraftwerk damit steuern möchte. Evtl. wäre Prüfbit oder gar Hardwareverriegelung gegen Fehlprogrammierung oder Störimpulse nötig?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.