Initalisieren nur bei Power On trotz Interrupts

OP #4521444
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);

}
#4521662
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.

...
OP #4521715
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...
OP #4521721
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.
Gast #4521773
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
}
OP #4521796
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.
OP #4521799
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

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