PIC-CPU


© September 2020, Letzte Änd. 13.02.21

--- Diese Seite befindet sich noch im Aufbau ---

Übersicht

Vorwort

Wer ein Problem mit einen Mikroprozessor lösen möchte, sollte sich vorher überlegen was einem wichtig ist.

Zum Anfang

Entwicklungssystem

Bei den hier vorliegenden Anwendungen, habe ich mich zumindest für einen
8 Bit-PIC Prozessor entschieden.

Um die richtigen Komponenten zu finden,
habe ich zunächst eine passende CPU gesucht.
In meinen Fall fand ich den 8 Pin PIC 12F1840 geeignet.

Es ist ein 8 Pin 32 MHz 8-bit Prozessor mit folgenden Funktionen.

Um einen PIC-Prozessor von Microchip programmieren zu können,
benötigt man ein IDE - Entwicklungssystem.
kleinster gemeinsamer Nenner war da früher MPLAB
mit den Programmer PICkit 3.

Unter dem Abschnitt "Development Environment" stehen dann folgende Tools.

Zum Anfang

Details der Installation

Entsprechend der Anleitung unter microchipdeveloper.com/MPLAB dependencies
vorzugehen, habe ich getrost ignoriert. Es reicht mitlerweile die Entwicklungsumgebung unter
microchip.com   runter zu laden, zu entpacken und zu installieren.
Z.B. wie folgt:

cd Downloads/
ls
MPLABX-v6.00-linux-installer.sh

sudo sh MPLABX-v6.00-linux-installer.sh 

Installiert man gputils via Synaptic auf DEB 9 oder Mint 20.3
erhält man in beiden Fällen eine veraltete Version 1.4.0 von 2012.

Es macht also Sinn sich eine (2 Tage alte) aktuelle Version 1.5.2 runter zu laden.
Siehe   sourceforge.net gputils

cd Downloads/
ls
gputils-1.5.2.tar.bz2

tar -xaf gputils-1.5.2.tar.bz2 

cd gputils-1.5.2

./configure
…
/usr/bin/ld: cannot find Scrtl.o: No such file or directory

sudo apt install gcc-multilib

./configure

make

sudo make install

nano config.log

Auf einem via KVM virtualisierten Linux Mint 20.3 läuft zumindest MPLAB X IDE 6.00
und gputils 1.5.2 und es läßt sich ein lauffähiges PIC-Programm erzeugen
welches via PicKit 3 auf einen 12F1840 brennbar ist.

Sobald ich jedoch versuche etwas zu debuggen, bekomme ich eine Fehlermeldung.
nico01.X.debug.cof does not exist.

missing debug.cof

Unter MPLABXProjects/nico01.X/dist/default/debug/nico01.X.debug.cod vorhanden.

Zum Anfang

4 Kanal PWM für Lichtsteuerung

Wie man aus den Datenblatt sieht, kann die PIC Hardware des 12F1840 nur einen
pulse weiten modulierten - PWM Kanal bedienen.
Benötigt man meherere Kanäle ist ein anderer Prozessor zu wählen oder
man erzeugt die PWM per Software selbst.
Dabei ist zu berücksichtigen, das 8 Bit Auflösung zu gering ist.
Das bedeutet das in kleinster Dimm-Stufe, also ca. 0,4% Einschaltzeit
= 1/256   es bereits zu hell ist.

Um möglichst wenig CPU-Last zu erzeugen, lade ich im Interrupt einen
Timer mit unterschiedlichen Zeiten entsprechend der jeweiligen PWMs.
Dies habe ich z.B. mit den 16-Bit Timer TMR2 realisiert.
Im schlechtesten Fall ist von allen Kanälen die PWM anders,
wie im folgenden Besipiel gezeigt.

4 channel timing diagramm

Bei diesen konkreten Fall sind folgende Schritte im Timer-Interrupt INT zu erledigen

Nun kann man sich noch vorstellen, das alles Aus ist oder alles zu 100% Ein ist.
Dann ist nur noch ein  INT  je Periode nötig, nicht jedoch für die PWM,
sondern für die Tastenabfragen in anderen Routinen.

Wenn 1 bis 5 INTs je Periode tmax vorkommen, ist auch daran zu denken
daß eine gewisse Zeit, vom INT bis der Timer neu geladen wird, verstreicht.
Auch wenn es nur ein paar µs je INT sind, ist es wegen der Veränderlichkeit zu berücksichtigen.
Das alles fehlerfrei zu berücksichtigen, habe ich für 2 Kanälen hin bekommen,
aber dann wurde es mir zu komplex.

Weitere Aspekte sind, dass die zeitliche Auflösung der PWM
nicht unter der Verweildauer im INT sein kann.
Das heist der schmalst mögliche Puls ist die Zeit vom Ausgang ändern im INT
bis zum nächsten Ausgang ändern im darauffolgenden INT.
Die INT-Routine sollte also möglichst schnell & schlank sein.

Um die INT-Routine schneller zu bekommen, bin ich auf den 8-Bit Timer 0 ausgewichen.
Um die veränderliche Anzahl an INTs zu vermeiden, gehe ich je Periode (0..255)
stehts zwei Mal in den INT, auch wenn ich das nicht benötige.
Um die Auflösung zu erhöhen benutze ich eine art "dizzern".
Das bedeutet Ich variiere die 8 Bit PWM innerhalb 4 Zyklen so,
dass der Mittelwert den 10 Bit Wert entspricht.

Dann möchte ich noch Tasten und ein Infrarot-Signal (RC5) auswerten.
Da beide Signale nicht so zeitkritisch sind (889 µs oder die doppelte Zeit bis eine Pegeländerung erfolgt)
werden sie nicht im INT abgearbeitet.

Im INT stehen also nur folgende Zeilen, welche ca. 2 µs benötigen.

      org     0x04        ; INT 3..4 cycl to react
                          ; WREG STATUS BSR FSR PCLATH -> shadow reg.
      bcf     INTCON,TMR0IF ; bx 5
      movfw   v_fsr1l     ; bx 6
      movwf   FSR1L       ; bx 7
      moviw   0[FSR1]     ; bx 8
      banksel TMR0        ; b0 9
      movwf   TMR0        ; b0 10  TRM0 war schon bis 06
      moviw   1[FSR1]     ; bx 11
      banksel LATA        ; b2 12
      movwf   LATA        ; to 13 LATA
      btfsc   WREG, 7     ; bx 14
      incf    v_cnt       ; bx 15 jeder 8. INT 
      moviw   2[FSR1]     ; bx 16
      movwf   v_fsr1l     ; bx 17 FSR1L
      retfie              ; 2 cycles schreibt WREG STATUS BSR FSR PCLATH

Quellen

wordpress.codewrite.co.uk   PIC Tutorials - Electronics and Programming Simplified
codeproject.com   Microchip PIC 16F1455 USB Stack
geoffg.net   The Microbridge
picforum.ric323.com   PICFORUM
microchipdeveloper.com   Developer Help
elektronik-kompendium.de   Microchip PIC
http://www.sprut.de/
https://pic-projekte.de/blog/
https://gputils.sourceforge.io/
http://gpsim.sourceforge.net/
http://pikdev.free.fr/
https://wiki.codeblocks.org/index.php/Using_the_Code::Blocks_IDE_with_SDCC_on_PIC_MCUs
http://xizard.free.fr/logiciels/xgpasm/xgpasm.html
https://www.gnupic.org/
https://sourceforge.net/projects/gpsim/files/
https://www.opendcc.de/info/rc5/rc5.html
http://sprut.de/electronic/ir/rc5.htm
https://misterelectronicoes.wordpress.com/%EF%BB%BFpicsimlab-pica-interesting-simulator/
https://www.engineersgarage.com/stmicroelectronics-launches-new-high-voltage-gate-driver/

Zum Anfang