Hallo, ich hab ein Program geschrieben in dem in einer ISR einen Schalter abfragen und je nach Ergebniss den OCnx prescaler umstelle, aber kurz darauf springt der Conrtroller wieder in meine Init() Funktion und stellt den Startwert wieder her. Quasi bei jedem Interrupt z.B. vom Timer0 Wie kann ich das Programmieren, dass die Init() wirklich nur ausgeführt wird, wenn der Controller Betriebsspannung bekommt? Muss ich das in den Boot sektor schreiben? Habe nämlich die ISR Tabelle an den Speicheranfang geschoben. #include <avr/io.h> //#include <util/delay.h> // Für warte schleifen z.B.: _delay_ms(1000); #include <avr/sleep.h> #include <avr/interrupt.h> //#include <stdint.h> extern void init(void); extern void set_PWM_fan(uint8_t wert); extern void set_PWM_LED(uint8_t wert); #define F_CPU 10000000UL // 10MHz für hohe Messgenauigkeit void main(void) { init(); PORTB &= ~(1<< PINB7); // LED oben an sei(); //Sleep(); while (1); }
In einem Register, welches steht im Datenblatt, stehen die Gründe für den Reset. Wenn kein anderer Reset als der Power On gespeichert ist, kannst du die Initialisierung ausführen.
Gendo I. schrieb: > aber kurz > darauf springt der Conrtroller wieder in meine Init() Funktion Das lässt vermuten, dass Du einen Interrupt freigegeben hast, für den Du keine ISR geschrieben hast. ...
Ich denke nicht das der Controller eine RESET macht. Nach dem interrupt ist der Einsprungspunkt wieder bei der main, daher Probier ich das mit der ISR jetzt wo du's sagst könnte das stimmen. Ich mach mal alle rein aus dem Datenblatt.
Gendo I. schrieb: > Ich denke nicht das der Controller eine RESET macht. > Nach dem interrupt ist der Einsprungspunkt wieder bei der main, Ich selbst mache zwar nix in C, mir ist aber bekannt, dass C eine Routine hat, die aufgerufen wird, wenn zu einem ausgelösten Interrupt kein Handler existiert. Die könnte Bad_Interrupts oder so ähnlich heißen. Und die löst einen Reset aus, falls ein Interrupt ins Leere geht. ...
Hannes L. schrieb: > Und die löst einen Reset aus, falls ein Interrupt ins Leere > geht. Oder das Teil stürzt einfach so ab, weil das vorhandene Programm im Interrupthandler buggy ist. Mal ein paar Breakpoints setzen und dann schauen MfG Klaus
Die ISR waren es nicht. Schein was elektrisches zu sein. Hab an INT1 (PD3 beim ATmega88) einen Schalter. Habe vorher den PULL-UP eingeschalten. Der fehler tritt nur auf, wenn der Schalter geöffnet ist. Sobald der Schalter den Eingang auf GND zieht springt der Controller ganz normal in dir ISR und nicht in meine Init(). Versteh ich nicht...
Klaus schrieb: > Hannes L. schrieb: >> Und die löst einen Reset aus, falls ein Interrupt ins Leere >> geht. > > Oder das Teil stürzt einfach so ab, weil das vorhandene Programm im > Interrupthandler buggy ist. Mal ein paar Breakpoints setzen und dann > schauen > > MfG Klaus Hier die ISR dazu: ISR(INT1_vect) // Switch { cli(); if(PIND & (1<<PIND3) ) { // Hier FEHLER TCCR0A = 0b11110001; TCCR0B = 0b010; }else if(!(PIND & (1<<PIND3))) { // Hier alles i.o TCCR0A = 0b11110001; TCCR0B = 0b011; } sei(); } Also die ISR schließ ich mal aus. Die Register werden auch alle richtig gesetzt.
Hab den Fehler. Der Controller stürtzt ab, wenn ich beim Phase Correct Mode eine PWM Frequenz am OC Pin vom 2450Hz hab. Mag er wohl nicht. XD
:
Bearbeitet durch User
Gendo I. schrieb: > Der Controller stürtzt ab, wenn ich beim Phase Correct Mode eine PWM > Frequenz am OC Pin vom 2450Hz hab. Mag er wohl nicht. Schwachsinn. Zeig lieber mal dein gesamtes Programm.
Gendo I. schrieb: > Mag er wohl nicht. Sei versichert, die PWM funktioniert bei Milliarden AVRs einwandfrei. Wenn die PWM nicht funktionieren würde, wär das schon längst jemandem aufgefallen.
Liegt nicht am Programm. Bei einer Frequenz wo der Lüftermotor noch geht, geht der Controler ins Reset, wenn ich einen Servopumpenmotor angeschlossen haben (hatte ich hier grad noch rumliegen). Da funkt das Bürstenfeuer wohl zu sehr.
Hallo, so etwas macht man auch nicht ! und fummelt an den globalen Interrupt Falg herrum. Evtl. ist den AVR auch auto of Stack ! Überlege Dir bitte was bei dem sei(); passiert.
1 | ISR(INT1_vect) // Switch |
2 | {
|
3 | cli(); |
4 | if(PIND & (1<<PIND3) ) |
5 | {
|
6 | |
7 | // Hier FEHLER
|
8 | TCCR0A = 0b11110001; |
9 | TCCR0B = 0b010; |
10 | |
11 | |
12 | |
13 | }else if(!(PIND & (1<<PIND3))) |
14 | {
|
15 | // Hier alles i.o
|
16 | TCCR0A = 0b11110001; |
17 | TCCR0B = 0b011; |
18 | }
|
19 | sei(); |
20 | }
|
Mein grosses V. schrieb: > Gendo I. schrieb: >> Der Controller stürtzt ab, wenn ich beim Phase Correct Mode eine PWM >> Frequenz am OC Pin vom 2450Hz hab. Mag er wohl nicht. > > Schwachsinn. > > Zeig lieber mal dein gesamtes Programm. Wie soll das am gesamten Program liegen, wenn das weg ist sobalt ich den prescaler von 8 auf 64 stelle? jetzt hab ich in beiden Fällen OCnx Frequenzen bei 10MHz CPU Takt bis maximal 610Hz und das gesammte Program geht wie gewollt. Es liegt also nur an der PWM Frequenz.
Karl M. schrieb: > Hallo, > > so etwas macht man auch nicht ! > und fummelt an den globalen Interrupt Falg herrum. > > Evtl. ist den AVR auch auto of Stack ! > Überlege Dir bitte was bei dem sei(); passiert. > Auch wieder wahr... edit: ja, das war das eigentliche Problem! ich hatte das in allen ISRs drin. Dadurch wollte ich vermeiden, dass in der ISR selbst ein Interrup reinfunkt. Nicht so schlau, da die Interrupts global ab zu schlaten... Jetzt geht's auch mit 4883Hz am OC PIN. Ich Danke dir. Jetzt ist Bierzeit :D
:
Bearbeitet durch User
Na fein, dann war meine Annahme ja korrekt. Viel Erfolg weiterhin.
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.