www.mikrocontroller.net

Forum: Compiler & IDEs Programm mag ISR nicht


Autor: Anfänger (Gast)
Datum:

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

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du mal einen Blick auf das Compilat geworfen? Ist da überhaupt der 
ISR-Vector eingetragen?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tausch mal die main mit der ISR

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert problemlos bei mir.  OK, das Ersetzen des rotary encoders
mit den Tasten des STK500 ist bissel gewöhnungsbedürftig. ;-)

Du benutzt die neue Interruptvektor-Syntax, hast du eine hinreichend
aktuelle toolchain dafür (avr-libc >= 1.4.x)?

Autor: Anfänger (Gast)
Datum:

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

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

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

Autor: Anfänger (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aha..
Was sind die .sig dateien?
Kann die mit nichts öffnen.
Habe jetzt einen Ordner mit Namen "avr-libc-bin-1.4.5" wwohin damit?
Entschuldigung wenn ich so viel frage.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Anfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort.

55 & 73

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.