Forum: Compiler & IDEs Parameter an Interrupt übergeben


von Programmierjunkie (Gast)


Lesenswert?

Hallo

ich habe mehrere Funktionen. Ich will in den Funktionen bestimmen welche 
Leds leuchten sollen und wie schnell.

Am Ende kommt man ja in die ISR()-Funktion. Kann man da Parameter 
übergeben.
1
int main (void) {
2
3
4
if (AUSWAHL == 1)
5
  hallo0(ZEIT);
6
7
if (AUSWAHL == 2)
8
  hallo1(ZEIT);
9
10
11
else
12
  funktion();
13
14
}
15
16
17
hallo0
18
{
19
  TIMSK0....
20
  TCCR0B= 0x01;
21
22
  sei();
23
}
24
25
hallo1
26
{
27
  TIMSK0....
28
  TCCR0B= 0x05;
29
30
  sei();
31
}
32
33
.
34
.
35
36
ISR (TIMER0_OVF_vect) 
37
{
38
  PORTB^= 0x04; 
39
}

Wie kann ich von den Funktionen Parameter an ISR schicken welche Leds 
leuchten sollen.

Was mich noch interessieren würde, wie kann man die Prescaler aufteilen.

Da gibt es ja TCNT und OCR0A aber ich erkenne da nicht den Unterschied.

Es geht übrigens um einen AT90.. Mikrocontroller von Atmel

MfG

von ozo (Gast)


Lesenswert?

C-style Parameterübergabe geht bei Interrupts nicht. Nimmt globale 
Variablen - 'volatile' nicht vergessen!

von Programmierjunkie (Gast)


Lesenswert?

Wie kann ich noch den Timer einstellen dass er nicht von 0-255 zählt 
sondern zb. von 100-255. Ich blicke bei den englischen Datenblättern 
nicht durch was der Unterschied zwischen TCNT und OCROA ist.

von Andreas W. (geier99)


Lesenswert?

Bei Init:

TCNT0=0x64;   // Timer counter auf 100d setzen :-)

und ebesnos in der Interruptroutine (Timerovreflow) setzen

Damit der Timer auch immer bei 100d anfängt zu zählen


TCNT ist das Timerzähler-Register welches zyklisch inkrementiert wird

OCR0A – Timer/Counter0 Output Compare Register A
Wenn der Timer/Counter im Output Compare Match Modus betrieben wird, 
steht hier der Wert drin, der mit dem TCNT Register verglichen wird, und 
bei Übereinstimmung wird ein Interrupt ausgelöst.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> TCNT0=0x64;   // Timer counter auf 100d setzen :-)

Dann schreib es doch auch so:

  TCNT0 = 100;

von Falk B. (falk)


Lesenswert?

Siehe Interrupt

MFG
Falk

von Programmierjunkie (Gast)


Lesenswert?

@Falk Brunner

Unter Interrupt habe ich eigentlich nichts gefunden was mir weiterhilft.



Ich habe mir mal das Tutorial zum Timer durchgelesen. Ist es so richtig:

Wenn ich TCNT auf 100 setze dann zählt der Timer immer von 100-255 und 
löst einen Interrupt aus.

Wenn ich OCROA auf 100 setze dann zählt der TCNT immer bis 100 und wird 
mit dem OCROA Wert verglichen. Wenn sie gleich sind dann wird der 
Interrupt ausgelöst und TCNT wieder auf 0 gesetzt.

Somit könnte ich mir aussuchen um TCNT oder OCROA verwende.


TOEI brauche ich dass die ISR-Funktion bei einem Overflow ausgelöst 
werden kann.



>TOV0 (Timer/Counter Overflow Flag Timer/Counter 0)

>Dieses Bit wird vom Controller gesetzt, wenn beim Timer 0 ein Überlauf >des 
Datenregisters stattfindet.

Wird bei einem Overflow TOV auf 1 gesetzt. Kann mir nicht richtig 
vorstellen für was ich TOV brauche.

von Falk B. (falk)


Lesenswert?

@  Programmierjunkie (Gast)

>Unter Interrupt habe ich eigentlich nichts gefunden was mir weiterhilft.

Dann mach mal die Augen auf. Man kann nicht nur von der ISR ins 
Hauptprogramm Daten übergeben, sondern auch anders herum. Auf dem 
gleichen Weg.

>Wenn ich TCNT auf 100 setze dann zählt der Timer immer von 100-255 und
>löst einen Interrupt aus.

TCNT ist das eigentlich Zählregister. Schreiben tut man das so gut wie 
nie. Man nutzt beim AVR den CTC Modus.

>Wenn ich OCROA auf 100 setze dann zählt der TCNT immer bis 100 und wird
>mit dem OCROA Wert verglichen. Wenn sie gleich sind dann wird der
>Interrupt ausgelöst und TCNT wieder auf 0 gesetzt.

Genau.

MFG
Falk

von Programmierjunkie (Gast)


Lesenswert?

Danke

Ich habe da aber noch ein Problem. Beim oberen Beispiel springt es ins 
ISR
aber beim unteren nicht.

1
 TCCR0A= 0x00;
2
    TCCR0B= 0x04;
3
    TIMSK0= 0x01;
4
5
ISR (TIMER0_OVF_vect) 
6
{
7
8
}
9
10
11
12
13
14
 TCCR0A= 0x00;
15
  TCCR0B= 0x04;
16
  TIMSK0= 0x01;
17
  OCR0A= 0x0F;
18
19
ISR (TIMER0_COMPA_vect) 
20
{
21
22
}

von Kuckuck (Gast)


Lesenswert?

Datenblatt lesen oder den Tag verfluchen an dem DU entschieden hast, das 
Fremdsprachen Zeitverschwendung sind.

von Eule (Gast)


Lesenswert?

> ... hast, das Fremdsprachen Zeitverschwendung sind

Eigentor...

von Kuckuck (Gast)


Lesenswert?

>Eigentor...

So? Schon mal das Gehirn benutzt? Hier ging es nicht um Rechtschreibung.

von Kuckuck (Gast)


Lesenswert?

abgesehen davon ist

"Eigentor..." nun auch nicht der Grammatik letzter Schluss. Falls Du das 
auch nicht schnallst: Das ist kein vollständiger Satz.

von R. F. (rfr)


Lesenswert?

Hi all,

das Konzept von C kennt keinen Interrupt. desswegen kann man auch keine 
Parameter an diesen übergeben. C kennt nur das Konzept der Funktionen, 
an die Parameter übergeben werden können. Bei den Interrupts kann man 
mit dem gleichem Mechanismus die Parameter übergeben wie das auch in C 
an die Funktion passiert, also per Stack oder per Register. Nur ist das 
in der Programmiersprache nicht implementiert.

Grüsse

Robert

von Frank G. (dg1sbg)


Lesenswert?

Programmierjunkie schrieb:
> Hallo
>
> ich habe mehrere Funktionen. Ich will in den Funktionen bestimmen welche
> Leds leuchten sollen und wie schnell.

Ähm - nochmal: Wie "schnell" die LEDs leuchten sollen?

Meinst Du

1. Wie lange die LEDs leuchten sollen?
2. Nach welcher Zeit die LEDs leuchten sollen?
3. ???

> Am Ende kommt man ja in die ISR()-Funktion. Kann man da Parameter
> übergeben.

Wie willst Du denn in die ISR Funktion kommen? Periodisch, also immer 
wieder und dann wird geprüft, welche LEDs an sein sollen, die werden 
dann eingeschaltet und brennen eine gewählte Zeit und gehen dann wieder 
aus?

Soll immer nur eine LED gleichzeitig brennen oder mehrere? Wodurch 
werden die LEDs "eingeschaltet" ?

Am besten Du versuchst die Anforderungen nochmals klar zu beschreiben, 
dann kann man Dir auch helfen ;-)

Grüßle aus dem Schwabenländle

  Frank

von Rolf Magnus (Gast)


Lesenswert?

> das Konzept von C kennt keinen Interrupt. desswegen kann man auch keine
> Parameter an diesen übergeben.

Man kann keine Parameter an sie übergeben, weil man sie nicht aufruft.

> C kennt nur das Konzept der Funktionen, an die Parameter übergeben
> werden können. Bei den Interrupts kann manmit dem gleichem Mechanismus
> die Parameter übergeben wie das auch in C an die Funktion passiert, also
> per Stack oder per Register.

Und wie sollte man das erreichen?

von Karl H. (kbuchegg)


Lesenswert?

Programmierjunkie schrieb:

>
>  TCCR0A= 0x00;
>   TCCR0B= 0x04;
>   TIMSK0= 0x01;

Drösel dir doch bitte einmal auf, welchen Interrupt du hier freigibst. 
Es gibt so eine schöne Schreibweise, in der man das deutlich sieht. Wenn 
du sie benutzen würdest könntest du den Fehler selber sehen

>   OCR0A= 0x0F;
>
> ISR (TIMER0_COMPA_vect)
> {
>
> }[/c]

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.