'Alleen berichten met trefwoorden tonen' kiezen...
Special Member
'Alleen berichten met trefwoorden tonen' kiezen...
Golden Member
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.
Special Member
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
Golden Member
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...
Special Member
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
Golden Member
Ah, vandaar. Ik dacht dat je een tegenstander was van MPLAB. Maar dat sloeg dus op MPLABX...
Golden Member
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.
Special Member
Meest voorkomende fout: je hebt vergeten het voedingsspanningsvinkje aan te zetten...
(ik gebruik die MPLab programmer nooit: vreselijk)
Special Member
3FE0 is een 16F84, GEEN 16F84A!
Golden Member
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...
Golden Member
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.
Golden Member
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.
Special Member
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 vrijdag 8 november 2019 12:08:01 (21%)
Golden Member
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.
Special Member
Golden Member
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.
Special Member
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)...
Golden Member
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.
Special Member
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...
Golden Member
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
Golden Member
Kleine toevoeging:
Ik had erbij staan #include <pic16f1827.Inc> maar dat levert een "not found" error op.