Programm mag ISR nicht

Gast #528692
Lesenswert?

Hallo Spezialisten

Habe da ein Problem mit der ISR.
Wenn ich das Programm simuliere im AVR Studio 4.12 und WIN-AVR,
wird immer beim Timeroverflow zum Programmbeginn bei Main gesprungen.
Die ISR wird also nicht ausgeführt.
Beim Test auf dem STK500 tut sich auch nichts, außer daß die LED's
leuchten.

µC -> ATtiny2313

Was ist, mache ich falsch?
Weiß jemand etwas?

Schonmal vielen Dank


#include <avr/io.h>
#include <avr/interrupt.h>

volatile int8_t   enc_delta=0;      // -128 ... 127

int main( void )
{
  // rotary switch connection
  DDRD &= ~(_BV(PD0) | _BV(PD1)); // set to input
  PORTD |=(_BV(PD0) | _BV(PD1));  // enable pull up

  TCCR0B = 0x01;//1<<CS01;          //divide by 8 * 256
  TIMSK = 1<<TOIE0;         //enable timer interrupt

  DDRB = 0xFF;
  sei();
  for(;;)               // main loop
    PORTB = enc_delta;
}

ISR(TIMER0_OVF_vect)
{
  static uint8_t last_state = 0,last_cnt = 0;
  uint8_t new_state;

  new_state=PIND & (_BV(PIND1) | _BV(PIND0));
  if ((new_state^last_cnt)==(_BV(PIND1) | _BV(PIND0)) )
  {
    if ((new_state ^ last_state)==_BV(PIND1))
      enc_delta+=1;
    else
      enc_delta-=1;
    last_cnt=new_state;
  }
  last_state=new_state;
}
Gast #528945
Lesenswert?

Guten Morgen

Vielen Dank für die schnellen Antworten.
ein rotary encoder ist schon angeschlossen.
Einer mit 00/11 von Conrad.
Das Problem ist nur, daß die ISR nicht ausgeführt wird.
Auch nicht wenn in der ISR etwas ganz einfaches steht.
Z.B.: enc_delta = 0xAA und sonst nichts.
Unten stehende Warnungen werden noch ausgegeben.


../test999.c:11: warning: return type defaults to `int'
../test999.c: In function `ISR':
../test999.c:25: warning: control reaches end of non-void function

P.S.:
Wie stelle ich fest welche Vers. die Lib. hat?

Danke
#528971
Lesenswert?

Anfänger wrote:
> Unten stehende Warnungen werden noch ausgegeben.
>
>
> ../test999.c:11: warning: return type defaults to `int'
> ../test999.c: In function `ISR':
> ../test999.c:25: warning: control reaches end of non-void function

Das heist der Compiler hat deine Funktion nicht
als ISR erkannt.
Eine ISR hat korrekterweise keinen return type und wenn
alles richtig läuft, dann weiss der Compiler das auch.

Zieh die ISR mal vor das main. Überprüfe akribisch
jeden einzelnen Buchstaben der Interruptbezeichnung.
( Am besten schaust du in die io2313.h hinein, suchst
dir dort das #define dafür und kopierst den Namen mittels
Cut&Paste in dein Programm. )
Gast #528981
Lesenswert?

Habe jetzt die Include Dateien mit den ioxxx.h von WinAvr 4.11 genommen.
Damit funktioniert es. Keine Warnungen mehr. Die LED's zählen nun schön 
auf und ab.
Ich bin begeistert.

Herr Karl heinz GROßEN DANK für den Tipp.

Auch an die Anderen die geantwortet haben.

Wieder was gelernt. Klasse Forum.
Moderator Persönliche Seite #529001
Lesenswert?

> Habe jetzt die Include Dateien mit den ioxxx.h von WinAvr 4.11 genommen.

Schlechte Lösung.  Bitte installier' dir die komplette toolchain,
zumindest jedoch eine in sich konsistente Bibliothek.  Die gibt's
auch als binary distribution unter

http://download.savannah.gnu.org/releases/avr/

Kann man prinzipiell über die existierende (z. B. von WinAVR) drüber
installieren.

Ein Headerfile steht nicht im luftleeren Raum, es hat immer einen
Bezug zur Bibliothek, zu der es gehört.
Moderator Persönliche Seite #529060
Lesenswert?

Anfänger wrote:

> Was sind die .sig dateien?

Kryptographische Signaturen.  Damit sind die Archive unterschrieben.

> Kann die mit nichts öffnen.

GnuPG.

> Habe jetzt einen Ordner mit Namen "avr-libc-bin-1.4.5" wwohin damit?

Dahin, wo die bisherige Bibliothek installiert war.  C:/WinAVR
vermutlich.  Also nur die Dateien aus den Unterverzeichnissen
dorthin schaffen, da bleibt dann wohl ein leeres Verzeichnis
avr-libc-bin-1.4.5 übrig am Ende.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren