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


von Lutetia (Gast)


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:
1
void high_prior_InterruptHandler(void)
2
{
3
  // Timer zählt bis o,25 Sekunden. In der ISR wird x zurückgesetzt
4
5
  //hier steht noch lcd vorgeplänkel    
6
  
7
  TMR1H = 0xDF; //interrupt nach 1/4 sec (32768/4 = 0x2000)
8
  TMR1L = 0xFF;
9
  x=0;
10
11
  PIR1bits.TMR1IF = 0;
12
}
13
14
15
void main (void)
16
{
17
  init();
18
  while(1)
19
  {
20
      x++;
21
  }    
22
}

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

von Christian (Gast)


Lesenswert?

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

von Lutetia (Gast)


Lesenswert?

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

von bingo (Gast)


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.

von Lutetia (Gast)


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?

von U.R. Schmitt (Gast)


Lesenswert?

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

von Frank B. (foobar)


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.

von Anja (Gast)


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

von Lutetia (Gast)


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:
1
121:                 while(1)
2
  098C    D7FB     BRA 0x984
3
122:                 {
4
123:                   x++;
5
  0984    0101     MOVLB 0x1
6
  0986    2BA8     INCF 0xa8, F, BANKED
7
  0988    0E00     MOVLW 0
8
  098A    23A9     ADDWFC 0xa9, F, BANKED
9
124:               
10
125:                 }

von Lutetia (Gast)


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.

von U.R. Schmitt (Gast)


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.

von Anja (Gast)


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

von Lutetia (Gast)


Lesenswert?

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

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.