PIC 16F887 en MikroBasic

'Alleen berichten met trefwoorden tonen' kiezen...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ik ben nog aan het nadenken (maar weet het nog niet zeker) om even wat te stoeien met assembler.
In een héél grijs verleden heb ik wel eens daarmee gewerkt (smrmu).

Ik heb gezien dat je in MikroBasic ook assembler instructies kunt opgeven tussen asm ... asm end.

Maar is dat een handige methode? Of is die optie in MikroBasic eigenlijk alleen makkelijk als je even iets in assembler wilt doen tussen alle programmaregels door?

Is het überhaupt aan te raden met assembler aan de gang te gaan? Het voordeel ervan lijkt me dat je goede kennis gaat krijgen van alle registers en de bits van de Microcontrollers. Plus dat je in de 'hogere' talen vaak met routines zit waarvan je niet helemaal doorhebt wat ze nu precies doen.

Sommige dingen moet je (ook in Mikrobasic) in assembly doen. Bijvoorbeeld het unlocken van PPS en schrijven naar flash.
Daar vooraf moet je een precies getimede sequence van 0x55 en 0xAA sturen, wat alleen zeker kan in assembly.

Hier heb ik al eens een leuk voorbeeld gegeven in assembly: een 4 digit led klok met gelijkzetmogelijkheid in maar 171 words geheugen... ;)
https://www.circuitsonline.net/forum/view/message/2107242#2107242

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Dat is zeker een leuke 'oefening' om eens mee te spelen.

Ik had hem inderdaad al een keer gekregen, maar dat gaat nu pas echt leven.

Waar haal ik de 'include PICF648a.inc' vandaan?

En is het nu makkelijk om de asm code op te nemen in MikroBasic? Het blijft / wordt dan wel nog steeds een .Mbas die later wordt gecompileerd tot een .hex?

Ik heb wat publicaties gelezen waarbij men het doet met een simpel tool als Notepad. Maar die gebruiken vervolgens vrijwel allemaal MPLAB als compiler.
En die had ik er nu net uitgegooid...

Code assembleer je met MPASM, daar zitten alle includes al in...
(MPLAB is geen compiler, maar een ontwikkelomgeving waar o.a. MPASM en de Microchip C compilers in/bij zitten)
Laatste goede MPLAB was 8.92, MPLABX vind ik een drama...
Versie voor de 16F1827. Korter, want save/restore hoeft niet meer. Maar 153 words (96.3% geheugen is nog leeg... :) :

pic asm code:


;==============================================================================
; CLOCK.ASM. Clock frequency = 10MHz
;==============================================================================
#include <p16F1827.inc>
 
				__CONFIG _CONFIG1, _FOSC_HS & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOREN_OFF 
                radix    dec
                errorlevel -302
 
digcount        equ     0x70                    ;Counters/digits
digit1          equ     0x71
digit2          equ     0x72
digit3          equ     0x73
digit4          equ     0x74
seccount        equ     0x75
flags           equ     0x76
mincount        equ     0x77
keycount        equ     0x78

#define         fminute flags,0
#define         fkeyrpt flags,1

#define         dp      latb,7
#define         button  porta,4
 
maxdigits       equ     d'4'
keytime         equ     d'250'
keyrepeattime   equ     d'30'

set_disp        macro   d4, d3, d2, d1          ;Macro to set display
                movlw   d4
                movwf   digit4
                movlw   d3
                movwf   digit3
                movlw   d2
                movwf   digit2
                movlw   d1
                movwf   digit1
                clrf    seccount
                bcf     fminute
                endm
 
;==============================================================================
; Program start
;------------------------------------------------------------------------------
                org     0x000
                goto    Init
 
;==============================================================================
; Interrupt routine
;------------------------------------------------------------------------------
Irq             org     0x004                   
                ;--------------------------------------------------------------
                banksel pir1                    ;See if timer2 interrupt
                btfss   pir1,tmr2if             ;
                goto    irq_end                 ;No, return
                ;--------------------------------------------------------------
                btfsc   button                  ;See if button pressed
                goto    button_no               ;No, end
                btfsc   fkeyrpt                 ;Yes, see if repeat
                goto    button_set              ;
                movlw   keytime                 ;See if max time
                xorwf   keycount,w              ;
                btfsc   status,z                ;
                goto    button_2                ;Yes, set repeat flag
                incf    keycount,f              ;First press, incr time
                movlw   keyrepeattime           ;if keyrepeattime reached
                xorwf   keycount,w              ;
                btfss   status,z                ;
                goto    button_end              ;
                goto    button_inc2             ;
button_2        bsf     fkeyrpt                 ;
                goto    button_inc              ;
button_set      incf    keycount,f              ;In repeat mode.
                movlw   keyrepeattime           ;Update time every repeat cycle
                xorwf   keycount,w              ;
                btfsc   status,z                ;
                goto    button_inc              ;
                goto    button_end              ;
button_no       bcf     fkeyrpt                 ;
                clrf    keycount                ;
                goto    button_end              ;
button_inc      clrf    keycount                ;
button_inc2     clrf    seccount                ;
                clrf    mincount                ;
                bsf     fminute                 ;
button_end
                ;--------------------------------------------------------------  		
                incf    seccount,f              ;Counter handling (250 irq's is
                movf    seccount,w              ;one second)
                xorlw   d'250'                  ;On 60 seconds, update minutes
                btfss   status,z                ;
                goto    irq_disp                ;
                clrf    seccount                ;
                incf    mincount,f              ;
                movf    mincount,w              ;  
                xorlw   d'60'                   ;
                btfss   status,z                ;
                goto    irq_disp                ;  
                clrf    mincount                ;
                bsf    	fminute                 ;
                ;--------------------------------------------------------------                  
irq_disp        movf    digcount,w		        ;Display update cycle
                call    digtab			        ;Digit 0 to MAXDIGITS
                movwf	porta                   ;
                movlw	digit1                  ;
                movwf	fsr0                    ;
                movf	digcount,w              ;
                addwf	fsr0,f                  ;
                movf	indf0,w                 ;
                call	segtab                  ;
                movwf	latb                    ;
                movf    digcount,w              ;
                xorlw   d'2'                    ;Toggle the DP every half second
                btfss   status,z                ;      
                goto    irq_disp_nodp           ;
                movf    seccount,w              ;
                sublw   d'125'                  ;
                btfss   status,c                ;
                bsf     dp                      ;
irq_disp_nodp   incf	digcount,f              ;    
                movf	digcount,w              ;
                xorlw	maxdigits               ;
                btfsc	status,z                ;
                clrf	digcount                ;
                ;--------------------------------------------------------------
                banksel	pir1                    ;Clear timer flag
                bcf		pir1,tmr2if
                goto	irq_end
                ;--------------------------------------------------------------  
segtab          addwf   pcl,f                   ;Segment tab (port B)
                dt      0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
                ;-------------------------------------------------------------- 
digtab          addwf   pcl,f                   ;Digit tab (port A)
                dt      0x1,0x2,0x4,0x8
irq_end         retfie                          ;

;==============================================================================
; Initialize
;------------------------------------------------------------------------------ 
Init		
                banksel pie1                    ;Enable timer2 irq
                bsf     pie1,tmr2ie             ;
                clrf	digcount                ;
		
                banksel t2con                   ;Timer 2 on
                movlw   b'00100111'             ;Prescaler 16, postscaler 5
                movwf   t2con                   ;
                movlw   d'124'                  ;
                movwf   pr2                     ;
		
                bsf     intcon,gie	        ;Interrupts on
                bsf     intcon,peie             ;
 
                clrf    seccount                ;Clr counters 
                clrf    mincount
                clrf    keycount

                banksel trisa                   ;Set in/output
                movlw   b'00010000'             ;
                movwf   trisa                   ;
                movlw   b'00000000'             ;
                movwf   trisb                   ;

                banksel ansela                  ;All digital
                clrf	ansela
                clrf	anselb
;==============================================================================
; Main program
;------------------------------------------------------------------------------
main            set_disp 0,0,0,0                ;Load with 00:00 (min:sec)
                
loop            btfss   fminute                 ;Loop until minute elapsed
                goto    loop

update          incf    digit1,f                ;Update minutes 
                movlw   d'10'
                xorwf   digit1,w
                btfss   status,z
                goto    loop_end
                clrf    digit1
		
                incf    digit2,f                ;Update minutes x 10
                movlw   d'6'             
                xorwf   digit2,w
                btfss   status,z
                goto    loop_end
                clrf    digit2
                
                incf    digit3,f                ;Update hours
                movlw   d'10'
                xorwf   digit3,w
                btfss   status,z
                goto    loop_end
                clrf    digit3
                incf    digit4,f

loop_end        bcf     fminute                 ;Update hours x 10
                movlw   d'2'
                xorwf   digit4,w
                btfss   status,z
                goto    loop
                movlw   d'4'
                xorwf   digit3,w
                btfsc   status,z
                goto    main
                goto    loop
				      
                end
Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ah, vandaar. Ik dacht dat je een tegenstander was van MPLAB. Maar dat sloeg dus op MPLABX...

Alvorens met het 'grote' werk te beginnen (zoals de klok van Arco), dacht ik in mijn onschuld om eerst een ogenschijnlijke eenvoudige tutorial op dit Forum uit te voeren om de eerste stappen in Assembler te volgen.

De MC is een PIC16F84A, en die had ik toevallig.
Het laat een ledje knipperen.

Maar ik krijg MPLAB v8.92 niet aan de praat. Steeds terugkerende errors, waarbij onderstaande hardnekkig is. Op de een of andere manier wil hij de PIC niet herkennen.

De tutorial is gemaakt in MPLAB v5.70, ik heb geprobeerd die dan maar te downloaden, maar werkt niet op een 64-Bits Windows PC.

Meest voorkomende fout: je hebt vergeten het voedingsspanningsvinkje aan te zetten...
(ik gebruik die MPLab programmer nooit: vreselijk)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

3FE0 is een 16F84, GEEN 16F84A!

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Dat is grappig...

Er staat toch echt 84A.

Zo had ik hem ook gekocht, als een PIC16F84A.

Maar ik heb dus nu maar in de settings gekozen voor de 84, en weg is de melding..
Daar ben je dan een hele avond mee bezig... :/

Blijkbaar is er veel veranderd na versie 5.70

De dingen die hieronder in de Tutorial staan zijn niet meer vindbaar (of ik kijk weer eens niet goed).
Zo heb ik ook nergens een 'developer mode' en/of de snelheid van de Oscillator (clock) kunnen vinden.

PIC microcontroller tutorial
Gepost door Bastiaan Steenbergen op donderdag 4 december 2003 00:33
Software
In deze tutorial gebruiken we assembler taal. Ik heb hiervoor gekozen omdat deze taal dicht bij de hardware staat. Zo is makkelijker te begrijpen hoe het geheel werkt en zo zijn simpele programma's te schrijven. Naarmate de programma's complexer worden kan worden gekozen voor C++ of een andere hogere programmeertaal. Om een programma in assemblertaal te schrijven hebben we het gratis ter beschikking gestelde programma MPLAB v5.70 van Microchip nodig. Dit is te downloaden op de site van Microchip. MPLAB is hier op onze site te vinden.

Het is een zeer goed programma, wat vele opties bevat. Zo kun je je programma in assembler taal schrijven en vervolgens assembleren. Maar ook nog eens simuleren om te analyseren of het wel correct werkt wat je hebt geschreven. We zullen je duidelijk maken hoe je een programma kunt schrijven, assembleren en vervolgens testen.

Assembler programma editten

Zoals ook in sommige andere programma's dien je te werken met projecten. Daarvoor maken we eerst een nieuw project aan. Dit doe je als volgt.
Kies voor "Project" in de menubalk gevolgt door "New Project?". Blader nu naar de directory waar je de files wilt hebben. Kies nu een filenaam voor je project en druk vervolgens op "OK". Check of er als "Language Tool Suite" voor Mircochip is gekozen, zoniet wijzig dit dan even.
Kies naast Development Mode voor "Change".

Development Mode veranderen
Development Mode veranderen
Nu kom je in het "Development Mode" scherm.
Kies in het tabblad "Tools", voor MPLAB-SIM Simulator.
En kies als "Processor:" de PIC16F84A.

De goede processor kiezen
De goede processor kiezen
Ga vervolgens naar het tabblad "Clock".
Stel het "Oscillator Type:" in op "XT".
Vink eerst het vakje MHz aan, zodat je erna bij "Desired Frequency:" 4.000 in kunt vullen.
De andere tabbladen blijven ongewijzigd. Als dit is voltooid kun je op "OK" drukken. Er worden een aantal meldingen gedaan maar die kunnen worden genegeerd.
En er kan net zolang voor "OK" worden gekozen totdat het normale lege programmaveld zichtbaar is.

2003?!

Ja, daarna is er wel het één en ander veranderd. Toen waren er nog mensen tevreden met een NOKIA 3310.

Microchip doet al jaren zijn best met MPLABX, dat valt af en toe niet mee, zowel voor Microchip als de gebruiker, maar je hoeft je niet meer te verlagen tot een inferieur operating system. En ondertussen is er best mee te werken, zowel in assembly, als in C.

Zolang het probleem niet duidelijk is, is het zinloos om naar een oplossing te zoeken.

Toen waren er nog mensen tevreden met een NOKIA 3310

Nu ook nog, hoor! Zoals ondergetekende. Mijn telefoontje, (weliswaar een Nokia 6610).

Héérlijk apparaat, doet het altijd en doet precies wat-ie moet doen: bellen!

Meest voorkomende fout: je hebt vergeten het voedingsspanningsvinkje aan te zetten...
(ik gebruik die MPLab programmer nooit: vreselijk)

Tegen die fout was ik inderdaad al een aantal keren aan gelopen.
En wat ook vervelend is, dat steeds de ingebrachte instellingen (power van device, spanning) opnieuw moeten worden ingebracht.

Het lijkt dan idd beter om snel weer 'gewoon' Pickit3 V3.10 te gebruiken voor programmeren van de MC en MPLAB alleen voor het 'builden' van de hex.

PICKit 3.10 kan de PIC16F84A niet vinden.
Deze chip staat ook niet in de device-list. Ik heb een paar dingen geprobeerd: 'standard' of '1.8v min'.

Stop ik er een PIC16f1827 in dan vindt-ie deze wel direct.

De 84 geeft dus een probleem:

De 16F84 is te oud om te detecteren.
Kies:
Programmer -> Manual device select
Device family -> Midrange -> No deviceId

De 16F84A staat onder Device family -> Midrange -> Standard

[Bericht gewijzigd door Arco op 8 november 2019 12:08:01 (21%)]

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Daar staat hij inderdaad tussen.
Maar geeft nog steeds "No Device Detected"

Ik heb het vermoeden dat het toch een PIC16F84 is vanwege

3FE0 is een 16F84, GEEN 16F84A!

.

en de 84 (zonder A) staat niet in de device lijst.

Hier wordt 'ie wel 'gezien', maar niet herkend/gedetecteerd uiteraard... (dat moet je met de hand doen)
De 84 (zonder A) staat gewoon in de (no deviceID) lijst...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Daar staat hij inderdaad. Maar als ik die kies dan blijft het wel "No device detected'.

Deze melding krijg je meteen bij een Read of Write.
Ik kan er daarom geen programma in zetten.

Ik heb nog even de configuration op 3FEO gezet, maar ook dat biedt geen soelaas.

Kan hier gewoon programmeren, hoor... Alleen eeprom erase klopt iets niet. Gaat mis bij adres 0x3B.
Schijnbaar een foutje in de scripting van de pickit. De 16F84 is ook al 10 jaar ouder als de pickit2 (en 15 jaar als de pickit3)...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Het is idd een oudje. Wel met dezelfde pinconfiguratie als de 628 en 1826/1827.

Ik nam hem omdat er wat tutorials waren die ik wilde volgen. Die zijn ook inmiddels wel van een tijdje geleden...
Maar ja, ik ben nu met een inhaalslag bezig.

Daarom nu de tutorial maar met de 1827 voortzetten. Die wordt gewoon gevonden met de Pickit3.

Ik las overigens her en der wat reacties dat de Pickit3 niet echt een verbetering is gebleken t.o.v. de Pickit3.

Ik las overigens her en der wat reacties dat de Pickit3 niet echt een verbetering is gebleken t.o.v. de Pickit3.

T.o.v. zichzelf zeker niet... Maar zeker ook niet t.o.v. de Pickit2... ;)
Wat je leest over de Pickit4 wordt je ook niet vrolijk van...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Ok, De Pickit3 doet het; de 1827 aangesloten.
Het simpele Ledje ASM programma uit de tutorial is:

pic asm code:



instelporta     EQU	85h
porta			EQU	05h
teller			EQU	40h
teller2	        EQU	41h

                ORG	00h     	;beginadres kiezen

				BSF 	03,5		;kies bank 1
				CLRF	instelporta	;alles pinnen poort A uitgang maken
	    		BCF 	03,5		;kies bank 0

knipper	        MOVLW	01h		;laad 01h in W
				MOVWF	porta		;zet de waarde van W
				;in porta, oftewel zet de led aan

                MOVLW	0FFh		;laad 0FFh in W
				MOVWF	teller2
verder          MOVLW	0FFh
				MOVWF	teller
opnieuw         DECFSZ	teller, 1
				GOTO	opnieuw
				DECFSZ	teller2, 1
				GOTO	verder

				MOVLW	00h		;laad 00h in W
				MOVWF	porta		;zet de waarde van W
					;in porta, oftwel doe de led uit

                MOVLW	0FFh		;1 cycle
				MOVWF	teller2		;1 cycle
again			MOVLW	0FFh		;1 cycle
				MOVWF	teller		;1 cycle
again2	        DECFSZ	teller, 1       ;1 cycle
				GOTO	again2		;2 cycles
				DECFSZ	teller2, 1
				GOTO	again

				GOTO	knipper	
		END]

Ik kan het vertalen met MPLAB 8.92 (overigens alleen met 'Quick Build', de rest van de mogelijkheden staat op 'disabled'.
Dan krijg ik een .hex en die probeer ik dan met PICkit v3.10 in de MC te programmeren.
Dat lukt, maar er komt wel een warning "No Configurations word in hex file" en dat ik Via MPLAB "File-Export to save hex with config" moet doen.

Dus ik in MPLAB File-Export (ziet er wel een beetje raar uit met al die venstertjes vind ik) File-Export gedaan en die als ledje.hex opgeslagen.
Dan programmeert de PICKit3 hem, nu zonder 'warning'.
Maar er gebeurt niks met de ledjes.

Ik vroeg me ook af: waar staan nu de config (zoals de kloksnelheid, etc)?

Ik heb het gevoel dat ik het nu helemaal niet goed doe.

In MikroBasic ging dat prima: Programma aanpassen, vertalen met CTRL-F9 en alles weer door PICKIT V3.10 automatisch opgepakt zonder exports, etc

Kleine toevoeging:

Ik had erbij staan #include <pic16f1827.Inc> maar dat levert een "not found" error op.