Forum: Compiler & IDEs (AVR) Mehrere Arrays im Interrupt


von Georg W. (mudla)


Lesenswert?

Hi,
wahrscheinlich ist das ein Anfängerproblem aber ich komme einfach nicht 
mehr weiter.
ich habe da ein Problem mit mehreren 16 bit Arrays, die ich in einem 
Interrupt verwende.
Dabei möchte ich 2 Arrays miteinander subtrahieren und das Ergebniss an 
eiem Port ausgeben (Das Ergebniss ist nicht größer als 7-dafür habe ich 
gesorgt).
Doch das funktioniert nicht da es den Microcontroller aufhängt, bzw. er 
bleibt bei der Berechnung hängen.
Meine Vermutung ist, dass ich da entweder zu viele Arrays im Interrupt 
verwende und der Controller (Atmega16) somit überlastet ist, oder dass 
irgendwie der Speicher bei der Berechnung falsch beschreiben wird.

Das hier ist nur ein Auszug aus dem Programm, wo es den Controller 
aufhängt.

volatile uint16_t pos[4], b;


ISR(TIMER1_COMPA_vect)
{      cli();
    TCNT1 = 0x0;
    TCCR1B &= ~(1<<CS10) | (0<<CS11) | (0<<CS12);
    j=0x1;
{
  if((pos[nr]-pos[(nr-1)])<=(0xA0))
  {
//genau da hengt es den controller auf

    b = (servo[(nr-1)]-pos[(nr-1)]);
    PORTB &= ~(1<<(unsigned char)b);
  }
}

Der andere Programmteil funktioniert eigentlich.
Kann es sein, dass man das mit Pointer programmieren muss?
Leider bin ich im c programmieren bei Mikrocontroller noch nicht so 
erfahren, sodass es hier auch ein ganz banaler Fehler sein kann.

mfg  Georg

von Oliver (Gast)


Lesenswert?

>//genau da hengt es den controller auf

Und woher weisst du das so genau?

>Das hier ist nur ein Auszug aus dem Programm

Kurze Auszüge sind immer blöd - da muß die Glaskugel soviel leisten. Und 
wenn die Asuzüge dann noch unvollständig sind, um so mehr. Z.B. hängt 
miene Glaskugel gerade an der Frage: Wer oder was ist nr? Wo wird das 
initalisiert?

Stell doch mal den vollständigen Code hie rein, so, daß der sich auch 
kompilieren lässt.

Oliver

von Georg W. (mudla)


Lesenswert?

Ok, jetzt habe ich das Programm gekürzt, damit man das Problem besser 
sieht:

Das Programm soll in der Interrupt-Schleife das pin-array so 
beschreiben, sodass der selbe Wert + der dazugehörige Pin im pin- array 
stehen.
Dadurch kann ich mit b=pin[i]-pos[i] den korrekten Pin herausfinden.
Das brauch ich um später bei einem Sortieralgorithmus den dazugehörigen 
Pin nicht zu verlieren.

Jedenfalls funktioniert die Schleife nicht und ich weiß nicht warum.

#include <avr/io.h>
#include <stdint.h>
#include <avr/interrupt.h>

volatile uint16_t pos[3], pin[3], b;

void timer0(void);

int main(void)
{  DDRB = 0xFF;
  DDRA = 0x0;
  PORTB  |= (1<<PB6);
  timer0();
  for(;;)
  {    pos[0]=0x2EE0;
      pos[1]=0x2EE0;
      pos[2]=0x2EE0;
  }
  return 0;
}

void timer0(void)
{  TIMSK  |= (1<<OCIE0);
  OCR0 = 0x4E;
  TCNT0  = 0x0;
  TCCR0 |= (1<<CS00) | (0<<CS01) | (1<<CS02);
  sei();
}

ISR(TIMER0_COMP_vect)
{    cli();
    uint8_t i;
    TCNT0 = 0x0;

diese Schleife funktioniert nicht:

    for(i=0; i++; i<=2)
    {  pin[i]=(pos[i]+i);
    }


                b=pin[1]-pos[1];  //Hier müsste der Pin PB1 einschalten
    PORTB |= (1<<b);
    sei();
}

von G. L. (sprintersb)


Lesenswert?

Wie wär's mit
1
    for(i=0; i<=2; i++)

von Werner B. (Gast)


Lesenswert?

Noch eine Anmerkung.

das cli(); und sei(); in der ISR solltest du dir sparen, das mach schon 
der Compiler. Es kann sogar zu Problemen führen.

Noch viel Erfolg

Werner

von Johannes M. (johnny-m)


Lesenswert?

Werner B. wrote:
> das cli(); und sei(); in der ISR solltest du dir sparen, [...]
Soweit völlig korrekt...

> [...] das mach schon der Compiler.
Nö, das macht nicht der Compiler, sondern die Hardware des 
Controllers...

von Rolf Magnus (Gast)


Lesenswert?

Naja, teils macht es schon der Compiler, indem er bei ISRs zum 
Rücksprung reti statt ret einsetzt.

von Lutz (Gast)


Lesenswert?

ISR(TIMER1_COMPA_vect)
{ ...
 TCCR1B &= ~(1<<CS10) | (0<<CS11) | (0<<CS12);
  ...
}
aus dem ersten Post kommt ja anscheinend nicht mehr vor. Ohne jetzt die 
Bedeutung der CS-bits geprüft zu haben: Du wolltest wahrschein nicht nur
CS10 tooglen (was wahrscheinlich auch keinen Sinn macht), sondern den 
ganzen rechten Ausdruck => Klammern vergessen ???

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.