Hoihoi
Michel
http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 8 mei 2005 11:58:19 schreef Hoihoi:
http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)
ja mees/juf 
Op 8 mei 2005 11:58:19 schreef Hoihoi:
http://www.circuitsonline.net/download/view/58
he!, een pic simulator. kom nou niet gelijk met vragen over dit programma. ga ff het hele programma uitpluizen en leren en dat gaat wel ff duren (zowieso dat pic programmeren)
Of gebruik de simulator in MPLAB. Wel even uitvogelen hoe het met de externe inputs (stimuli files) zit, maar daar heb je manuals en help files voor.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
probleem gevonden: ik moet return aan het eind van het stuk code zetten waar call naar verwijst (toch?)
dus:
#define input 06,0
#define output 06,5
#define trisb 86h
#define teller 40h
#define teller2 41h
org 00h
bsf 03,5
bsf input
bcf output
vier btfss input
goto vier
call delay
call delay
bsf output
call delay
bcf output
call delay
bsf output
call delay
bcf output
call delay
goto vier
delay movlw 0FFh
movwf teller2
verder movlw 0ffh
movwf teller
opnieuw decfsz teller,1
goto opnieuw
decfsz teller2,1
return
goto verder
klopt dat?
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Mag ik je allereerst even wijzen op dit stukje
Gepost maandag 18 april 2005 19:42:37
TRISA EQU 85h TRISB EQU 86h PORTA EQU 05h PORTB EQU 06h ORG 00h BSF 03,5 ;naar bank 1 CLRF TRISB BCF 03,5 ;naar bank 0 movlw b'11111111' ;alles aan movwf PORTB ;waarde van W naar de poort endWaarom gebruik je niet de Include-files? (Zie onderstaand voorbeeld) Zo word je programma veel overzichtelijker en kan je de registers en bits in je programma met de naam noemen die in de datasheet staat aangegeven. Als je een groot programma maakt, wie weet nu direkt dat 0x03 het adres van het statusregister is? en 0x05 de RP0-bit?
#include "P16F628.inc" ORG 00h BSF STATUS, RP0 ;naar bank 1 CLRF TRISB BCF STATUS, RP0 ;naar bank 0 movlw b'11111111' ;alles aan movwf PORTB ;waarde van W naar de poort endOk, dit is niet de oplossing voor je vraag, maar het programmeerd al veel overzichtelijker.
Btw, heb je al eens geprobeerd PORTB als input te gebruiken en PORTA als output? Bij PORTB kan je de pull-ups inschakelen, want ik denk dat dat het probleem kan zijn bij je projekt...
Groetjes
Dit komt uit deze discussie
http://www.circuitsonline.net/forum/view/20528
En nog een discussie http://www.circuitsonline.net/forum/view/13171
Ontopic:
Dit klopt idd: Na een call keer je terug met een return functie:
* return
* retlw 0x00 (of welke waarde dan ook)
* retfie (return met interupt enabled)
Opmerkingen:
org 0x000
Je gaat wel naar BANK1 maar keert niet meer terug naar BANK0
2 x delay achter elkaar
volgens mij moet de delay er zo uitzien
delay movlw 0xff (is denk ik duidelijker)
movwf teller2
verder movlw 0xff
movwf teller
opnieuw decfsz teller, f (kan alleen als je de include file gebruikt)
goto opnieuw
decfsz teller2, f
goto verder
return
Programma eindigen met END
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 9 mei 2005 12:43:43 schreef Willie Worteltje:
Mag ik je allereerst even wijzen op dit stukje
[...]
ja hoor
Dit komt uit deze discussie
http://www.circuitsonline.net/forum/view/20528En nog een discussie http://www.circuitsonline.net/forum/view/13171
ik ga niet gelijk hele grote programma's maken, dus het overzicht houd ik nog wel, maar toch handig, bedankt.
Ontopic:
Dit klopt idd: Na een call keer je terug met een return functie:
* return
* retlw 0x00 (of welke waarde dan ook)
* retfie (return met interupt enabled)
dus de return komt aan het einde van dat stuk code dat met de call geroepen word, en niet op het punt dat je terug wilt komen na de call? bedoel je dat ik dat goed had?
Opmerkingen:
org 0x000
moet alles dan met 0xwaarde? dus b.v. 45h word 0x045?
Je gaat wel naar BANK1 maar keert niet meer terug naar BANK0
gromerdegrom, vergeten, stom van me!
2 x delay achter elkaar
iets langere pauze, of mag dat niet op die manier?
volgens mij moet de delay er zo uitzien
delay movlw 0xff (is denk ik duidelijker) movwf teller2 verder movlw 0xff movwf teller opnieuw decfsz teller, f (kan alleen als je de include file gebruikt) goto opnieuw decfsz teller2, f goto verder return
de delay heb ik letterlij uit de micrcontroller toturital...
en zoals ie daar staat snap ik m, hier niet geheel...
Programma eindigen met END
dat heb ik gedaan, zal bij het coppypasten zijn foutgegaan.
tenzij...
* Lucky Luke gaat je bericht ff los op zn pc zetten, dan kan ie t erbij houden als ie gaat ontfouten (nieuw werkwoord?)
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Opmerkingen:
org 0x000moet alles dan met 0xwaarde? dus b.v. 45h word 0x045?
Nee alleen bij org.
Dit is omdat de PIC uit meerdere pages bestaat.
Een page = 255 oftewel ff.
Een pic16F84 heeft 1k code en dus 4 pages 4x255 = 1024 -> 000 - 3FF
Een pic16F628 heeft 2k code en dus 8 pages 8x255 = 2048 -> 000 - 7FF
iets langere pauze, of mag dat niet op die manier?
zekers mag dat, maar het lampje moet toch 2 x knipperen als je op het knopje drukt? Nu moet je eerst wachten tot je resultaat ziet. Is niet praktisch.
en wat snap je niet aan de delay routine?
Edit:
;voeg dit toe aan het begin
w equ 0 ; nu kan je w als 0 destination gebruiken, dus je werkregister
f equ 1 ; nu kan je f als 1 destination gebruiken, dus je fileregister
delay movlw 0xff
movwf teller2
verder movlw 0xff
movwf teller
opnieuw decfsz teller, f
goto opnieuw
decfsz teller2, f
goto verder
return
Dit is een code die 196100 instructies gebruikt. Op 4Mhz = dat 0,196100 seconde.
Als je deze delay in basic zou schrijven ziet ie er zo uit:
For teller2 = 255 to 1 step -1
For teller = 255 to 1 step -1
Next teller
Next teller2
Misschien is dit duidelijker?
Als je een of beide init waarden (0xff) kleiner maakt wordt de wachtlus korter. Bijvoorbeeld als je
delay movlw 0x82
movwf teller2
verder movlw 0xff
movwf teller
opnieuw decfsz teller, f
goto opnieuw
decfsz teller2, f
goto verder
return
Dit is een code die 99975 instructies gebruikt. Op 4Mhz = dat 0,099975 seconde.
Je kan nog een derde lus meenemen om zo nog langere tijden te wachten.
delay movlw 0x0A
movwf teller3
delay1 movlw 0x82
movwf teller2
delay2 movlw 0xff
movwf teller
delay3 decfsz teller, f
goto delay3
decfsz teller2, f
goto delay2
decfsz teller3, f
goto delay1
return
Dit is een code die ongeveer 10 x 99975 instructies gebruikt. Op 4Mhz = dat ongeveer 1 seconde.
Je mag ook diverse formaten door elkaar gebruiken
delay movlw 0x0A
movwf teller3
is hetzelfde als
delay movlw D'10'
movwf teller3
en hetzelfde als
delay movlw b'00001010'
movwf teller3
[Bericht gewijzigd door Willie Worteltje op ]
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
#define input 06,0
#define output 06,5
#define trisb 86h
#define teller 40h
#define teller2 41h
org 0x000
bsf 03,5
bsf input
bcf output
bcf 83,5
vier btfss input
goto vier
call delay
call delay
bsf output
call delay
bcf output
call delay
bsf output
call delay
bcf output
call delay
goto vier
delay movlw 0FFh
movwf teller2
verder movlw 0FFh
movwf teller
opnieuw decfsz teller,1
goto opnieuw
decfsz teller2,1
goto verder
return
end
klopt dit?
en over dat wachten op resultaat: zo lang duurt dat toch niet?
en over het niet snappen van de delay: ik snap ook "mijn"delay niet, hij komt letterlijk uit de micrcontroller toturital. (die was voor een PIC16F84A, zijn die ook hetzelfde qua tellers ed.? ofwel: gaat dát ook goed?)
[Bericht gewijzigd door Lucky Luke op ]
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
dank je, maar begrijp ik het goed dat je met een d ervoor je je getallen ook gewoon decimaal kan opgeven?
* Lucky Luke gaat stoppen met de pc, hij denkt niet meer helder.
* Lucky Luke moet nog maar eens gaan graven naar tellers in de datasheet.
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.
Ik heb je progje voor je geoptimaliseerd.
Zal ik hem posten of wil je zelf stoeien?
Op 9 mei 2005 19:21:23 schreef Willie Worteltje:
ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.
Of een puntje ervoor, minder typewerk 
Je kan trouwens instellen wat hij doet als er niks voorstaat. Standaard is dat hexadecimaal, maar je kan het veranderen naar bijvoorbeeld decimaal of octaal (8-tallig) stelsel. Dit gaat met het radix directive
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 9 mei 2005 19:21:23 schreef Willie Worteltje:
ja met een d kan je decimaal. Wel tussen '' zetten. Cool he.
handig eerder, wel geinig, ook.
Ik heb je progje voor je geoptimaliseerd.
Zal ik hem posten of wil je zelf stoeien?
ga eerst zelf knoeien, want ik wil vooral wat leren, ik heb ook maar 1 uC gesampled (stomme fout merk ik nu, maar toen dacht ik dat ik er maar 1 nodig had, maar nu wil ik er mee door) en die is er nog niet eens 
dus dit gaat gewoon eerst in die ene om proggen ed te testen, en dan ga ik aan die rgbled. dus dan gaat die erin.
dan zie ik als ik dat rgbled project af heb wel weer verder. dan sample ik er nog wat (zolang micrchip blijft sturen als ik gewoon eerlijk op hun vragen antwoord, per slot van rekening, 1 ding maken is een oplage minder dan 1000)ofzo...
eerst maar eens vissen hoe die tellerfunctie werkt. dat snap ik ook niet helemaal, gedetaileerde vraag later, ga me eerst grondig oriënteren.
* Lucky Luke heeft het druk, maar je hebt het nooit te druk om wat leuks te leren:), en over 5 weeksjes heeft lucky luke weer bijna een maand de tijd voor electro.
:D:D (ja, en dan wil de tijd wel sneller gaan
)
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Oke dan.
Nog een Tip:
Gebruik de MPLAB simulator.
Kan je stap voor stap door de code heen stappen.
Dan 'zie' je gelijk hoe de teller werkt.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Op 10 mei 2005 18:27:47 schreef Willie Worteltje:
Oke dan.Nog een Tip:
Gebruik de MPLAB simulator.
Kan je stap voor stap door de code heen stappen.
Dan 'zie' je gelijk hoe de teller werkt.
heb ik gedaan maar dat duurt gigalang met 2 tellers van 255 naar 0. vandaar dat ik dat waarde opgeven zo handig vind, dan zet ik ze op D'3' ofzo.
Op 10 mei 2005 18:30:08 schreef Lucky luke:
[...]
heb ik gedaan maar dat duurt gigalang met 2 tellers van 255 naar 0. vandaar dat ik dat waarde opgeven zo handig vind, dan zet ik ze op D'3' ofzo.
je kunt ook een breakpoint zetten na de teller, ben je bij de teller aangekomen dan doe je "step out" en dan doorloopt hij de teller en dan stopt hij weer bij het breakpoint na de teller. En dat scheelt idd een hoop tijd
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
'k snap toch zo nog niet het een en ander over die tellers, ik zou iets meer info willen als in de microicontroller toturital, maar minder dan in de datasheet, die komt weer aanzetten met watchdogtimers e.d. en prescaler (wat is dat nu weer?)??
edit: mischien handig, ik heb deze datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/40300c.pdf
[Bericht gewijzigd door Lucky Luke op ]
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Dat is DE datasheet die je moet hebben.
Ik neem dit voorbeeld even:
delay movlw 0x0A
movwf teller3
delay3 movlw 0x82
movwf teller2
delay2 movlw 0xff
movwf teller
delay1 decfsz teller, f
goto delay1
decfsz teller2, f
goto delay2
decfsz teller3, f
goto delay3
return
In deze delay routine zijn 3 loops in elkaar gebouwd.
We beginnen met de binnenste loop
delay2 movlw 0xff ; laad init waarde 255
movwf teller ; in register teller 1
delay1 decfsz teller, f ; trek 1 van register af en spring over de
; volgende instructie als registerwaarde 0 is
goto delay1 ; ga naar delay1
decfsz teller2, f ; hier springt de uC naartoe als teller = 0
Dit zijn dus 255 loops voordat de uC uit de loop springt.
We kijken nu naar delay2. Deze omvat delay1.
delay3 movlw 0x82
movwf teller2
delay2 movlw 0xff
movwf teller
delay1 decfsz teller, f
goto delay1
decfsz teller2, f
goto delay2
decfsz teller3, f
delay2 wordt 130x uitgevoerd en in delay2 wordt delay1 255x uitgevoerd. In totaal wordt delay1 130x255=33150x uitgevoerd.
Voor delay3 geldt net zo iets.
delay3 wordt 10x uitgevoerd en en elke delay wordt dus 130x delay2 uitgevoerd en 33150x delay1. In totaal wordt delay3 10x uitgevoerd, delay2 1300x en delay1 331500x.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
hoe een delay met tellers werkt snap ik, dat staat ook duidelijk in de toturital (maar bedankt voor de extra uitleg) ik snap niet hoe het zit met gedeelde prescalers, wdt's e.d die óók iets met die tellers van doen lijken te hebben.
??
Op 14 mei 2005 19:34:23 schreef Lucky luke:
hoe een delay met tellers werkt snap ik, dat staat ook duidelijk in de toturital (maar bedankt voor de extra uitleg) ik snap niet hoe het zit met gedeelde prescalers, wdt's e.d die óók iets met die tellers van doen lijken te hebben.
Er zitten twee prescalers in de 16F628:
1) Timer 2 heeft een eigen prescaler.
2) Bij de andere prescaler kan je kiezen of je hem voor de WDT wil gebruiken OF voor Timer 0. Dus voor slechts een van de twee, de keuze maak je met het PSA bitje.
De prescalers delen trouwens het klok signaal door een in te stellen waarde. Op die manier kan je langere tijden instellen voor de timers.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
dat is 1 van de twee dingen die ik wou weten, dan nog 1 (vele zullen volgen vrees ik, maar ook op ander gebieden natuurlijk:))
waar moet ik voor kiezen: de WDT, of timer0?
wat heeft elke keuze voor consequenties?
Op 14 mei 2005 22:23:24 schreef Lucky luke:
waar moet ik voor kiezen: de WDT, of timer0?
Timer0 als je hem nodig hebt.
De WDT zul je nooit gebruiken. (Zoek maar eens uit waar een watchdog timer voor bedoeld is).
Normaal zet je de fuses zo dat deze disabled is (WDT_OFF of zo iets)
[Bericht gewijzigd door JoWi op ]
Waarom nou meteen zo moelijk beginnen? Laat die WDT, TIMER0 A/D ingangen ed gewoon met rust, en begin er pas mee als je wat verder bent. Begin gewoon met een programma dat een ledje aan kan zetten, voeg dan eens een schakelaar toe die het ledje bestuurd, dan een delay loop (zonder timer0, maar gewoon met een variabele) enz. Bouw het rustig op
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
Kan het niet laten
. Ook voor andere beginners die dit lezen de code.
LIST P=16F628 ; welke processor ?
include <P16F628.INC> ; standaard definities
__CONFIG _CP_ALL & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _LVP_OFF & _BODEN_OFF & _DATA_CP_ON
ERRORLEVEL -302 ; ignore: Register in operand not in bank 0
CBLOCK 0x20 ; begin met variabelen
teller1
teller2
teller3
ENDC ; einde variabelen
#define input PORTB,0 ; input zit op pin 6
#define output PORTB,5 ; output zit op pin 10
#define BANK0 bcf STATUS,RP0 ; RAM PAGE 0
#define BANK1 bsf STATUS,RP0 ; RAM PAGE 1
org 0x000 ; begin van de chip
; ----------------
; INITIALIZE PORTS
; ----------------
r_init movlw D'7'
movwf CMCON ; Comparators off, all pins digital I/O
clrf PORTA ; reset PORTA
clrf PORTB ; reset PORTB
BANK1
movlw b'11111111'
movwf TRISA ; PORTA alles input
movlw b'00000001'
movwf TRISB ; RB0 input rest is output
BANK0
; ----------------
; Reset registers
; ----------------
r_clear clrf teller1
clrf teller2
clrf teller3
; ----
; Main
; ----
main btfss input ;wacht op input hoog
goto main ;spring terug naar main als input er niet is
bsf output ;led aan
movlw D'5' ;5
call delay ;x 0,1 = 0,5 sec wachten
bcf output ;led aan
movlw D'5' ;5
call delay ;x 0,1 = 0,5 sec wachten
bsf output ;led aan
movlw D'5' ;5
call delay ;x 0,1 = 0,5 sec wachten
bcf output ;led aan
movlw D'5' ;5
call delay ;x 0,1 = 0,5 sec wachten
btfsc input ;wacht op input laag
goto $-1 ;spring een stap terug als input nog hoog is
goto main ;oneindige herhaling van het stukje main
; -------------
; Delay routine
; -------------
delay movwf teller3
delay1 movlw 0x82
movwf teller2
delay2 movlw 0xff
movwf teller1
delay3 decfsz teller1, f
goto delay3
decfsz teller2, f
goto delay2
decfsz teller3, f
goto delay1
return
; let op als je deze routine gebruikt.
; zet een waarde in w
; 1 x 0,1 = 0,1 seconde wachten
; 0 x 0,1 = 256 x 0,1 = 25,6 seconde wachten.
END