Frage zu meinem Code (C)

Gast #831657
Lesenswert?

Hallo zusammen

Ich hab ein Problem mit meinem Code, den ich für einen AT90CAN32 
geschrieben habe. Irgendwo muss ein Fehler sein, aber ich finde ihn 
nicht.
Mein Code sollte folgendes machen:
Ein externer Aufruf startet den Timer 1 (TIMER_Start (1);)
Bei jedem Überlauf des Timers soll die Variable count hochgezählt 
werden. Erreicht sie den Wert 20, wird der ADC (ADC_Enable(1);) 
freigegeben und der Timer wider angehalten (TIMER_Start (0);)
Funktioniert das überhaupt so, wie ich das will?
1
//------------------------------------------------------------------------------
2
//--- Interrupt routine
3
//------------------------------------------------------------------------------
4
ISR (TIMER1_OVF_vect)
5
{
6
    count++;              //Counter for Overflow
7
    if ( count == 20)        
8
    {
9
      ADC_Enable (ENABLE);      //enable ADC
10
      count = 0;            //reset counter
11
      TIMER_Start (STOP);
12
    }
13
}
14

15
//------------------------------------------------------------------------------
16
//--- Initialize Timer 1
17
//------------------------------------------------------------------------------
18
void TIMER_Init (void)
19
  {       
20
  TIMSK1 |= (1 << TOIE1);            
21
  }
22

23
//------------------------------------------------------------------------------
24
//--- Start / Stopp Timer 1
25
//------------------------------------------------------------------------------
26
void TIMER_Start (uint8_t start)
27
  {
28
  if (start) TCCR1B |= (1<<CS10) | ( 1 << CS12);   
29
  else TCCR1B &= ~((1<<CS10) | ( 1 << CS12)); 
30
    }

Und hier noch das ADC_Enable:
1
void ADC_Enable (uint8_t enable)
2
  {
3
  if (enable)  ADCSRA  |= (1<<ADEN);
4
  else ADCSRA &= ~(1<<ADEN);  
5
    }

Danke für Eure Hilfe!

Gruss
Patrick
Gast #831660
Lesenswert?

Ist count volatile oder static deklakiert?

Solch kurzen Codefragmente kann man verreiben. In C kann der Fehler auch 
woanders liegen.
Poste ein komplettes Programm (im Anhang) und man kann dir besser 
helfen.

Falsch sehen die Fragmente nicht aus.
Gast #831664
Lesenswert?

Ich hab hier mal die 3 wichtigsten Files. Alle anderen sind für diese 
Funktion nicht relevant. Warum ich das überhaupt machen will:
Beim Start des DC-Motors kann es vorkommen, dass er einen zu hohen Strom 
zieht. Der ADC, der den Strom überwacht, würde das sofort merken und den 
Motor wieder abschalten. Darum möchte ich den ADC zeitvertögert 
einschalten.
Angehängte Dateien:
Gast #831739
Lesenswert?

Ich habs rausgefunden.
Der Code war schon richtig. Aber ich hab den Teiler falsch eingestellt.
Mit
1
TCCR1B |= (1<<CS10) | ( 1 << CS12);

Teile ich den Takt (8MHz) durch 1024 = 7.8kHz
Bis er dann den Interrupt auslöst, dauert es 8s. D.h. Der ADC würde erst 
nach 160s einschalten.
Ich teil jetzt den Takt durch 32 und lasse den count im Interrupt weg. 
Dann funktionierts.

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