Fragen zu ADC und Timer

Gast #1103618
Hallo allerseits,

ich programmiere in C und nutze den CCS Compiler. Der µC ist ein PIC 
16F818.

Mein Programm sieht in etwa so aus

...
int16 timer_voll=0;
...
void  RTCC_isr(void)
{
   timer_voll=timer_voll+1;
}
.
.
.
while(TRUE)
   {
      RTCC_isr();
      ...
      Funktion()
      ...
   }

Die Funktion sieht beispielsweise so aus:
void Funktion()
{
  output_low(PIN_A3);
  delay_ms(5);
  output_high(PIN_A3);
}

Ein Umlauf benötigt also ca. 5 ms, entspricht also 200Hz. Läuft der 
interne Timer total unabhängig davon? Wenn ja, hätte er schon mehrmals 
Überlauf(2MHz Takt). Ist es dann richtig, dass das entsprechende 
Register einmal auf 1 gesetzt wird und solange den Zustand behält (egal 
wie oft der Timer noch überläuft), bis die Interrupt-Routine aufgerufen 
wird?

Dazu wollt ich noch fragen ob der Prescaler standardmäßig ausgeschaltet 
ist.

Die zweite Frage bezieht sich auf den ADC. Bei CCS ist ein sogennanter 
PIC-Wizard dabei, mit dem man das Programmgerüst erstellen kann.
Im Anhang ist ein Bild von einer Einstellung, die icht nicht verstehe. 
Was bedeutet Clock in diesem Zusammenhang?


MfG
Angehängte Dateien:
Persönliche Seite
Hallo Alex,

die Angabe Clock bezieht sich auf die Taktversorgung des ADC. Beim Pic 
gibt es dazu normal die Möglichkeit einen separaten, internen 
RC-Oszillator dafür zu verwenden oder aber die Quarzfrequenz geeignet 
runterzuteilen. Das stellt man an dieser Stelle ein.

Was macht es für einen Sinn, dass du die Interrupt service routine aus 
der Hauptschleife aus aufrufst? Genau das sollte doch normal der 
Timerinterrupt automatisch tun.

Grüße,

Peter
Gast
Taktversorgung des ADC heißt, dass all 32 us ein Wert eingelesen wird?

Ich hab es zuerst probiert die Interrupt-Routine nicht extra aufzurufen, 
aber da tat sich gar nichts. Also ist es anscheinend doch nötog.
Gast
Die gezeigte Art von Programm wird schnell unuebersichtlich. Man sollte 
keine Delays in Proceduren haben, das ist veraltete Procedurale 
Programmierung. Moderner ist eventbasierte Programmierung. Speziell auf 
Controllern. Wichtig ist immer zu wissen, wo das Programm am warten ist. 
Und das sollte im Main sein. Dann kann man den controller auch in den 
sleep stecken, falls das denn noetig sein sollte. Standardmaessig 
verwendet man eine Zustandsmaschine, die beliebig schnell wiederholt 
wird. Das get so :

Timer_Interrupt {
 if timercount>0 {timercount--;}
 else (timerzero=1;}
}


int state;

main
{
 init....
 state=0;
 ..
 switch state {
 0: ..
    timercount=10;
    state=1;
   |
 1: if (timerzero==1)   // timer abgelaufen ?
    { ...
     ...
    timerzero=0;
     state=2 }
    |
 2:
 3:
 ..
 }
 ... Sleep(); ...
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 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.