Frage zu meinem Code (C)

Gast #831657
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
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
count ist als volatile deklariert.
Leider darf ich kein komplettes Programm veröffentlichen. Sorry. Nur den 
Teil, der nicht richtig funktioniert.
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.