www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fragen zu ADC und Timer


Autor: Alex R (Gast)
Datum:
Angehängte Dateien:

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

Autor: Peter Diener (pdiener) Benutzerseite
Datum:

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

Autor: Alex R (Gast)
Datum:

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

Autor: oha (Gast)
Datum:

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

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.