--- still under construction ---
Bei der hier vorliegenden Anwendungen, Lichtsteuerung,
habe ich mich für einen 8 Bit-PIC Prozessor entschieden,
da ich den bereits seit längeren verwende.
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.
Wobei die meisten Befehle innerhalb eines 'cycle' = 4 Oszillator Zyklen
hier 8 MHz oder 125 ns abgearbeitet werden.
Name | Pin | Pin | Name | |
---|---|---|---|---|
VDD | 1 | 8 | GND | |
RA5 | 2 | 7 | RA0 | |
RA4 | 3 | 6 | RA1 | |
RA3 | 4 | 5 | RA2 |
Um einen PIC-Prozessor von Microchip programmieren zu können,
benötigt man ein IDE - integrated development environment
oder Entwicklungs-Umgebung.
Kleinster gemeinsamer Nenner war früher MPLAB mit den Programmer PICkit 3.
Programmer als Selbstbaulösungen, welche einen Parallelport benötigen,
betrachte ich nicht mehr.
Auf der Microchip.com Seite unter dem Abschnitt "Tools and Resources / Develop" stehen dann folgende Tools.
MPLABX-v5.45-linux-installer.tar
xc8-v2.32-full-install-linux-x64-installer.run
gputils
ausgewichen. gpasm
enthalten, welcher im MPLAB X IDE eingebettet werden kann.gpasm
erstellten Codes gpsim
installiert. gpasm
erstellter Code kann leider nur noch direkt auf den Chip gebrannt werden, Zum Anfang
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
.
Unter MPLABXProjects/nico01.X/dist/default/debug/nico01.X.debug.cod vorhanden.
Zum Anfang
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.
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
Zum Anfang
gputils
GPUTILS is a collection of tools for the Microchip PIC microcontrollers.
It includes gpasm, gplink, and gplib.
gpsim
gpsim is a full-featured software simulator for Microchip PIC microcontrollers
sourceforge.net
gpsim - The gnupic Simulator Files
xizard
This software is a GUI which allows you to easy assemble PIC programs
It uses gpasm software
pikdev.free.fr
PiKdev is a simple graphic IDE for the development of PIC-based applications.
misterelectronicoes.wordpress.com
Picsimlab interesting simulator.
Zum Anfang