Schnelles Schalten mit Interrupt 3

#3209811
Lesenswert?

Bezugnehmend auf [[Beitrag "Schnelles Schalten mit Interrupt 2"]]

Im Fall der Interrupt wird ausgelöst und der Port geschaltet...
1
ISR (TIMER1_COMPA_vect)
2
{
3
  PORTA |=(1<<PA0);          // falls kein Puls PA0 aktivieren
4
}

wie lange wird der Port geschaltet oder bleibt der dann aktiv? kann man 
auch hier ein Unterprogramm starten lassen, das eine Endlosschleife 
ausführt?

kann man globale Interrupts mit sei(); auch erst nach einem Tastendruck
aktivieren?
1
if(!(PIND &(1<<PD7)))
2
{
3
  sei();  
4
}

oder ist das ungeschickt? Ich würde das Programm gern erst
aktivieren, wenn man eine Button drückt.
#3209870
Lesenswert?

patrick bateman schrieb:
> Bezugnehmend auf [[Beitrag "Schnelles Schalten mit Interrupt 2"]]
>
> Im Fall der Interrupt wird ausgelöst und der Port geschaltet...
>
>
1
> 
2
> ISR (TIMER1_COMPA_vect)
3
> {
4
>   PORTA |=(1<<PA0);          // falls kein Puls PA0 aktivieren
5
> }
6
>
>
> wie lange wird der Port geschaltet oder bleibt der dann aktiv?


Das sind jetzt aber schon Grundlagen.

Warum soll der denn von alleine einen anderen Zustand einnehmen.
Das wäre ein klein wenig ungeschickt, wenn ein µC da ein Eigenleben 
entwickelt. Ein stink normaler Portpin (also keiner der auf 
Spezialfunktion wie PWM oder dgl. geschaltet wurde) behält seinen 
Zustand bei, bis dein Programm ihn ändert. Hast du denn nie LED blinken 
lassen?

> kann man
> auch hier ein Unterprogramm starten lassen, das eine Endlosschleife
> ausführt?

können tust du schon. Aber dann kommt das Programm nie aus der 
Endlosschleife zurück und daher wird dann auch nie der INterrupt fertig 
und da während der Behandlung eines Interrupts alle Interrupts gesperrt 
sind, kommt dann auch kein anderer Interrupt mehr durch. Ganz abgesehen 
davon, dass dann auch der Stack nie aufgelöst wird. etc.

d.h. 'können' tust du schon. In dem Sinne, dass dich keiner daran 
hindern kann. Aber schlau ist es nicht.

>
> kann man globale Interrupts mit sei(); auch erst nach einem Tastendruck
> aktivieren?

sicher. Warum soll man das nicht können.
Der µC kann sich ja nicht wehren. Was du programmierst, das macht der. 
Die Frage ist halt immer, ob das was du programmierst auch Sinn ergibt.

> oder ist das ungeschickt? Ich würde das Programm gern erst
> aktivieren, wenn man eine Button drückt.


Das 'Programm aktivierst' du überhaupt nicht. Denn 'das Programm' läuft, 
sobald der µC Saft bekommt.
Aber nichts und niemand hindert dich daran, dass du dir zb Variablen 
einführst, die ganz per Abfragen dazu führen, dass Programmteile 
übersprungen werden, wenn die Variablen bestimmte von dir definierte 
Werte haben.

Und wieder die Frage:
Hast du denn nie mit den üblichen Anfänger-Übungen angefangen, also LED 
einschalten, LED ausschalten, LED blinken lassen, diverse LED-Muster 
blinken lassen, Lauflicht von links nach rechts, von rechts nach links 
etc. etc. etc.
Das rächt sich eben jetzt alles, wenn man denkt das braucht man alles 
nicht.
#3211284
Lesenswert?

Hallo,

hier noch ein Anmerkung zu Atmel µC und natürlich auch alle anderen, die 
genügend Strom für das Treiben von LED zur Verfügung stellen können.

Mit dem Charlieplexing Verfahren, kann man mit n Port-Pins n * (n-1) LED 
ansteuern.

Den Quelltext des C-Programms habe ich aus dem INet,
Quelle: http://www.the-powl.de/knowhow/charlieplexing/index.php
#3214191
Lesenswert?

patrick bateman schrieb:
> Bezugnehmend auf [[Beitrag "Schnelles Schalten mit Interrupt 2"]]
>
> Im Fall der Interrupt wird ausgelöst und der Port geschaltet...
>
>
1
> 
2
> ISR (TIMER1_COMPA_vect)
3
> {
4
>   PORTA |=(1<<PA0);          // falls kein Puls PA0 aktivieren
5
> }
6
>
>
> wie lange wird der Port geschaltet oder bleibt der dann aktiv? kann man
> auch hier ein Unterprogramm starten lassen, das eine Endlosschleife
> ausführt?

Blöde Frage, aber funktioniert dieser Code überhaupt? Ich habe schon 
länger nicht mehr mit AVRs gearbeitet, aber bei STMs kann man kein 
schlaues Pin-Handling mehr erreichen, wenn man einen Pin einem HW-Modul 
(Timer, DAC...) zugeordnet hat.

@Patrick Bateman
Wie schon erwähnt wurde erweckst du den Eindruck, dass du einfach einmal 
darauf los programmierst ohne dass du die Grundlagen kennst. Bevor ich 
mit Interrupts angefangen habe, habe ich fast 9 Monate pro Woche 3 
kleine Programme geschrieben um mich mit C vertraut zu machen (String, 
UART, ADC, Timers, Inputs... das alles kann man auch ohne Interrupts)
Gast #3214316
Lesenswert?

@Patrick

Da gibt's ein paar wenns.

Wenn Du Port A0 zum Ausgang gemacht hast.

Wenn Dein Timer1 richtig initialisiert wurde.

Wenn der zugehörige Vorteiler aktiv ist.

Wenn die Unterbrechungen aktiviert wurden.

Dann wird der Port gesetzt (eingeschaltet) und beim nächsten Mal 
eingeschaltet und beim nächsten Mal...

Das ganze bis zum St. Nimmerleinstag, der Strom ausfällt oder jemand 
kommt der das Teil wieder abschaltet.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren