Forum: Mikrocontroller und Digitale Elektronik Frage zu meinem Code (C)


von Patrick (Gast)


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

von STK500-Besitzer (Gast)


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.

von Patrick (Gast)


Lesenswert?

count ist als volatile deklariert.
Leider darf ich kein komplettes Programm veröffentlichen. Sorry. Nur den 
Teil, der nicht richtig funktioniert.

von Patrick (Gast)


Angehängte Dateien:

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.

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

2. File

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

Und noch die Routine, die den Timer starten soll

von Patrick (Gast)


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.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Haettest das mal besser in dem urspruenglichen Thread gepostet...

von Patrick (Gast)


Lesenswert?


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.