www.mikrocontroller.net

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


Autor: dertum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: dertum (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? :)

Autor: dertum (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
übrigens vielen dank Falk für den Tipp!!!!

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus F. (pippo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Code könnte z.B. so aussehen:
if(byte1 & 0x01) PORTA|=(1<<PA0);
if(byte1 & 0x02) PORTA|=(1<<PA1);
if(byte1 & 0x04) PORTA|=(1<<PA2);
if(byte1 & 0x08) PORTA|=(1<<PA3);
if(byte1 & 0x10) PORTA|=(1<<PA4);
if(byte1 & 0x20) PORTA|=(1<<PA5);
if(byte1 & 0x40) PORTA|=(1<<PA6);
if(byte1 & 0x80) PORTA|=(1<<PA7);
if(byte2 & 0x01) PORTB|=(1<<PB0);
if(byte2 & 0x02) PORTB|=(1<<PB1);

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus F. schrieb:
> Der Code könnte z.B. so aussehen:
>
>
if(byte1 & 0x01) PORTA|=(1<<PA0);
> if(byte1 & 0x02) PORTA|=(1<<PA1);
> if(byte1 & 0x04) PORTA|=(1<<PA2);
> if(byte1 & 0x08) PORTA|=(1<<PA3);
> if(byte1 & 0x10) PORTA|=(1<<PA4);
> if(byte1 & 0x20) PORTA|=(1<<PA5);
> if(byte1 & 0x40) PORTA|=(1<<PA6);
> if(byte1 & 0x80) PORTA|=(1<<PA7);
> if(byte2 & 0x01) PORTB|=(1<<PB0);
> if(byte2 & 0x02) PORTB|=(1<<PB1);
> 

Das reicht nicht.
if (byte1 & 0x01) 
  PORTA |= (1 << PA0);
else
  PORTA &= ~(1 << PA0);

if (byte1 & 0x02) 
  PORTA |= (1 << PA1);
else
  PORTA &= ~(1 << PA1);

// etc. pp.

Aber auch das ist Unfug, denn es werden ja alle 8 Bits von PortA 
übertragen.

Dann genügt auch
PORTA = byte1;

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So:


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.