Forum: Mikrocontroller und Digitale Elektronik Ausgänge dauernd neu (gleich) sezten schlecht?


von -Dani- (Gast)


Lesenswert?

Hallo,
Ich hätte eine Frage bzgl dem dauernden setzen von Ausgängen, ich frage 
mit einem Atmega16 immer wieder mehrere PINs ab und setze in der 
while(1)-Schleife immer wieder die Ausgänge und nur wenn eine bestimme 
Kombination an den PINs anliegt springt er in bestimme Unterfunktionen. 
Ist das schädlich für den µC wenn er andauernd Setzbefehle ausführt? Den 
Großteil der Zeit verbringt der µC ja in dieser Schleife mit dem 
Ausgänge setzen und nur selten muss er wirklich in eine der 
Unterprogramme springen (um z.B. die Variable zu ändern).
Erhöht sich dadurch auch der Stromverbrauch des µC?

Der while(1)-Schleifen-Ablauf sieht extrem stark vereinfacht und auf 
PINA beschränkt in etwas so aus:

while(1)
{
  switch (PINA)
  {case 255: break;
  case 191: calc_A();break;
  case 223: calc_A();break;
  case 239: calc_B(1);break;
  case 247: calc_B(2);break;
  case 251: calc_B(3);break;
  case 253: calc_B(4);break;
  case 254: calc_B(5);break;
  case 159: check_hold();break;
  }

        // ANDAUERNDES! Ausgänge setzen
  switch (VariableX[VariableY])
  {case 1: PORTB = VariableZ; break;
  case 2:  PORTB = VariableZ + 64; break;    //B6 zusätzlich setzen
  case 4: PORTB = VariableZ + 128; break;   //B7 zusätzlich setzen
  }

  //Aktualisiere Display
  display();

}
return 0;
}

Es geht mir hier wirklich nur darum ob es schädlich ist wenn der µC 
dauernd den selben Setzbefehl an einen PORT sendet, das der Code selbst 
nicht gerade elegant geschrieben ist weiß ich, aber er funktioniert so 
wenigstens schonmal :)

Wäre super wenn mir da jemand helfen könnte,
Lg Dani

von Lehrmann M. (ubimbo)


Lesenswert?

Schaden tut das nicht - wenn ich mir allerdings deinen Code so anschau 
sehe ich (ohne den Zusammenhang zu verstehen) ein paar Sachen.

-Dani- schrieb:
> // ANDAUERNDES! Ausgänge setzen
>   switch (VariableX[VariableY])
>   {case 1: PORTB = VariableZ; break;
>   case 2:  PORTB = VariableZ + 64; break;    //B6 zusätzlich setzen
>   case 4: PORTB = VariableZ + 128; break;   //B7 zusätzlich setzen
>   }

Was soll das denn darstellen?
Überleg mal was passiert, wenn du 2 mal hintereinander case 4 hast ... 
das ist ganzschön 'hässlich' programmiert: Das hier ist das richtige: 
http://www.mikrocontroller.net/articles/Bitmanipulation

von -Dani- (Gast)


Lesenswert?

Ok super, danke für die schnelle Antwort!
Es sollte eigentlich (und das ist auch so) gar nichts passieren wenn ich 
zweimal hintereinander case 4 habe, die VariableZ bleibt ja gleich (und 
ist immer <64 ).
(Das war ja genau die Frage ob das schädlich ist für die Ausgänge wenn 
er andauernd den exakt selben Ausgabebefehl ausführt)
Danke für den Link, ich kenne die Standard & und | Befehle nur das 
direkte Ansprechen eines einzelnen Pins müsst ich mir wirklich mal 
genauer drauf schaffen wenn ich endlich mal Zeit habe.

von AVR (Gast)


Lesenswert?

-Dani- schrieb:
> (Das war ja genau die Frage ob das schädlich ist für die Ausgänge wenn
> er andauernd den exakt selben Ausgabebefehl ausführt)

achte mal darauf das es nicht zu einem toggeln führt (bei neueren AVRs)
http://www.mikrocontroller.net/articles/Bitmanipulation#Neuere_ATmegas

von -Dani- (Gast)


Lesenswert?

Ich muss gestehen ich verstehe gerade nicht warum es dazu führen sollte 
das einer der Pins toggelt?

>   switch (VariableX[VariableY])
>   {case 1: PORTB = VariableZ; break;
>   case 2:  PORTB = VariableZ + 64; break;    //B6 zusätzlich setzen
>   case 4: PORTB = VariableZ + 128; break;   //B7 zusätzlich setzen

Ich gebe immer, egal in welchem der Cases, eine Zahl kleiner 64 
(VariableZ ist so gewählt) an der PORTB, d.h. dass die Pins B6 und B7 
NICHT gesetzt sind. Jetzt setze ich nur eben je nachdem was in 
VariableX[VariableY] steht zusätzlich noch B6 oder B7. Wie es soll es 
denn da zu einem toggeln kommen?

Und wie gesagt, klar das würde auch eleganter gehen aber der Code ist 
mittlerweile so riesig mit so vielen Unterfunktionen ich hab einfach 
keine Lust den Code jetzt nochmal umzuschreiben.

Zum Verständniss:
VariableY ist eine Presetnummer (immer die aktuell verwendete) und 
VariableX ist ein(es von mehreren) Array(s) die Daten zu den 
entsprechenden Presets gespeichert haben.
Der eigentliche Code ist einfach zu groß deswegen diese Reduzierung auf 
einen dadurch etwas unsinnig erscheinenden Codeausschnitt.

Aber nochmal eine Frage, bzw eigentlich diesselbe, macht das dem Display 
auch nichts aus wenn ich es dauernd aktualisiere?
Ich rufe gleichzeitig auch jedesmal die Unterfunktion display() auf die 
mir einige Variablen direkt an einem AV1624 angzeigt.

Lg Dani

von Dominique G. (dgoersch)


Lesenswert?

-Dani- schrieb:
> Danke für den Link, ich kenne die Standard & und | Befehle nur das
> direkte Ansprechen eines einzelnen Pins müsst ich mir wirklich mal
> genauer drauf schaffen wenn ich endlich mal Zeit habe.

Dank der vorhandenn Markos ist das doch wirklich einfach zu merken:
1
PORTB |=  (1<<PB6)    // PortB6 setzen
2
PORTB &= ~(1<<PB6)    // PortB6 löschen

Man sieht direkt was die entsprechende Zeile macht, somit ist das um 
Welten einfacher zu warten als irgendwelche arithmetischen Aktionen auf 
Portregister.

von Peter R. (pnu)


Lesenswert?

Das toggeln ist eine Eigenheit bei den pin-Registern einiger 
AVR-Kontroller.
Geht aber  nur das pin-Register an.

Beim Schreiben ins port-Register passiert nichts, was das ständige 
Wiederholen verbieten würde. Höchstens bei ständigem Pegelwechsel und 
kapazitiver Last am port KOENNTE eine Überlastung entstehen.

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.