interrupt Anpassungsprobleme

Gast #181600
Hallo zusammen,

vorab sei gesagt ich bin Neuling.
Im Konkreten will ich Code vom ATMega16 für den AT90CAN128 anpassen.
Folgendes funktioniert auf dem Mega16:
---------------------------------------------------------------
SIGNAL (SIG_OVERFLOW0)
{
  i++;
  TCNT0 = 55;
}

int main(void){
  volatile WORD i;
  TCCR0 = (1<<CS01);
  TCNT0 = 55;
  timer_enable_int(_BV(TOIE0));
  sei();
while(1){
//Programmcode
}--------------------------------------------------------------

Mein Versuch einer Anpassung war jetzt:
---------------------------------------------------------------
SIGNAL (SIG_OVERFLOW0A)
{
  i++;
  TCNT0 = 55;
}

int main(void){
  volatile WORD i;
  TCCR0A = (1<<CS01);
  TCNT0 = 55;
  timer_enable_int(_BV(TOIE0));
  sei();
while(1){
//Programmcode
}--------------------------------------------------------------

Leider wird nie in die SIGNAL Methode gesprungen.
Ich nun nicht mehr wo ich weiter suchen kann um heraus zu finden ob ich
noch mehr anpassen muß bzw. etwas falsch angepaßt habe. Wäre toll wenn
mir da einer bei helfen könnte.

Gruß Richy
Gast #181601
Was ist der SIG_OVERFLOW0A?

Ein timer kann nur einen OVERFLOW haben, also reicht SIG_OVERFLOW0
Etwas anderes währe ein compare match ;-)

Schau Dir mal die C:\WinAVR\avr\include\avr\iom128.h an, da sind
die möglichen SIGNALS definiert.
Gast #181602
Richtig, SIG_OVERFLOW0A ist sicher falsch.
Das A hat da nix zu suchen, soweit ich weiß hatte ich es auch mal ohne
dieses ausprobiert. Leider ohne Erfolg.

Irgendetwas anderes muß ich zusätzlich noch falsch machen.

Aber Danke für den Tipp:
C:\WinAVR\avr\include\avr\iom128.h
Das hat mich generell ein bischen weiter gebracht ... hab mir dann im
Verzeichnis auch die iocan128.h und io.h angesehen. Hat mein
Gesamtverständnis für .h Dateien voran getrieben.   :-)

Schönen Gruß,
Richy
Gast #181603
Ich hab' mir den Code noch ma angesehen, dabei ist mir noch
aufgefallen...

Wie schaffst Du es eine lokale variable (volatile WORD i; ist ja in
main() lokal) in einer SIGNAL routine zu inkrementieren, das kapier ich
nicht?

lege mal Dein "volatile WORD i;" als globale variable an ... oder
gibt es eventuell schon ein globales "i" - dann musst Du natürlich
das in main() entfernen.

 ;-)
Werner
Gast #181605
Ich dachte das tue ich mit:

  timer_enable_int(_BV(TOIE0));

Mir würde es auch helfen wenn mir jemand sagen könnte wo und wie ich
eine Dokumetation zu der Funktion timer_enable_int() bekommen kann.
Bzw. wie ich herausfinden kann welche Funktionen es sonst noch alles
gibt.

Im Anhang mein komplettes Programm ... ich versteh einfach nicht warum
die SIGNAL() nie aufgerufen wird. Wer kann mir helfen?

Gruß Richy
Angehängte Dateien:
Gast #181607
timer_enable_int() war ein Versuch, eine Abstraktion für
etwas einzuführen, bei der es dieses gar nicht Wert ist.
Guck einfach in das Headerfile, was da drin steht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.