PIC in Assembler programmieren


© Januar 2022, letzte Änderung am 24.04.23

--- still under construction ---

Übersicht

Minimal - Entwicklungssystem

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.

Steckerbelegung PICkit 3

  1. Vpp/nMCLR
  2. VDD
  3. VSS GND
  4. ICSP DATA
  5. ICSP CLK
  6. NC

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

Überschrift 1

choose system drive

Zum Anfang

Quellen

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