Hoi, ik heb vorige week een paar PIC 16f628A's besteld bij elektronica-onderdelen.nl.
nu heb ik de PIC microcontroller tutorial gelezen bij artikelen. Ik heb voor mezelf een klein programmaatje geschreven.

De bedoeling hiervan is om een tiptoetsje op poort a bit 0 aan te sluiten, en een 7-segment op poort b. er komt wel een BCD to 7 segment decoder voor (CMOS4511). (het moet wel makkelijker kunnen zonder extra ic's, maar dat even terzijde, het is maar een test projectje.) nu wil ik op de 7-segment het aantal keer dat ik op de tiptoets heb gedrukt zien. als hij op 9 staat en ik druk moet hij weer 0 worden. nu heb ik het volgende programmaatje geschreven.


;;;;;;;;;;;;;;;;;;;;;;;;;;
; 			 ;
;     SIMPELE COUNTER	 ;
;     Erik Kramer	 ;
;			 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;

; registers makkelijkere namen geven ;


counter		EQU	06h
poorta		EQU	05h
tien		EQU	41h

; beginnen ;

		ORG	00h

; poorten instellen: A[0] input A[rest] output ;

		BSF	03h,5		; bank 1
		CLRF	85h		; poort a uitgangen maken
		BSF	85h,0		; poort a bit 0 ingang maken
		CLRF	86h		; poort b uitgangen maken
		BCF	03h,5

; maak register 'tien' waarde 10 ;

		MOVLW	0Ah		; zet 0Ah in W
		MOVWF	tien		; zet W in register'tien'

; we gaan kijken of poorta[0] hoog of laag is ;

begin		BTFSC	poorta,0	;check of bit0 van poort a, skip if 0
		GOTO	pluseen
		GOTO	begin

; als poorta[0] hoog is wordt er een bij de counter opgetelt ;

pluseen		INCF	counter,1	;counter plus een, opslaan in counter

; als de counter 10 is, wordt hij weer teruggezet naar 0 ;

		MOVF	counter,0		;zet counter in W
		SUBWF	tien,0		;trek W van 10 af
		BTFSC	03h,2		;als status bit2 0 is, goto maaknul
		GOTO	maaknul
		GOTO	begin
maaknul		MOVLW	00h		;zet 00h in W
		MOVWF	counter		;zet W in counter
		GOTO begin

		END

Zou dit programmaatje zo werken?

edit: code aangepast

[Bericht gewijzigd door erik_321 op ]

maaknul MOFLW 00h
MOFWF counter

die 2 commando's kent hij niet

zijn movlw en movwf

een MOF is heel iets anders! :o
maar het zou voor de rest wel werken?

meek poort b ook ff uitgang.

Werk je met een interne oscillator of met een kristal ana de buiten kant?
Dat soort dingen moet je ook nog ff verder aangeven.

Voor de rest lijkt het behoorlijk te kloppen

Movf counter....waar naartoe?
Movf counter,w
Nog een tip: schrijf achter elke regel commentaar zodat je later makkelijker kunt zien hoe het in elkaar zit.
(Ook makkelijk voor anderen die het lezen trouwens ;)

[Bericht gewijzigd door Zonnepaneeltje op ]

het moet dus MOFV counter,0 worden, want hij moet in W worden opgeslagen.

maar ik zit me nu het volgende te bedenken.

dit hele programma herhaalt zich om de zoveel ms. stel het hele programma duurt 20ms voordat hij weer opniew begint. als ik het tiptoetsje nou 60ms vasthoud, gaat er dan niet 3 bij de counter bij op? de pic zou dus eigenlijk op pauze moeten staan als het knopje wordt ingedrukt.

laat hem gewoon wachten tot je loslaat



begin		BTFSC	poorta,0
		GOTO	pluseen
		GOTO	begin

; als poorta[0] hoog is wordt er een bij de counter opgetelt ;

pluseen		BTFSC   poorta,0
		GOTO    pluseen
		INCF	counter,1

Ja, daarvoor heb je een stukje 'contactdender'-routine nodig. Staat wel op de site van microchip geloof ik.
Je kunt het natuurlijk ook zelf bedenken....

EDIT: te laat!

desnoods zet je een vertraging er in van bijv 50ms voordat hij kijkt of hij losgelaten is


start		BTFSC	poorta,0	
		GOTO	optellen
		GOTO	start
optellen	{hele optel code + counter reset als 10} 

loslaten	BTFSS	poorta,0
		GOTO	start
		GOTO	loslaten

Zo moet het toch lukken??:)

dan nog kan hij denderen... beter na de detectie van het loslaten nog 50ms wachten


delaycount	EQU	42h
		MOVLW	32h
		MOVWF	delaycount

start		BTFSC	poorta,0	
		GOTO	optellen
		GOTO	start
optellen	{hele optel code + counter reset als 10} 

loslaten	BTFSS	poorta,0
		GOTO	pauze
		GOTO	loslaten

pauze		CALL	delay
		GOTO	start
delay

delayloop	DECFSZ	delaycount,1
		GOTO	delayloop
		GOTO	start
		return

		END

mag het zo wel?

als je die delay wat groter maakt wel jah.

dit duurt te kort

Oke, bededankt voor de antwoorden. ik denk dat ik het nu wel begrijp. morgen komt (waarschijnlijk) mijn bestelling binnen :)

32h is toch 50 decimaal?
50keer herhalen, dus 50ms

Nee,

bij 4 mhz oscillator is het geloof ik 1 µs per cyclus.
ZIt dacht ik een 4 deler in.

sommige opdrachten hebben meer dan 1 cyclus nodig.

En je hebt voor die berekening ook meer dan 1 opdracht nodig.


delayloop	DECFSZ	delaycount,1
		GOTO	delayloop

zijn steeds 2 opdrachten

de goto opdracht heeft standaard 2 cyclussen nodig.
de decfsz heeft er standaard 1 nodig maar bij 0 2

dus 32h is 50 herhalingen is iets tussen de 100µs en 150µs

klopt ook ja, ik heb even een foutje gemaakt met milli en micro. 4MHZ gedeeld door 4 = 1 MHZ = 1.000.000 opdrachten per seconde
delaycount=0 is maar 1 keer, dus we nemen gewoon 3 cyclussen. 50ms=50.000µs. 50.000 gedeeld door 3 = ongeveer 16666.
166*100 = 16600

dus 2 loops maken, de eerste loop telt van 166 terug naar 0, er gaat een van de tweede loop af, en weer telt de eerste van 166 terug naar 0. net zo lang tot de 2e loop ook tot nul is..

ik begrijpt het.. :)

zo heb ik het nu, morgen testen of het ook echt werkt..


delay		MOVLW	0x0A6		; delaycount2 wordt 166d
		MOVWF	delaycount2

delayloopstart	MOVLW	0x064		;delaycount1 wordt 100d
		MOVWF	delaycount1
delayloop1	DECFSZ	delaycount1,1	; maak delaycount1 minder, sla een over als delaycount 0 is.
		GOTO	delayloop1	; ga terug naar delayloop1
		DECFSZ	delaycount2,1	; loop 2
		GOTO	delayloopstart
		GOTO	begin		; terug naar het begin

[Bericht gewijzigd door erik_321 op ]