www.mikrocontroller.net

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


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
//------------------------------------------------------------------------------
//--- Interrupt routine
//------------------------------------------------------------------------------
ISR (TIMER1_OVF_vect)
{
    count++;              //Counter for Overflow
    if ( count == 20)        
    {
      ADC_Enable (ENABLE);      //enable ADC
      count = 0;            //reset counter
      TIMER_Start (STOP);
    }
}

//------------------------------------------------------------------------------
//--- Initialize Timer 1
//------------------------------------------------------------------------------
void TIMER_Init (void)
  {       
  TIMSK1 |= (1 << TOIE1);            
  }

//------------------------------------------------------------------------------
//--- Start / Stopp Timer 1
//------------------------------------------------------------------------------
void TIMER_Start (uint8_t start)
  {
  if (start) TCCR1B |= (1<<CS10) | ( 1 << CS12);   
  else TCCR1B &= ~((1<<CS10) | ( 1 << CS12)); 
    }

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

Danke für Eure Hilfe!

Gruss
Patrick

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:

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

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
2. File

Autor: Patrick (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Und noch die Routine, die den Timer starten soll

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs rausgefunden.
Der Code war schon richtig. Aber ich hab den Teiler falsch eingestellt.
Mit
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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Haettest das mal besser in dem urspruenglichen Thread gepostet...

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.