PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PIC 16F870 bzw. 877 - zu langsam für Anwendung?



stefan-tiger
04.05.2007, 13:44
Hallo,

ich habe die PICs 16F870 bzw. 877.
Angeschlossen ist ein 16 MHz Quarz.
Im Datenlatt steht, daß Befehle 1 Taktzyklus brauchen, Sprungbefehle 2 Taktzyklen.

In der gewünschten Anwendung, soll eine SPI-Kommunikation abgefangen werden, d.h. zwischen einem anderen Controller und einem Sensor soll der PIC eingebaut werden.

Der andere Controller, der SPI-Master sozusagen, frägt den Sensor in Paketen zu 16 Taktzyklen mit 66 kHz ab.

serial clock & data Leitungen vom anderen Controller sowie die serical clock & data Leitung des Sensors sind an entsprechend vier I/O-Pins des PICs angeschlossen.

Ich habe nun ein kleines Programm geschrieben und auf den PIC gebrannt. (Tools: MPLAB, CCS, ICD2).

Das Programm wartet auf die steigende Taktflanke der serial clock Leitung vom anderen Controller arbeitet dann ein bisschen Code ab indem auch die Taktflanke irgendwann auf den Sensor weitergegeben wird. Auch die Datenleitungen werden abgefragt bzw. gesetzt.
Das Prorgamm besteht aus 7 kleinen Funktionen, in denen nichts großartig gemacht wird, da als erster Schritt nur die Weiterreichung der Kommunikation implementiert ist. Eingriffe in die Kommunikation sind für später geplant.

Mit einem Frequenzgenerator teste ich also den serial clock I/O-Pin des PIC welchen vom anderen Controller später kommen soll und Messe den anderen I/O-Pin des PIC der serial clock welches spätzer zum Sensor führen soll.

Ich hoffe man kann sichs Vorstellen.

Bei der Messung sollte herauskommen: jede steigende Flanke des "Eingangs" ergibt eine steigende Flanke des "Ausgangs".

Problem: Es werden Taktflanken "verschluckt".
Es scheint so als arbeite der PIC zu langsam.

Woran kann das liegen?
Wie kann ich feststellen, daß mein PIC wirklich mit 16 MHz läuft und somit pro ASM-Befehl 1/16 µs bzw. 2/16 µs dauert?

theborg
04.05.2007, 14:21
Der PIC benutzt nen 1:4 teiler d.h. das heist das nur alle 4 takte ein Befehl ausgeführt wird vielleicht reicht es bei deiner Anwendung auch wenn du die 16mhz Quarz gegen einen 20mhz tauscht ansonsten Firste wohl nen 18f oder nen dspic benutzen müssen vileicht ist auch dein code noch optimierbar.

stefan-tiger
04.05.2007, 14:35
Im Datenblatt steht aber, daß nur im RC-Mode der 1/4-Teiler aktiv ist. (so les ich das), Orginal Text:

OSC1/CLKI 9 9 I ST/CMOS(3) Oscillator crystal input/external clock source input.
OSC2/CLKO 10 10 O — Oscillator crystal output. Connects to crystal or resonator in
Crystal Oscillator mode. In RC mode, the OSC2 pin outputs
CLKO, which has 1/4 the frequency of OSC1, and denotes the
instruction cycle rate.

theborg
04.05.2007, 14:41
ne da steht das im RC mode OSC2 / CLKO 1/4 der Freqenz ausgeben die an OSC1 anliegt aber eigentlich ist es bei PICs Grundsetzlich so das der 1/4 Teiler immer benutzt wird.

stefan-tiger
04.05.2007, 16:29
Stimmt, ich hatte das hier aus dem Datenblatt übersehen:

...
One instruction cycle consists of four oscillator periods. Thus, for an oscillator frequency of 4 MHz, the normal instruction execution time is 1 µs. If a conditional test is true, or the program counter is changed as a result of an instruction, the instruction execution time is 2 µs.
...

theborg
04.05.2007, 17:13
also zur Optimierung kanste nen 20mhz noch dranhängen es gibt aber auch berichte wo welche es geschafft haben nen f877 mit 27mhz stabil zu betreiben.

stefan-tiger
04.05.2007, 17:44
also zur Optimierung kanste nen 20mhz noch dranhängen es gibt aber auch berichte wo welche es geschafft haben nen f877 mit 27mhz stabil zu betreiben.

Das würde mir leider wenig nützen. Aber dafür ist es einfach durchzuführen. Es würde aber mehr bringen die Anzahl der Befehle zu reduzieren. Dazu müsste ich aber wohl von C auf ASM umsteigen, was ich eigentlich vermeiden wollte.

Ich habe zur Abschätzung des Laufzeitverhaltens ein OpenOffice Calc Sheet erstellt und stelle es hier mit ohne Gewähr und ohne Garantie zur Verfügung.

Wie ihr sehen könnt müsste ich bei einem 20 MHz Quarz das Programm (hier sind nur die Befehle gemeint die Quasi-Periodisch auftreten, also ohne Initialisierungen etc.) auf 64 Befehle reduzieren.

Momentan hat es ca. 300-400. Die Abschätzungen dazu und auch zu den Warscheinlichkeiten "p" habe ich kurzerhand per "grep" auf das ASM-file ermittelt. Im Grunde kann man sagen, daß man ca. 80% Befehle hat die 1 Taktzyklus brauchen (je nach Anwendung verschieden.

Das Sheet schlägt zwei Löungen vor, die bei mir kaum zu realisieren sind um die Zeitschranke einzuhalten.

stefan-tiger
04.05.2007, 18:22
Nachtrag: meine Angabe zur Anzhal der Instruktionen ist falsch. Ich habe die Instruktionen für 16 Taktflanken des zu verarbeitenen Signals angegeben.
Das lag an der Aufgaben stellung, da der Sensor in einem Paket von 16 Taktflanken abgefragt wird.

d.h. ich habe in das Sheet ca. 70 instructions statt 300 einzutragen.

Demzufolge würde eine Erhöhung des Quarz auf 22 MHz eien Lösung sein.

In dem Sheet ist ein kleiner Bug: In der Formel in C21 muss man die 300 durch C8 ersetzen!