Forum: Mikrocontroller und Digitale Elektronik Relais ansprechen über schnittstelle?


von dertum (Gast)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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

von dertum (Gast)


Lesenswert?

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? :)

von dertum (Gast)


Lesenswert?

übrigens vielen dank Falk für den Tipp!!!!

von Otto (Gast)


Lesenswert?

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

von Markus F. (pippo)


Lesenswert?

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);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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;

von sven (Gast)


Lesenswert?

So:


PORTA = byte1;
PORTB = PORTB & 0x03 | byte2;

von Karl H. (kbuchegg)


Lesenswert?

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.

von oszi40 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.