Forum: Mikrocontroller und Digitale Elektronik Initalisieren nur bei Power On trotz Interrupts


von Gendo I. (gendoikari)


Lesenswert?

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);

}

von Dussel (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Gendo I. (gendoikari)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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.

...

von Klaus (Gast)


Lesenswert?

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

von Gendo I. (gendoikari)


Lesenswert?

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...

von Gendo I. (gendoikari)


Lesenswert?

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.

von Gendo I. (gendoikari)


Lesenswert?

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
von Mein grosses V. (vorbild)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Gendo I. (gendoikari)


Lesenswert?

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.

von Karl M. (Gast)


Lesenswert?

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
}

von Gendo I. (gendoikari)


Lesenswert?

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.

von Gendo I. (gendoikari)


Lesenswert?

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
von Karl M. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.