www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik probleme mit der isr


Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab ein Problem beim abarbeiten meiner ISR (Timer Compare Match). 
Jedesmal wenn der Interrupt ausgelöst werden würde, wird sofort resetet. 
Ich hab das mit einem Debugger (dem AVR Dragon) getestet. Beim 
Breakpoint der am Anfang der ISR steht, wird nie angehalten. Dafür wird 
immer wieder vor die Endlosschleife gesprungen (Reset)
Ich verwende einen AT90PWM316. Fuses sind alle gelöscht. (Bis auf DW 
natürlich, damit wird getestet.)

Hat jemand eine Ahnung woran das liegen könnte.

Hier die Initialisierung des Timers:
OCR1A = incr;
TCCR1A |= (1<<COM1A0);  //OC Pin toggelt
TCCR1B |= ( (1<<WGM12) | (1<<CS10) ); //prescaler = 1 & CTC Modus
TIMSK1 |= (1<<OCIE1A);

und hier der Aufruf der ISR:
ISR (TIMER1_COMPA_vect)
{
  clk = (!clk) ? 1:0;
  if (!clk)
    clk_wert=1;
  else
    clk_wert=0;
}

Vielen Dank im Voraus

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falscher Controller eingestellt?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
>   clk = (!clk) ? 1:0;
Warum so kompliziert? ein einfaches
clk ^= 1;
tut's auch...

Und
>   if (!clk)
>     clk_wert=1;
>   else
>     clk_wert=0;
wäre dann äquivalent zu
clkwert = !clk;

Der Sinn des ganzen erschließt sich mir aber nicht. Zwei Variablen, von 
denen eine nur "nicht" die andere ist...

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab schon nachgeschaut, aber hab den richtigen µC eingestellt.
Sowohl beim Debugger als auch bei den Projekt Options.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupt global freigegeben?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, interrupt ist global freigegeben.
Wenn ich sei() deaktiviere (oder bei der Initialisierung des Timers das 
Interrupt Enable Bit nicht setze) wird auch kein Reset durchgeführt.

btw du hast recht, der code ist umständlich geschrieben. bin heute recht 
müde, hab ihn aber schon umgeschrieben. danke

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Jedesmal wenn der Interrupt ausgelöst werden würde, wird sofort resetet.

So etwas deutet fast immer auf einen Interrupt ohne ISR hin. Vektorname 
richtig? Im .lss-File überprüft, ob da etwas in der Sprungtabelle 
eingetragen ist? Richtigen Interrupt freigegeben?

Oliver

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

Bewertung
0 lesenswert
nicht lesenswert
Hast du vielleicht noch einen anderen Interrupt freigegenben, für den es 
keine ISR gibt?

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Immer das Gleiche... wo ist der ganze Code?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab ihn den Anhang jetzt die .lss datei gehängt. Und hier ist der ganze 
Code:
#include "i2c.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

char run=0, clock=1, transmit=0, transmit_data;
char receive=0, receive_data, ready=0, clk=0, clk_wert=0;
unsigned int incr=0;

void i2c_init(int frequenz)
{
//frequenz bestimmen:
  incr = 9; //400kHz
  DDRD |= ( (1<<DATEN) | (1<<CLOCK) );
  S_DELAY;
  PORTD |= (1<<DATEN);  //Daten High && Clock High --> !bsy
  PORTD |= (1<<CLOCK);
  run=0;
  clk=0;
}

char i2c_clk_ready(void)
{
  char x=0;

  while(!clk)
  {
    ++x;
    S_DELAY;
    if (x >= 20)
      return 1;
  }
  return 0;
}

//read = 1, write = 0
char i2c_start(char adresse, char r_w)
{ 
  char x;
  run = 1;
//start Bedingung: Daten wechsel von 1 auf 0
  if (i2c_clk_ready())
  {
    PORTD |= (1<<DATEN);
    PORTD |= (1<<CLOCK);
    S_DELAY;
    PORTD &= ~(1<<DATEN);
    M_DELAY;
    M_DELAY;
    M_DELAY;
    PORTD &= ~(1<<CLOCK);
    S_DELAY;
  }

//SCL fängt an zu schwingen
  OCR1A = incr;
  TCCR1A |= (1<<COM1A0);  //OC Pin toggelt
  TCCR1B |= ( (1<<WGM12) | (1<<CS10) ); //prescaler = 1 & CTC Modus
  TIMSK1 |= (1<<OCIE1A);
  TIFR1 |= ( (1<<OCF1B) );
  
  if (TIFR1 & (1<<OCF1A))
  {
    clk = (!clk) ? 1:0;
    if (!clk)
      clk_wert=1;
    else
      clk_wert=0;
  }
  return 0;
}

void i2c_transmit_data(char data)
{
  transmit_data = data;
  ready=0;
  run=1;
}

char i2c_receive_data(void)
{
  return receive_data;
}

void i2c_stop(void)
{
  char bsy=0;
  do
  {
    if (PORTD & 2)
    {
      PORTD |= (1<<DATEN);
      bsy=1;
      run=0;
    }
    else
      bsy=0;
  }while(bsy);

  PORTD |= ( (1<<CLOCK) | (1<<DATEN) ); //Daten & Clk = 1
  run=0;
}

char i2c_ready(void)
{
  return ready;
}

ISR (TIMER1_COMPA_vect)
{
  clk ^= 1;
}

ISR (TIMER1_COMPB_vect)
{
  char x=0;
  ++x;
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und hier ist der ganze Code:

Ohne main() ist das niemals der ganze Code. Die Frage ist nicht, wo du 
den Fehler vermutest, sondern, wo er wirklich ist.

Oliver

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der main() ist der Fehler nicht, da ist nur ein Aufruf der Funktion 
init und start.
Aber hier ist die main:
#include <avr/io.h>
#include <avr/interrupt.h>
#include "i2c.h"

int main(void)
{
  char i=0;
  DDRD |= ( (1<<DATEN) | (1<<CLOCK) );
  sei();
  i2c_init(400);
  while(1)
  {
    i2c_start(0xA3, 1);
  }
  return 0;
}


Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>main.c:1:17: error: i2c.h: No such file or directory

und noch ca. 30 folgende Fehler.

Also nochmal:
>Immer das Gleiche... wo ist der ganze Code?

Zip das kompilierbare vollständige Programm zusammen, und häng es hier 
an. Quellcode-Einzelstücke aus verschiedenen Testversionen bringen 
nichts.

Und:

>In der main() ist der Fehler nicht,
Wenn du wüsstest, wo der Fehler ist, müsstest du hier nicht fragen :-)
ISR (TIMER1_COMPB_vect)
Eine ISR, die nicht freigegeben ist. Warum?

Oliver

Autor: gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Im Anhang ist die rar Datei.

Hoffe ihr könnt damit was anfangen.

btw vielen dank @ oliver für die zeit die du bis jetzt
erübrigt hast. ^^

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gast wrote:
>
> ISR (TIMER1_COMPB_vect)
> {
>   char x=0;
>   ++x;
> }
> 
Das ist wohl ziemlich witzlos, eine Variable zu definieren und zu 
inkrementieren, die sofort danach schon nicht mehr existiert. Die ISR 
kannste auch komplett leer lassen, hat den selben Effekt, da mit x 
nichts gemacht wird und es beim nächsten Aufruf der ISR sowieso wieder 
auf 0 gesetzt wird...

Übrigens:
.rar ist ein ganz schlechtes Format für ein Hilfeersuchen...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>.rar ist ein ganz schlechtes Format für ein Hilfeersuchen...

dito...

Oliver

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das Problem gelöst.
Das Interrupt File war falsch. In der Define war der vector 13 
angegeben. Jetzt hab ich alles neu installiert, als define ist vector 12 
angegeben und es funktioniert.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Worte hör ich wohl, allein mir fehlt der Glaube...

Oliver

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du es nicht glaubs, probier es bei dir aus.
Wenn du das richtige Interrupt File hast muss es gehen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was zum Geier ist ein "Interrupt File"? Und warum hattest Du ein 
falsches?

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.