Fragen zu ADC und Timer

Gast #1103618
Lesenswert?

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 #1103646
Lesenswert?

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 #1106733
Lesenswert?

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 #1106766
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren