PIC16F84A maticova klavesnice

Mam problem chtel jsem pomoci maticove klavesnice ovladat vystupy. Nejspis bude problem v RA4 kde je otevrenej kolektor pripojil jsem na nej odpor 10k k napeti. A da se rict ze to funguje. Jen kdyz mam tento program

	LIST P=16F684A, R=DEC
	INCLUDE<P16F84A.INC>

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

		org 	0

		BSF     STATUS,RP0
		movlw 	b'00101111'	; portb(0) vstup 
		movwf 	TRISB 		
		movlw	b'00000000'
		movwf 	TRISA 		; porta jako výstupy 
		BCF     STATUS,RP0
	
		CLRF	PORTA
		CLRF    PORTB

		movlw 	b'11010000'
		movwf	PORTB

keyboard 
	
	 BTFSC    PORTB,5            ; tlačítko 1
         BSF	  PORTA,3 
         BTFSC    PORTB,1            ; tlačitko 6
         BCF	  PORTA,3 
         BTFSC    PORTB,2            ; tlacitko F
         CALL	  zapni
         BTFSC    PORTB,3            ; tlačítko S
         CLRF	  PORTA
	
        GOTO     keyboard

zapni	MOVLW    b'11111111'
	MOVWF    PORTA
	RETURN 
	END

tak pri stiknuti treba vypnuti nebo zapnuti na portu RA3, tak se mi treba vypina nebo zapina i port RA4 v programu to snad neni kdyz s portem RA4 nic nedelam. Poradte prosim jak to je s tim otevrenym kolektorem. Diky
img.jpg

Myslím, že otevřený kolektor máš ošetřen správně. Řekl bych, že jde o běžný tzv. read-write problém. Při použití bitově orientovaných instrukcí na portech, třeba BSF PORTA,3 se nejprve přečte celý port, provede se bitová operace a pak se celý port zase zapíše zpět. Jenže se nečte registr PORTA nebo PORTB, nýbrž stav výstupních pinů. Pokud tedy provedeš rychle po sobě bitovou operaci na portu, může dojít k tomu, že stav portu po první operaci se ještě nestačí ustálit dík parazitním kapacitám obvodu. Pak se jednotlivé bity portu chovají zdánlivě nevyzpytatelně. Řešení jsou v podstatě dvě. Vložením nějaké prodlevy mezi bitové operace na portech nebo prováděním bitové operace na pomocném registru a ten pak celý vkládat na port. Ovšem v tvém programu s RA4 manipuluješ:

CLRF PORTA ........... zapni MOVLW b'11111111' MOVWF PORTA RETURN

Ten program funguje tak, jak si ho napsal, není to žádným otevřeným kolektorem. Takže uvádím instrukce, které to způsobují.


keyboard 
        ...
        ...
        BTFSC    PORTB,3            ; tlačítko S
         CLRF	  PORTA              ;CHYBA - manipuluje se vsemi bity
	
        GOTO     keyboard

zapni	MOVLW    b'11111111'
	MOVWF    PORTA  ;CHYBA - manipuluje se vsemi bity
	RETURN 
	END

nene to tam je schvalne ze by to zaplo vsechny nebo vyplo vsechny…

	LIST P=16F684A, R=DEC
	INCLUDE<P16F84A.INC>

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC

;- Proměnné ----------------------------------------------------
c1      EQU     h'12'              ;proměnné pro cykly
c2      EQU     h'13'
PA		equ		h'14'
PB		EQU		h'15'
	
		org 	0

		BSF     STATUS,RP0
		movlw 	b'00101111'	; portb(0) vstup 
		movwf 	TRISB 		
		clrf 	TRISA 		; porta jako výstupy 
		BCF     STATUS,RP0
	
		CLRF	PORTA
		CLRF    PORTB
		CLRF	PA

keyboard 
				
        BSF     PORTB,7            ; testovani 1 a posledniho sloupce   
	BTFSC   PORTB,5            ; tlačítko 1
        BSF	  PORTA,3 
        BTFSC   PORTB,1            ; tlačitko 6
        BCF	  PORTA,3 
        BTFSC   PORTB,2            ; tlacitko F
        CALL	zapni
        BTFSC   PORTB,3            ; tlačítko S
        CALL	vypni
	BCF	PORTB,7

CALL cekej
		
        BSF      PORTB,6           ; testovani 2 a 4 sloupecek  
	BTFSC    PORTB,5           ; tlačítko 2
        BSF	 PA,4
        BTFSC    PORTB,1           ; tlačitko 7
        BCF	 PA,4 
        BTFSC    PORTB,2           ; tlacitko 4
        BSF	 PORTA,1
        BTFSC    PORTB,3           ; tlačítko 9
        BCF	 PORTA,1
        BCF      PORTB,6 	
	
CALL cekej
	
    	BSF      PORTB,4            ; testovani 3 a 5 sloupecek  
	BTFSC    PORTB,5            ; tlačítko 3
        BSF	 PORTA,2
        BTFSC    PORTB,1            ; tlačitko 8
        BCF	 PORTA,2
        BTFSC    PORTB,2            ; tlacitko 5
        BSF	 PORTA,0
        BTFSC    PORTB,3            ; tlačítko 0
        BCF	 PORTA,0
        BCF      PORTB,4
	
CALL cekej

		BTFSC PA,4
		GOTO hihi
		BCF PORTA,4
		GOTO hoho

hihi 	BSF	PORTA,4
hoho 	GOTO    keyboard


;- podprogramy -------------------------------------------------
zapni	MOVLW   b'11111111'
		MOVWF   PORTA
		BSF		PA,4
		RETURN
 
vypni	BCF PA,4
		CLRF PORTA
		RETURN
 	
cekej    MOVLW    50                 
         MOVWF    c2                
wait2    MOVLW    100
         MOVWF    c1
wait1    DECFSZ   c1,1
         GOTO     wait1
         DECFSZ   c2,1
         GOTO     wait2
         RETURN                  
	END

Tak jsem to sesmolil takhle… neni to dokonaly ale uz to trochu funguje, pouzil jsem tam jeste registr, ale jakmile zapnu RA4 a macknu na jine tlacitko na zapnuti jineho vystupu tak mi ledka na RA4 blika (podle toho jak mam nastaveny to zpozdeni) a kdyz macknu 1 (PORTB,5) tak blika ledka strasne rychle ze sotva svítí. Pri ostatnich sviti hodne a blika pri tlacitku 1 nesviti skoro vubec. Nenapada vas neco? [/code]