probleme mit der isr

Gast #1230312
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
#1230324
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...
Gast #1230334
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
Gast #1230344
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
Gast #1231287
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
}
Gast #1231353
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
}
Gast #1231400
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
#1231418
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...

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