Forum: Mikrocontroller und Digitale Elektronik probleme mit der isr


von gast (Gast)


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:
1
OCR1A = incr;
2
TCCR1A |= (1<<COM1A0);  //OC Pin toggelt
3
TCCR1B |= ( (1<<WGM12) | (1<<CS10) ); //prescaler = 1 & CTC Modus
4
TIMSK1 |= (1<<OCIE1A);

und hier der Aufruf der ISR:
1
ISR (TIMER1_COMPA_vect)
2
{
3
  clk = (!clk) ? 1:0;
4
  if (!clk)
5
    clk_wert=1;
6
  else
7
    clk_wert=0;
8
}

Vielen Dank im Voraus

von Johannes M. (johnny-m)


Lesenswert?

Falscher Controller eingestellt?

von Johannes M. (johnny-m)


Lesenswert?

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

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

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

von gast (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

Interrupt global freigegeben?

von gast (Gast)


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

von Oliver (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

Immer das Gleiche... wo ist der ganze Code?

von gast (Gast)


Lesenswert?

Hab ihn den Anhang jetzt die .lss datei gehängt. Und hier ist der ganze 
Code:
1
#include "i2c.h"
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <util/delay.h>
5
6
char run=0, clock=1, transmit=0, transmit_data;
7
char receive=0, receive_data, ready=0, clk=0, clk_wert=0;
8
unsigned int incr=0;
9
10
void i2c_init(int frequenz)
11
{
12
//frequenz bestimmen:
13
  incr = 9; //400kHz
14
  DDRD |= ( (1<<DATEN) | (1<<CLOCK) );
15
  S_DELAY;
16
  PORTD |= (1<<DATEN);  //Daten High && Clock High --> !bsy
17
  PORTD |= (1<<CLOCK);
18
  run=0;
19
  clk=0;
20
}
21
22
char i2c_clk_ready(void)
23
{
24
  char x=0;
25
26
  while(!clk)
27
  {
28
    ++x;
29
    S_DELAY;
30
    if (x >= 20)
31
      return 1;
32
  }
33
  return 0;
34
}
35
36
//read = 1, write = 0
37
char i2c_start(char adresse, char r_w)
38
{ 
39
  char x;
40
  run = 1;
41
//start Bedingung: Daten wechsel von 1 auf 0
42
  if (i2c_clk_ready())
43
  {
44
    PORTD |= (1<<DATEN);
45
    PORTD |= (1<<CLOCK);
46
    S_DELAY;
47
    PORTD &= ~(1<<DATEN);
48
    M_DELAY;
49
    M_DELAY;
50
    M_DELAY;
51
    PORTD &= ~(1<<CLOCK);
52
    S_DELAY;
53
  }
54
55
//SCL fängt an zu schwingen
56
  OCR1A = incr;
57
  TCCR1A |= (1<<COM1A0);  //OC Pin toggelt
58
  TCCR1B |= ( (1<<WGM12) | (1<<CS10) ); //prescaler = 1 & CTC Modus
59
  TIMSK1 |= (1<<OCIE1A);
60
  TIFR1 |= ( (1<<OCF1B) );
61
  
62
  if (TIFR1 & (1<<OCF1A))
63
  {
64
    clk = (!clk) ? 1:0;
65
    if (!clk)
66
      clk_wert=1;
67
    else
68
      clk_wert=0;
69
  }
70
  return 0;
71
}
72
73
void i2c_transmit_data(char data)
74
{
75
  transmit_data = data;
76
  ready=0;
77
  run=1;
78
}
79
80
char i2c_receive_data(void)
81
{
82
  return receive_data;
83
}
84
85
void i2c_stop(void)
86
{
87
  char bsy=0;
88
  do
89
  {
90
    if (PORTD & 2)
91
    {
92
      PORTD |= (1<<DATEN);
93
      bsy=1;
94
      run=0;
95
    }
96
    else
97
      bsy=0;
98
  }while(bsy);
99
100
  PORTD |= ( (1<<CLOCK) | (1<<DATEN) ); //Daten & Clk = 1
101
  run=0;
102
}
103
104
char i2c_ready(void)
105
{
106
  return ready;
107
}
108
109
ISR (TIMER1_COMPA_vect)
110
{
111
  clk ^= 1;
112
}
113
114
ISR (TIMER1_COMPB_vect)
115
{
116
  char x=0;
117
  ++x;
118
}

von Oliver (Gast)


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

von gast (Gast)


Lesenswert?

In der main() ist der Fehler nicht, da ist nur ein Aufruf der Funktion 
init und start.
Aber hier ist die main:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "i2c.h"
4
5
int main(void)
6
{
7
  char i=0;
8
  DDRD |= ( (1<<DATEN) | (1<<CLOCK) );
9
  sei();
10
  i2c_init(400);
11
  while(1)
12
  {
13
    i2c_start(0xA3, 1);
14
  }
15
  return 0;
16
}

von Oliver (Gast)


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 :-)
1
ISR (TIMER1_COMPB_vect)
Eine ISR, die nicht freigegeben ist. Warum?

Oliver

von gast (Gast)


Angehängte Dateien:

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. ^^

von Johannes M. (johnny-m)


Lesenswert?

gast wrote:
>
1
> ISR (TIMER1_COMPB_vect)
2
> {
3
>   char x=0;
4
>   ++x;
5
> }
6
>
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...

von Oliver (Gast)


Lesenswert?

>.rar ist ein ganz schlechtes Format für ein Hilfeersuchen...

dito...

Oliver

von gast (Gast)


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.

von Oliver (Gast)


Lesenswert?

Die Worte hör ich wohl, allein mir fehlt der Glaube...

Oliver

von gast (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

Was zum Geier ist ein "Interrupt File"? Und warum hattest Du ein 
falsches?

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.