Hey allemaal,
Nu ben ik redelijk nieuw in het programmeren.
Ik programmeer in de assembler taal.
Nu kan ik wel delay maken, call return functies, ingangen uitlezen en nog wat dingen.
Het programma
main
BSF STATUS,RP0
CLRF TRISA
CLRF TRISB
BSF TRISB,00h
BSF TRISB,01h
BSF TRISB,02h
BCF STATUS,RP0
TEST MOVLW 0FFh
MOVWF PORTA
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
CALL Delay
MOVLW 00h
MOVWF PORTA
MOVLW 04h
MOVWF PORTA
MOVLW 05H
MOVWF PORTA
CALL Delay
MOVLW 00h
MOVWF PORTA
MOVLW 00h
MOVWF x
HEAD CALL Knoppen
NOP
CALL Uitgang
NOP
GOTO HEAD
Knoppen BTFSC PORTB,00h
GOTO Omlaag
Omhoog1 BTFSS PORTB,00h
GOTO Omhoog1
CALL Delay
INCF x,1
RETURN
Omlaag BTFSC PORTB,01h
GOTO Reset
Omlaag1 BTFSS PORTB,01h
GOTO Omlaag1
DECF x,1
CALL Delay
RETURN
Reset BTFSC PORTB,02h
RETURN
Reset1 BTFSS PORTB,02h
GOTO Reset1
CLRF x
CLRF Y
CLRF z
CALL Delay
RETURN
Uitgang MOVFW x
MOVWF PORTA
RETURN
Delay MOVLW 0FFh
MOVWF teller2
again MOVLW 0FFh
MOVWF teller
again2 DECFSZ teller,1
GOTO again2
DECFSZ teller2,1
GOTO again
RETURN
end
Het 1e wat hij niet doet is ra4 en ra5 aanzetten als ik movlw 04h (movlw 05h)en dan movwf porta doe.
Hij zet ra0 en ra2 aan ipv ra4 en ra5
Het 2e wat niet gebeurt is dat hij niet verder kan tellen dan 15.
Neem niet aan dat x dan al vol staat, ik verwacht eigenlijk dat hij tot 255 kan tellen.
Verder wil ik eigenlijk iets van als x = 10 dan x=0 en inc y,1
En van als x = 0 dan x = 0 en dec y,1
En daarna de uitgangen multiplexen...
Hoop dat jullie het een beetje snappen.
p.s. als ik clrf TRISA doe dan staat er geen 00000000 maar 00100000.
Dat kan ik zien als ik hem simuleer in mplab ide v7.60
Ohjah ik heb de search functie gebruikt, maar kom er alsnog niet uit
[Bericht gewijzigd door Henry S. op (0%)]
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Je hebt de PIC niet goed geconfigureerd.
Je moet de comperators nog uitzetten om de beschikking te krijgen over RA3 en RA4 (lees blz 33).
Je moet ook de interne oscillator gebruiken om de beschikking te krijgen over RA6 en RA7.
Bovendien bedien je met 0x04 niet RA4, maar RA2.
0x05 is RA2 en RA0.
Dat klopt dus precies.
Je werkt immers met hexadecimale getallen...
http://nl.wikipedia.org/wiki/Hexadecimaal
Dat je op de TRIS van RA5 een '1' terugleest klopt ook.
Ik stel voor dat je de datasheet even goed doorleest.
Neem er gerust een paar dagen voor.
Eerst de chip leren en dan code kloppen..
Succes!
Dank je wel voor je reactie, 00h en 01h en 02h werken wel voor rb0,rb1 en rb2 om het in te lezen.
Zit dat dan weer op een andere manier of begrijp ik het gewoon compleet verkeerd.
En kan ik in het register x maar tot 15 tellen?
Groeten,
Gijsbert
[Bericht gewijzigd door Henry S. op (61%)]
list p=16f648a ; list directive to define processor
#include <p16f648a.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _LVP_OFF
; '__CONFIG' directive is used to embed configuration data within .asm file.
; The lables following the directive are located in the respective .inc file.
; See respective data sheet for additional information on configuration word.
;***** VARIABLE DEFINITIONS
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
teller equ 40h
teller2 equ 41h
x equ 21h
y equ 22h
z equ 23h
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
Zie net dat als ik de MCLR uitzet RA5 een digitale ingang wordt, vandaar de 1 
Twee keer dezelfde ongedocumenteerde code posten is onnodig! En gebruik code-tags.
[Bericht gewijzigd door Henry S. op (55%)]
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Ja, zag dat ik de comperators moest uitzetten.
Dat gedaan en ik heb inderdaad nu ingangen op PORTA en uitgangen op PORTB.
Tevens kan ik nu tellen tot 255 in het x register.
Echt bedankt voor de tips.
Volgende stap is het verkrijgen van gemultiplexde segment uitgangen.
Ik heb de code een beetje opverhoop gegooid.
Het tellen werkt nu helemaal goed.
Nu wou ik alleen dit doen:
Uitgang MOVFW x
ANDLW 0x09
CALL GetSegments
MOVWF PORTB
RETURN
GetSegments ADDWF PCL , f
RETLW b'00111111' ;0
RETLW b'00000110' ;1
RETLW b'01011011' ;2
RETLW b'01001111' ;3
RETLW b'01100110' ;4
RETLW b'01101101' ;5
RETLW b'01111101' ;6
RETLW b'00000111' ;7
RETLW b'01111111' ;8
RETLW b'01101111' ;9
RETURN
Deze werkt niet, als ik nu ga optellen wisselt hij tussen 0 en 1.
Hij telt niet verder helaas.
Iemand een idee?
Groeten,
Gijsbert
EDIT:
MOVLW 26h SUBLW 14h
Nu krijg ik geen 12h in het werkregister...
[Bericht gewijzigd door Godtoh op (13%)]
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Je AND met 0x09.
Je wilt daarmee de teller bepertken tot 9 neem ik aan.
Maar met deze instructie scherm je alleen bit 0 en bit 3 af.
Dus ik schat dat de routine alleen de standen 0, 1 en 8 weergeeft.
Je moet de beperking van de teller tussen 0 en 9 ergens anders oplossen.
Haal de instructie maar weg, dan werkt het wel.
Helaas loopt de routine vast als je hoger dan 9 gaat.
De oplossing hiervoor is om de tabel door te laten lopen tot 15.
De beperking van de teller moet je dus anders oplossen.
Ik heb het probleem al opgelost.
Zal morgen neerzetten hoe ik het gedaan heb.
Staat op de pc op het werk dus heb ik het niet thuis.
Laatste stap voor mij is nu nog het multiplexen in een kortere tijd (in mijn geval alleen de delays verkorten).
Dan is het al af.
Ga ook nog een ingangsontdendering en een emc ontstoringen maken.
Dit doe ik door de ingang 10 keer in 30ms te checken.
Mocht de ingang dan 10 keer '0' zijn, dan pas tel ik op.
Groeten,
Gijsbert
[Bericht gewijzigd door Henry S. op (40%)]
Ok stukje van hoe ik het gedaan heb
10 keer de ingang checken.
Knoppen BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
BTFSC PORTA,00h
GOTO Omlaag
CALL Uitgang
INCF x,1
RETURN
Krijg de tabs nog steeds niet goed voor elkaar.
Iemand een idee?
Ik hoop dat iemand dit snapt:
Eenheden MOVFW x
MOVWF a
MOVLW 09h
SUBWF a,1
DECFSZ a,1
GOTO Eenheden1Tientallen CLRF x
INCF y,1
MOVFW y
MOVWF c
MOVLW 09h
SUBWF c,1
DECFSZ c,1
RETURNHonderdtallen CLRF y
INCF z,1
MOVFW z
MOVWF e
MOVLW 09h
SUBWF e,1
DECFSZ e,1
RETURN
CLRF x
CLRF y
CLRF z
RETURNEenheden1 MOVFW x
MOVWF a
MOVLW b'11111110'
SUBWF a,1
DECFSZ a,1
RETURNTientallen1 CLRF x
MOVLW 09h
MOVWF x
DECF y,1
MOVFW y
MOVWF c
MOVLW b'11111110'
SUBWF c,1
DECFSZ c,1
RETURNHonderdtallen1 CLRF y
MOVLW 09h
MOVWF y
DECF z,1
MOVFW z
MOVWF e
MOVLW b'11111110'
SUBWF e,1
DECFSZ e,1
RETURN
CLRF z
CLRF x
CLRF y
RETURN
Dit is in feite mijn optel en aftrek routine.
Voor het geval ik van 9-->10 ga en van 0-->9
Wil ook wel de totale code posten, alleen dan graag hulp vanwege de tabs.
Staat zo mooi in mplab alleen hier niet 
Groeten,
Gijsbert