probleme mit der isr

Gast #1230312
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
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
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
>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
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 #1231344
>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
Gast #1231353
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
>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
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...
Gast #1231499
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.