Hmmm. Ich hoffe, dass ich Dich richtig verstanden habe.
Das gemeinsame Ein- und Ausschalten aller Interrupts ist normalerweise kein Problem, sondern so vorgesehen.
Um einzelne Interruptquellen zu maskieren, gibt es (normalerweise) ein Interrupt-Maskierungs-Register.
Das scheint sogar bei den ATtiny und dem ATmega für einzelne Pins zu funktionieren.
PCMSK – Pin Change Mask Register
Datenblatt ATtiny24/44/84 (7701G–AVR–02/15)
Seite 47 und 48
Vielleicht ist es das, was Du suchst.
Geändert von Moppi (09.08.2019 um 01:11 Uhr)
Verstehe!
Sowohl beim Timer-Interrupt als auch bei PortChange-Interrupt habe ich immer alles Eingeschaltet.
Über Funktionen könnte ich auch Pin-genaue Konfiguration gewährleisten. Hier könnte ich über ausgelagerte Funktionen immer nur einen Bit im Register PCMSK0 ein/ausschalten.
So sah bis lang mein PortChange-Interrupt-Konfig aus;
Code:int main(void) { DDRB |= (1<<PB0); DDRA |= (1<<PA6); DDRA &= ~((1<<PA4)|(1<<PA5)); //Interrupt-Routine wird defeniert GIMSK = (1<<PCIE0); // Bank0 wird eingeschaltet (PA0-PA7) // BANK1 beinhaltet PB0-PB3 PCMSK0 = (1<<PCINT4)|(1<<PCINT5); // PCINT4(PA4) und PCINT5(PA5) könnte Interrupt auslösen sei(); // Interrupt´s werden gestartet LEDaus(); SUMaus(); StartBlock(); while(1) { } }
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Hallo.
Habe wieder einwenig Zeit zu experimentieren.
Bei meinem derzeitigen Schritt geht es darum, innerhalb der while(1), oder eines ISR bestimmte Pin ein- oder auszuschalten.
Folgender Versuch klappt nicht - PA5 bleibt dauerhaft im Eingangs-Modus.
Aber warum?Code:LEDgn_ein(); DDRA &= ~(1<<PA5); // Eingang! _delay_ms(1000); LEDgn_aus(); DDRA |= (1<<PA5); //Ausgang, somit kein Eingang? _delay_ms(1000);
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Wie kommst du darauf dass es nicht funktioniert?! Misst du mit einem Messgerät? Hast du in PORTA denn auch PA5 gesetzt?
Nur weil du den Pin aus Ausgang stellst gibt er nicht automatisch ein High Signal aus, du musst auch das PA5 im PORTA setzen, damit er den Ausgang high setzt.
Das DDR bestimmt nur ob dein Pin aktiv (5V mit PA5 in PORTA oder GND ohne PA5) oder passiv (High-Z oder Pull Up wenn PORTA gesetzt ist) ist
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
__________________________________________________ _
| Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |
Sorry das ist etwas zu kurzsilbig, ich versteh der Satz gerade nicht mal
Der ISR und auch das PIN Register funktionieren unabhängig vom DDR Register!
du musst den Interrupt also schon aus/blindschalten und dann den Pin über das PORT Register entsprechend setze.Observe that, if enabled, theinterrupts will trigger even if the INT0 or PCINT[5:0] pins are configured as outputs
Der Taster an einem auf output geschalteten Pin bedeutet natürlich auch ein Kurzschluss, ist also generell nicht empfehlenswert!
Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
nicht.
Bei solchen Dingen musst du aufpassen. Du kannst einen Kurzschluss erzeugen.
Wie sieht deine Schaltung aus?
Der Programmteil ist in Ordnung und sollte so funktioieren. Es kann sein das du es noch irgendwo anders änderst (ungewollt). Was macht "LEDgn_ein();" bzw "LEDgn_aus();" genau (Led ein/ausschalten ist klar, wie sieht aber die Funktion aus).
Ich würde das aber etwas anders lösen. Du hast einmal das Eingangsbit von PA5 und einmal ein "Merkerbit" mit dem du das einlesen "freigibst". Diese beiden Bits verknüpfst du mit einem "Und".
MfG Hannes
Lesezeichen