www.mikrocontroller.net

Forum: Compiler & IDEs Parameter an Interrupt übergeben


Autor: Programmierjunkie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
int main (void) {


if (AUSWAHL == 1)
  hallo0(ZEIT);

if (AUSWAHL == 2)
  hallo1(ZEIT);


else
  funktion();

}


hallo0
{
  TIMSK0....
  TCCR0B= 0x01;

  sei();
}

hallo1
{
  TIMSK0....
  TCCR0B= 0x05;

  sei();
}

.
.

ISR (TIMER0_OVF_vect) 
{
  PORTB^= 0x04; 
}

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

Autor: ozo (Gast)
Datum:

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

Autor: Programmierjunkie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas W. (geier99)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Dann schreib es doch auch so:

  TCNT0 = 100;

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt

MFG
Falk

Autor: Programmierjunkie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Programmierjunkie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke

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

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

ISR (TIMER0_OVF_vect) 
{

}





 TCCR0A= 0x00;
  TCCR0B= 0x04;
  TIMSK0= 0x01;
  OCR0A= 0x0F;

ISR (TIMER0_COMPA_vect) 
{

}

Autor: Kuckuck (Gast)
Datum:

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

Autor: Eule (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... hast, das Fremdsprachen Zeitverschwendung sind

Eigentor...

Autor: Kuckuck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Eigentor...

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

Autor: Kuckuck (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
abgesehen davon ist

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

Autor: R. Freitag (rfr)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Goenninger (dg1sbg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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]

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.