Relais ansprechen über schnittstelle?

Gast #1252121
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
#1252173
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
#1252322
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);
Persönliche Seite #1252455
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;
#1252490
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.

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