Forum: Compiler & IDEs Schnelles Schalten mit Interrupt 3


von patrick b. (calalex)


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.

von Karl H. (kbuchegg)


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.

von Uwe (de0508)



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

von Karl H. (kbuchegg)


Lesenswert?

Falschen Beitrag erwischt?

von Patrick B. (p51d)


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)

von amateur (Gast)


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.

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.