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.

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.

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.

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 :))

mag ik even een offtopic vraagje stellen? Wat is in vredesnaam het verschil tussen CALL en GOTO??

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 ]

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 ]

Je kunt ook een AVR nemen een stuk eenvoudiger te programmeren, en sneller :)

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.

Ik zie dat de gebruiker nooit zijn code kan veranderen.
Dat is jammer.

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!

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

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

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).

Hint: laatste post was op 14 november 2002