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 ]
mts plus
Life is waiting!
mts plus
Life is waiting!
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.
mts plus
Life is waiting!
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!
mts plus
Life is waiting!
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??:)
Jochem
If you want to succeed, double your failure rate.
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?
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
mts plus
Life is waiting!
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 delayloopzijn 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 ]
