Forum: Compiler & IDEs interrupt Anpassungsprobleme


von Richy (Gast)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?

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.

von Richy (Gast)


Lesenswert?

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

von Werner B. (Gast)


Lesenswert?

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

von Michael Wilhelm (Gast)


Lesenswert?

TIMSK muß noch korrekt beschrieben werden.

MW

von Richy (Gast)


Angehängte Dateien:

Lesenswert?

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

von Richy (Gast)


Lesenswert?

Oh doch, du hattest Recht!
Ein  TIMSK0 |= 1;  hat all meine Probleme behoben.

Danke

von Jörg Wunsch (Gast)


Lesenswert?

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.

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.