(AVR) Mehrere Arrays im Interrupt

#873641
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
Gast #873660
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
#873769
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();
}
Gast #874485
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 ???

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