sille
Electronics is a fine hobby ;-) http://www.electro-online.be
hoi,
iemand vroeg me of ik een codeslot voor zijn deur kon maken. volgens mij was dat deftig te realiseren. ik had op deze site met de PIC16F84 leren werken. dus heb ik mij op dat projectje gestort.
Ik heb nog nooit echt programmatje geschreven voor en PIC, enkel met ledjes die ik aan en uit deed gaan, maar dat was dan ook alles. Een codeslot programeren is wel wat meer dan dat, maar ik ben aan het oefenen geslagen, en ik denk dat ik toch wel al een deftig resultaat heb.
Maar nu komt het. Het praktische van de schakeling heb ik nog niet. moet nog zo goed als alle componenten ervoor kopen en dus kan ik mijn programmatje niet testen.
En aangezien ik enorm sukkel met de simulatie modus van MPLAB. weet ik dus niet of het werkt.
Mijn vraag is nu of iemand van jullie, die daar wat ervaring mee heeft, de programmacode es wil bekijken. Want zonder praktische uitvoering kan ik het niet controleren.
het is nog niet klaar ma wel al functioneel denk ik. ik wil er later nog wat functies aan toevoegen.
hier mijn programmacode
Start ORG 0x00
BSF 03,5
MOVLW 0ffh
MOVWF 05h
MOVLW 00h
MOVWF 06h
BCF 03,5
getal1 equ 21h ;instellen van labels van geheugenplaatsen
getal2 equ 22h
getal3 equ 23h
getal4 equ 24h
code1 equ 31h
code2 equ 32h
code3 equ 33h
code4 equ 34h
tijd1 equ 25h
tijd2 equ 26h
tijd3 equ 27h
ingang equ 05h
deling equ 03h
los equ 0fh
reset clrf getal1 ;alle getallen uit het geheugen wissen
clrf getal2
clrf getal3
clrf getal4
instel movlw 02h ;echte code inbrengen in het geheugen, vb 2481
movwf code1 ;code1 vb 2
movlw 04h
movwf code2 ;code2 vb 4
movlw 08h
movwf code3 ;code3 vb 8
movlw 01h
movwf code4 ;code4 vb 1
begin movf ingang,0 ;controle of er een knopje is ingedrukt
xorlw los
btfss deling,2
goto begin
goto knop1 ;gaat verder wanneer er een knop ingedrukt word
knop1 movf ingang,0 ;ingedrukte knop 1 opslaan
movwf getal1
call klos
call kin
knop2 movf ingang,0 ;ingedrukte knop 2 opslaan
movwf getal2
call klos
call kin
knop3 movf ingang,0 ;ingedrukte knop 3 opslaan
movwf getal3
call klos
call kin
knop4 movf ingang,0 ;ingedrukte knop 4 opslaan
movwf getal3
call klos ;controleren of knop 4 gelost word
goto controle ;controleren of alle knoppen goed ingedrukt zijn
controle movf getal1,0 ;controle getal 1
xorlw code1
btfss deling,2
goto reset ;als getal niet klopt, herstart
movf getal2,0 ;controle getal 2
xorlw code2
btfss deling,2
goto reset ;als getal niet klopt, herstart
movf getal3,0 ;controle getal 3
xorlw code3
btfss deling,2
goto reset ;als getal niet klopt, herstart
movf getal4,0 ;controle getal 4
xorlw code4
btfss deling,2
goto reset ;als getal niet klopt, herstart
goto open ;als alles klopt, de deur gaan openen
open bsf 06h,0 ;open de deur
goto topen
dicht bcf 06,0 ;sluit de deur
goto begin
klos movf ingang,0 ;controleren of er een klop los is
xorlw los ;gaat alleen verder wanneer een knop losgelaten wordt
btfss deling,2
goto klos
return
kin movlw 0FFh ;bepaalen hoe lang het mag duren voor volgende knop is ingedrukt
movwf tijd3
kin1 decf tijd3,1
movf tijd3,0 ;controleren of er een knop ingedrukt is
xorlw 00h ;gaat alleen verder wanneer een knop ingedrukt is
btfsc deling,2 ;als de t op is, kijke of
;de knop nog ingedrukt is, anders verder aftellen
goto reset ;naar begin terug gaan
movf ingang,0 ;controleren als de knop niet meer ingedrukt is
xorlw los
btfsc deling,2
goto kin1 ;als de knop ingedrukt is,verdergaan, anders verder aftellen
return
topen nop ;tijd dat de deur open mag blijven
movlw 0FFh ;vb 3 seconden
movwf tijd2
topen1 movlw 0FFh
movwf tijd1
topen2 decfsz tijd1,1
goto topen2
decfsz tijd2,1
goto topen1
goto dicht
END
Ik heb het programmatje geschreven met volgende functies.
Er zijn 4 toetsen van 0 tot 9 die ingedrukt kunnen worden om een code te vormen. wanneer een toets ingedrukt word, worden deze opgeslagen, en word er gewacht tot een volgende toets ingedrukt wordt. Ik heb geprobeerd om een bepaalde tijd tussen de toetsindrukkingen te steken zodat hij herbegint wanneer er bv na 2sec geen toets meer ingedrukt wordt.
wanneer alle codes ingedrukt zijn worden ze gecontroleerd of ze overeenkomen met de voorgeprogrameerde codes. wanneer dit niet zo is begint hij gewoon opnieuw. wanneer dit wel zo is moet er een signaal gestuurd worden naar de deur om het slot bv 3sec te openen, en daarna terug automatisch te sluiten. daarna begint het programma gewoon opniew. wachtend op een nieuwe code die later kan ingedrukt worden.
dit is wat ik denk en verwacht dat mijn programma doet.
later wil er ik nog een programeer functie insteken.
Ik weet dat ik redelijk veel vraag, maar het is mijn aller eerste deftige programma dat ik schrijf voor een µC. en ik had graag geweten of ik op de goede richting ben.
Hartelijk bedankt al, voor al degenen die de moed hebben gehad deze tekst te lezen, en nog meer bedankt voor wie mij zou kunnen helpen.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Ik zal er als ik tijd voor heb ff naar kijken. Maar ik garandeer je niks aangezien ik me er helemaal in moet gaan verdiepen om te kijken of het klopt.
sven
pointers don't kill programs, programmers kill programs
Zelfs al zou het programma werken, bouw het best eerst effe op een breadboard. Er zullen steeds aanpassingen nodig zijn aan de hard- en/of soft-ware. Indien je een schema kan opbouwen van nul zonder 1 fout te maken, ga je nog veel geld kunnen verdienen.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Daar zegt sven idd iets heel belangrijks. Ikzelf zit ook heel vaak nog mijn programma's tig keer aan te passen omdat ik iets over het hoofd had gezien. (ondanks dat dat laatste niet vaak gebeurt
)
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
Op do 24-10-2002 23:21:46 schreef sven:
Zelfs al zou het programma werken, bouw het best eerst effe op een breadboard. Er zullen steeds aanpassingen nodig zijn aan de hard- en/of soft-ware. Indien je een schema kan opbouwen van nul zonder 1 fout te maken, ga je nog veel geld kunnen verdienen.
met de hardware zit ik niet zo in. dat is niet meer zo nieuw allemaal voor mij. Ik studeer nu al mijn 3de jaar elektronica. Het software deel, dat is wat anders. dat is wel nieuwer. Maar ik snap het principe. dat programmatje dat ik gemaakt heb, het zal niet optimaal zijn, en misschien kan het veel eenvoudiger.
Ik zal het proberen op een breadboard. maar dan zal ik eerst nog wat extra componenten nodig hebben. En dat zal maar voor volgdende week zijn. want ik ga voor een groot weekje op vakantie 
Op vr 25-10-2002 00:02:11 schreef Bastiaan:
Daar zegt sven idd iets heel belangrijks. Ikzelf zit ook heel vaak nog mijn programma's tig keer aan te passen omdat ik iets over het hoofd had gezien. (ondanks dat dat laatste niet vaak gebeurt)
zolang ik het praktisch niet kan uittesten, kan ik geen fouten ontdeken om ze dan eruit te kunne halen. daarom dat ik dit hier even vraag. Als jullie zeggen dat het nooit zal werken dit programmatje, dan heeft het geen zin dat ik verder er aan werk. Ik wil gewoon weten of ik op goede weg ben of net niet.
alvast bedankt voor de moeite
[Bericht gewijzigd door sille op ]
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op vr 25-10-2002 12:49:57 schreef Bernd:
mag ik even een offtopic vraagje stellen? Wat is in vredesnaam het verschil tussen CALL en GOTO??
Met GOTO laat je de controller springen naar een bepaald regel.
Met CALL laat je de controller springen naar een bepaalde regel en tegelijk slaat die in zijn geheugen (stack) op waar die vandaan kwam. Dus met een CALL kun je weer teruggaan naar waar je vandaan kwam, omdat die dat heeft onthouden. Met GOTO kan dat niet.
Waarom gebruik je dan niet altijd CALL zou je je misschien afvragen. Nou dat komt omdat de controller maar een 7 level diepe stack heeft. Oftwel hij kan maar tot 7 niveau's diep het terugkeeradres onthouden. Als je het dus niet nodig hebt moet je GOTO gebruiken.
CALL gebruik je vooral bij routines die je vaak moet aanroepen. Zoals bijvoorbeeld wachtlussen. En aangezien je die telkens vanuit een ander stukje programma aanroept is het makkelijk dat die weer terug kan gaan naar waar die vandaan kwam (en dat is telkens weer anders natuurlijk).
aha tja wist ik niet... met basic programmeren op mn ti83 hebje geen call, alleen maar goto en label... dus ik ben wel gewend of ook lussen te doen met goto en lbl. Bedankt voor de info... zal ns toepassen in mn proggies 
Op 24 oktober 2002 22:28:49 schreef sille:
En aangezien ik enorm sukkel met de simulatie modus van MPLAB. weet ik dus niet of het werkt.MultiSIM 2002 is te vinden op het net, indien iemand Ultiboard 2002 ook weet staan gelieve mij te verwittigen...
MultiSIM is EASY en gebruiksvriendelijk..
/MODbreak, dit soort requests van jou zijn NIET toegestaan. gelieve je hier aan te houden.
en daarbij is deze post vrij offtopic
maar omdat je nieuw bent is het je vergeven
lees wel eerst ff de FAQ door
[Bericht gewijzigd door Jeroen Boere op ]
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 11 november 2002 22:40:45 schreef RoBSki!:
Je kunt ook een AVR nemen een stuk eenvoudiger te programmeren, en sneller
Nou ik ken die PIC's goed en ben dus nu ook met AVR bezig. Maar het programmeren is wel een tikkeltje lastiger dan PIC hoor. Niet dat ik er moeite mee heb, want ik kan zelfs 32-bits dingen van Motorola programmeren. Maar voor beginners is de PIC zeker makkelijker vind ik. Minder instructies, beter overzicht van de mogelijkheden, enz.
Bastiaan
Bachelor of Engineering -- Microcontrollers AVR, PIC (asm, C), PC applicaties (C, C++), Webpages (HTML, CSS, PHP, SQL), Rail-infra engineer
Op 11 november 2002 23:13:38 schreef elektron_:
Ik zie dat de gebruiker nooit zijn code kan veranderen.
Dat is jammer.
Welke gebruiker en waar zie je dat?
Volgens mij ontbreekt er iets zeer essentieels in je code, tenzij je dit met hardware reeds doet: ontdenderen van je toetsen. Als je hier nog niet aan gedacht hebt, of het begrip zelfs niet kent; bij indrukken en loslaten van een toets krijg je het zogenaamde 'dender'-verschijnsel; Allemaal piekjes achter elkaar die je u-controller inleest als zijnde toets aan/uit aan/uit etc. Op deze manier zal de processor altijd de verkeerde code lezen en zal de deur dus niet opengaan, ook als je correcte code intoetst.
ALs je dit met hardware wilde oplossen vergeet dan deze opmerking. De software oplossing komt er op neer dat je een lijn twee maal scant met daartussen een pauze van bijvoorbeeld 200us; de dender is dan achter de rug. Als de twee gescande waardes gelijk zijn is de toets-status (aan of uit) geregistreerd.
Nog een puntje; ik snap niet helemaal hoe je je toetsen aansluit op de u-processor. Heb je wel eens gehoord van een diodematrix? Werkt altijd correct en efficient met je lijnen. Een matrix van bijvoorbeeld vier x vier toetsen (=16) kun je uitlezen met 8 lijnen. Een matrix van 8x8 (=64) toetsen kun je uitlezen met 16 lijnen etc...
Als het allemaal wat ingewikkeld overkomt, komt dat waarschijnlijk omdat ik net wakker ben en mijn uitdrukkingsvaardigheid nog wat de wensen over laat.
Anyways, succes met je project!
elektron_
beetje gek
Op 12 november 2002 11:46:08 schreef DIY:
Nog een puntje; ik snap niet helemaal hoe je je toetsen aansluit op de u-processor. Heb je wel eens gehoord van een diodematrix? Werkt altijd correct en efficient met je lijnen. Een matrix van bijvoorbeeld vier x vier toetsen (=16) kun je uitlezen met 8 lijnen. Een matrix van 8x8 (=64) toetsen kun je uitlezen met 16 lijnen etc...
Ik zat ook een beetje met deze vraag:
Je leest PortA in maar deze heeft maar 5 bits.
Hier is een mooie samenvatting over allerlei methodes van key-input,input:
http://oase.uci.kun.nl/~mientki/PIC/Projects/Pic_switch.htm
sille
Electronics is a fine hobby ;-) http://www.electro-online.be
Ik zie dat de gebruiker nooit zijn code kan veranderen.
Dat is jammer.
zoals ik in mijn vraag geschreven had was dit programmatje nog maar een begin. ik had er in vermeld dat ik later een functie wou inbouwen zodat de gebruiker de code zou kunnen veranderen. Ik had dit graag met een '#' of '*' gedaan, maar de 74ls147 laat mij niet toe om met meer dan 0-9 tekens te werken 
Op 12 november 2002 11:46:08 schreef DIY:
Volgens mij ontbreekt er iets zeer essentieels in je code, tenzij je dit met hardware reeds doet: ontdenderen van je toetsen. Als je hier nog niet aan gedacht hebt, of het begrip zelfs niet kent; bij indrukken en loslaten van een toets krijg je het zogenaamde 'dender'-verschijnsel; Allemaal piekjes achter elkaar die je u-controller inleest als zijnde toets aan/uit aan/uit etc. Op deze manier zal de processor altijd de verkeerde code lezen en zal de deur dus niet opengaan, ook als je correcte code intoetst.
ALs je dit met hardware wilde oplossen vergeet dan deze opmerking. De software oplossing komt er op neer dat je een lijn twee maal scant met daartussen een pauze van bijvoorbeeld 200us; de dender is dan achter de rug. Als de twee gescande waardes gelijk zijn is de toets-status (aan of uit) geregistreerd.
toen ik er vorige week nog es zat op te kijken, zag ik ook in dat ik problemen ging krijgen met contactdender (het begrip komt mij bekend voor
) Daarom heb ik ook es gezocht of ik dit softwarematig kon oplossen ipv condensatortjes en weerstandjes. Ik had er aangedacht om wanneer de PIC een verandering aan de ingang zag, nog bv 100µs te wachten voor dat hij de data in zou lezen.
Aan de andere kant komt de ingang van een TTL ic (74ls147), en denk ik dat het zou kunnen dat de uitgangen dan al gebufferd waren en de dender niet meer aanwezig zou zijn
Nog een puntje; ik snap niet helemaal hoe je je toetsen aansluit op de u-processor. Heb je wel eens gehoord van een diodematrix? Werkt altijd correct en efficient met je lijnen. Een matrix van bijvoorbeeld vier x vier toetsen (=16) kun je uitlezen met 8 lijnen. Een matrix van 8x8 (=64) toetsen kun je uitlezen met 16 lijnen etc...
Ik wou het eerst op deze manier oplossen, maar toen ik een display ging kopen, merkte ik op dat het al op een print was bevestigd, en dat er 14 uitgangsprintbaantjes waren. dus kon ik de matrix op mijn buik schrijven, en gaan zoeken naar een decimaal naar bcd converter.
Ik zou normaal alle componenten deze week moeten hebben die ik besteld heb, en dan kan ik eindelijk beginnen bouwen en testen! iedereen al bedankt om te reageren.
khou jullie op de hoogte !
Sille
elektron_
beetje gek
Op 12 november 2002 23:16:00 schreef sille:
zoals ik in mijn vraag geschreven had was dit programmatje nog maar een begin. ik had er in vermeld dat ik later een functie wou inbouwen zodat de gebruiker de code zou kunnen veranderen.
Je hebt gelijk.
Hier is misschien iets voor jou.
Hier bespreekt men het toets-dender probleem+ oplossing ?(debounche)
http://www4.tpg.com.au/users/talking/Testing_page3.html
[Bericht gewijzigd door elektron_ op ]
Ik heb PIC software debounce functies als je wil, ons project is namelijk zo goed als afgerond en de debouncing werkt perfect (en is maar enkele lijnen).
Lamborghini
Wie is een ander om te bepalen wat jij wilt doen?