Das 5V ein High ist, ist normal. Die Frage ist, wie hast du den Taster angeschlossen (gegen 5V oder Masse, Verwendest du einen Widerstand)?
Normalerweise gibt es kein Problem, solltest du aber versehentlich den Port schalten und du die Taste dürcken, hast du ein Problem (z.B. Ausgang auf high und Taste auf Masse). Es reicht schon wenn du dich verschreibst.
MfG Hannes
Du hast natürlich Recht - in diesem Fall kann nichts passieren - man/ich sollte aber "Narrensicher" entwickeln, könnte ja mal in andere Hände gelangen.
Mittlerweile halte ich die Lösung mit der Ein/Ausgangs-Umschaltung für praxisfern.
Vielleicht ist eine andere Variante mit dem "Stummschalten" durch volatile-Variablen sinnvoll.
Bsp:
Im main(), sequneziell PA4 und/oder PA5; Variable "PA4freischalt=1;", "PA5freischalt=1;"
Innerhalb des ISR (Timer) oder dessen Funktionsaufruf; if (PA4freischalt == 1) {} // Eingangsimpuls wird weiter verarbeitet
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Das ist die Variante die ich gemeint habe. Ich würde aber eine Bytevariable nehmen und einzelne Bits einem Eingang zuordnen. Bei dir ist es "Resourcenverschwendung" weil du für jeden Eingang eine Bytevariable verwendest.
Also z.B. eine Hilfsvariable "char hilfsvariable" => Bit 0 = Freigabe PA4, Bit 1 = Freigabe PA5
Der Code sieht dann so aus
Das gleiche gilt auch für PA5. Die Schleife wird nur ausgeführt wenn PA4 == 1 und hilfsvariable == 1.Code:if ((PINA & (1<<PA4)) && (hilfsvariable & (1<<0))){...}
MfG Hannes
Verstehe, das Prinzip ist ok, aber zu viel Speicherplatz verschwendet wenn zB. 10 Eingänge ins Spiel kommen. Hier ist mir (als Anfänger) die transparenz und einfacherere Lesbarkeit wichtig!
Ich hatte nur bedenken wegen der Übersicht bei mehreren volatile-Variablen. Sehe hier aber keinen Ausweg.
- - - Aktualisiert - - -
Ist es eigentlich normal, dass bei Timer-ISR mehrere volatile-Variable eingesetzt werden?
Folgend schon wieder eine, nur um einen Intervall-Zähler zu erhalten;
Code:volatile uint8_t EingIntervall=0; ISR(TIM1_COMPA_vect) { OverflowZaehler++; EingIntervall++; if(OverflowZaehler >= 60000) // 1ms*60 000 = 1Min { OverflowZaehlerReset(); } if (EingIntervall==10) // alle 10[ms] werden die Eingangskontakte abgefragt { RegA_KontaktAbfrage(); // Eingänge auf Veränderung analysiert EingIntervall=0; } }
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Meiner Meinung nach ist es nicht besser lesbar. Wie man die Hilfsvariable nennt ist egal, mann kann sie z.B. auch "FreigabeEingaenge" oder sonst wie nennen.
Ob man 1 Variable benötigt, oder 3 wird egal sein. Wenn man aber mehrere hat und so arbeitet bekommt man irgendwann ein Speicherproblem (z.B. wenn man Eingänge eines ganzen Ports steuern will). Deswegen sollte man sorgsam mit den Resourcen umgehen.
Man kann auch mit #define arbeiten.
z.B.
Wenn du es nutzen willst schreibst du:Code:#define PA4_ein hilfsvariable |= (1<<0) #define PA4_aus hilfsvariable &= ~(1<<0) #define PA4_freigabe hilfsvariable & (1<<0)
Code:PA4_ein; // PA4 freigeben PA4_aus; // PA4 sperren if ((PINA & (1<<PA4)) && PA4_freigabe) {...} // Abfrage auf PA4 und Freigabe PA4
Bei der ISR kann man es so machen wie du und mehrere Variablen nehmen, oder du konfigurierst die ISR so das du alle 10ms einen Interrupt bekommst (geht nicht immer).
Wenn man z.B. alle 10ms einen Int haben will muss man den Timer so anpassen das du, wenn du den Timer von 0-Max laufen lässt, über die 10ms kommst (Prescaler anpassen). Anschließend musst du einen "Startwert" für den Timer ausrechnen. Den musst du in der ISR jedes mal neu übergeben. Also wenn du z.B. bei einem 8bit Timer jede ISR den Wert 250 in das TCNT Register schreibst zählt er von 250 bis 255 und löst dann wieder einen Int aus.
MfG Hannes
Dieser Timer ist als Generaltaktgeber (1ms) für das gesamte Prog konfiguriert.
Da hängen später auch Zeitstufen/Countdownzähler etc drann.
Die Idee mit #define finde ich gut!
Auch die LED-Steuerungen, LEDgn_ein() etc. könnte ich direkt mit #define bestimmen.
Wo siehst du die Grenze zw. Funktion() und #define ?
Code:#define LEDgn_ein PORTB |= (1<<PB0) #define LEDgn_aus PORTB &= ~(1<<PB0) // statt void LEDgn_ein(void) // LED einschalten { PORTB |= (1<<PB0); } void LEDgn_aus(void) // LED ausschalten { PORTB &= ~(1<<PB0); }
Geändert von frabe (15.08.2019 um 14:01 Uhr)
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Lesezeichen