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
Gast #1252272
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
#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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.