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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.