mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pic Takt mit RC Glied per Software bestimmen


Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich experimentiere zur zeit mit dem PICDEM 2 Demoboard.  Der Takt wird 
hier durch ein RC-Glied erzeugt, welches aus einem 4,7k Widerstand und 
einer 22pf Kapazität besteht. Um den Takt genau zu bestimmen hab ich 
folgendes Programm geschrieben:
void high_prior_InterruptHandler(void)
{
  // Timer zählt bis o,25 Sekunden. In der ISR wird x zurückgesetzt

  //hier steht noch lcd vorgeplänkel    
  
  TMR1H = 0xDF; //interrupt nach 1/4 sec (32768/4 = 0x2000)
  TMR1L = 0xFF;
  x=0;

  PIR1bits.TMR1IF = 0;
}


void main (void)
{
  init();
  while(1)
  {
      x++;
  }    
}

erwartet hätte ich etwas um die 250.000. Der Wert pendelt aber um die 
25.000. Versteh ich einfach nicht, da mit den besagten Bauteilen ein 
Takt von etwa 4MHZ entstehen sollte. Was ja bei 4 Takten/Operation zu 
ca. 250000 Operationen in 1/4sec fühen müsste. Komme einfach nicht auf 
den (Denk-)Fehler

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo.. wie kommst du denn überhaupt an den wert der variable x ran.. ?

Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, hatte ich vergessen. Wird vor dem Rücksetzten des Timers am LCD 
ausgegeben

Autor: bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst in der Konfiguration jedes PIC einstellen, ob er den internen 
oder den RC-Prozessortakt (Fosc/4) auf einem Pin ausgibt. Oft (aber 
nicht immer) ist das der Pin RA6. Steht alles genau im Datenblatt. Da 
kannst Du dann ganz genau messen.

Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich weiß, ich hab aber kein Oszi zum messen. Deshalb der etwas 
kompliziertere Weg über den Timer. Sollte ja aber auch gehn. Nur warum 
kommt nur 1/10 des erwarteten Wertes heraus?

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blöde Frage: Wie viele Operationen macht denn Deine Schleife bei einem 
Durchlauf?

Autor: Frank Buss (foobar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso meinst du, daß auch der Zähler bis 250.000 zählt? Da gibt es ein 
Increment und die while-Schleife, also noch ein Jump und was der 
C-Compiler sonst noch so generiert. Wenn du MPLAB verwendest, dann 
kannst du dir den Assemblercode ansehen und taktgenau auf dem PC 
simulieren.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lutetia schrieb:
> ich weiß, ich hab aber kein Oszi zum messen. Deshalb der etwas
> kompliziertere Weg über den Timer. Sollte ja aber auch gehn. Nur warum
> kommt nur 1/10 des erwarteten Wertes heraus?

Wenn ich das richtig verstanden habe:
Du mißt den Takt mit derselben Zeitbasis mit der auch dein Prozessor 
betrieben wird. (so frei nach Münchhausen).

Und dann verwendest du im Interrupt noch umfangreiche LCD-Bibliotheken 
womöglich noch mit einer Floating-Point routine zum Umwandeln in ASCII.

Außerdem: was ist x für ein Datentyp? (16 Bit oder 32? integer oder 
float?)

Gruß Anja

Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Antworten, war wohl doch etwas voreilig mit meiner 
Behauptung. Sorry, bin noch Anfänger, und noch nicht so sicher in dem 
Thema.

Hintergrund der Sache ist einfach, das ich in einem Programm eine 
Wartezeit von einer Sekunde brauche ohne den Timer mit dem externen 
Oszillator zu nutzen. Um die Anzahl der Schleifendurchläufe zu ermitteln 
hab ich eben das Testprogramm geschrieben.

Also x ist eine int Variable. Und im Disassembly Listing sieht man 
tatsächlich, das er pro Durchlauf 5 asm Befehle generiert.

Fehlen aber theoretisch immer noch 5 Operationen. Da er mit den 4MHz ja 
eigentlich 1M Operationen pro Sek schaffen sollte. Die LCD Ausgabe kann 
man glaub ich vernachlässigen, da sie ja nur am Ende in der ISR 
aufgerufen wird.

Hier noch der ASM Code des Listings:
121:                 while(1)
  098C    D7FB     BRA 0x984
122:                 {
123:                   x++;
  0984    0101     MOVLB 0x1
  0986    2BA8     INCF 0xa8, F, BANKED
  0988    0E00     MOVLW 0
  098A    23A9     ADDWFC 0xa9, F, BANKED
124:               
125:                 }    

Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achja, der timer der den Interrupt auslöst, zählt über einen externen 
Oszillator mit 32.768KHz. Er zählt genau bis 0x2000, was einer viertel 
Sekunde entspricht.

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lutetia schrieb:
> danke für die Antworten, war wohl doch etwas voreilig mit meiner
> Behauptung. Sorry, bin noch Anfänger, und noch nicht so sicher in dem
> Thema.

Ist ok, aber nicht schlimm.
Wie Du siehst sind in der Schleife schon mal 5 Assemblerbefehle. Deine 
Schleife selbst muss aber auch noch realisiert sein. Da ist noch ein 
Branch drin, wie viele Takte braucht der?
und die Interrupt service Funktion, die 32000/4 mal aufgerufen wird 
braucht auch noch Zeit.

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lutetia schrieb:
> Also x ist eine int Variable.

also ist der Zählbereich -32768 ... +32767
Du brauchst einen guten Algorithmus um 250000 darin unterzubringen.

> Und im Disassembly Listing sieht man
> tatsächlich, das er pro Durchlauf 5 asm Befehle generiert.
der Branch-Befehl braucht schon mal 2 Takte -> die Schleife damit 
insgesamt 6 Takte.

Mal rechnen:
250000 Befehlstakte / 6 Takte je schleife = 41666 (ist größer als 32767) 
also müßte bei Datentyp integer -23870 auf der Anzeige stehen.

Auf der anderen Seite sind 22pF eigentlich keine Kapazität. Da kommt je 
nach Draht/Leiterbahnlänge ein paar pF parasitäre Kapazität dazu.
Die Umwandlungsroutine für die Anzeige brauch je nach Implementierung 
auch ein paar Millisekunden.

Gruß Anja

Autor: Lutetia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, danke für die hilfreichen Antworten. Werde versuchen das noch etwas 
genauer zu analysieren. Werde dann das Ergebnis hier posten.

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.