mikrocontroller.net

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


Autor: Georg Walder (mudla)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Georg Walder (mudla)
Datum:

Bewertung
0 lesenswert
nicht 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();
}

Autor: G. L. (sprintersb)
Datum:

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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.