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