Forum: Mikrocontroller und Digitale Elektronik Fragen zu ADC und Timer


von Alex R (Gast)


Angehängte Dateien:

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

von Peter D. (pdiener) Benutzerseite


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

von Alex R (Gast)


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.

von oha (Gast)


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(); ...
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.