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
>//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
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(); }
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
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...
Naja, teils macht es schon der Compiler, indem er bei ISRs zum Rücksprung reti statt ret einsetzt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.