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%)]

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

Twee keer dezelfde ongedocumenteerde code posten is onnodig! En gebruik code-tags.

[Bericht gewijzigd door Henry S. op (55%)]

Heb je de datasheet al gelezen?

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%)]

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 Eenheden1

Tientallen CLRF x
INCF y,1
MOVFW y
MOVWF c
MOVLW 09h
SUBWF c,1
DECFSZ c,1
RETURN

Honderdtallen CLRF y
INCF z,1
MOVFW z
MOVWF e
MOVLW 09h
SUBWF e,1
DECFSZ e,1
RETURN
CLRF x
CLRF y
CLRF z
RETURN

Eenheden1 MOVFW x
MOVWF a
MOVLW b'11111110'
SUBWF a,1
DECFSZ a,1
RETURN

Tientallen1 CLRF x
MOVLW 09h
MOVWF x
DECF y,1
MOVFW y
MOVWF c
MOVLW b'11111110'
SUBWF c,1
DECFSZ c,1
RETURN

Honderdtallen1 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