Autor Tema: ayuda!! push boton pic18f4550  (Leído 2343 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
ayuda!! push boton pic18f4550
« en: 25 de Septiembre de 2014, 01:54:38 »
Hola amigos me dirijo a ustedes para pedir ayuda, empiezo a programar con pic18f4550 con ensamblador y me surge la duda de como hacer que a la segunda vez que presione un push boton se muestre algo diferente al primer push! por ejemplo tengo 3 leds en un puerto y un push boton cuando presione por primera vez el push se encienda un led y se quede asi, al volver a presionar el push se enciendan 2 leds y en el tercero se prendan los 3 leds ??,  tendran algun ejemplo de como hacer esto?? tengo idea de que se tiene que usar un contador para que vaya contando las veces que presiono el push pero no logro hacerlo funcionar!!

una disculpa si esta duda no va en esta parte del foro y gracias!! 

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: ayuda!! push boton pic18f4550
« Respuesta #1 en: 25 de Septiembre de 2014, 18:11:48 »
Supongo que tu programa consiste de un bucle principal y luego dentro con alguna subrutina ves el estado del pulsador,

tienes que usar como bien dices un contador y luego en alguna parte de tu programa segun que valor tenga el contador hace una u otra cosa, en este caso prender 1 led, o 2 o 3.

Seguramente lo que te pasa es que la subrutina del pulsador puede estar mal, es decir, tienes que sensar el evento de pulsar y liberar.
Si no lo haces asi, lo que hace el programa cuando pulsas es incrementar el contador y como eso es muy rápido tu vista no alcanza a notar los cambios en los led.

No tengo un ejemplo a mano, hace tiempo me libre del asm  :D
Pon tu código y vemos en que ayudarte.
slds.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
Re: ayuda!! push boton pic18f4550
« Respuesta #2 en: 26 de Septiembre de 2014, 01:38:01 »
adjunto mi codigo segun yo ya casi terminado ahora el problema es que al simularlo en proteus corre muy bien pero al pasarlo al micro no hace nada que puede pasar?? y como mencionas como podria acoplarle en ves de un push un sensor de herradura?? ya que aqui tengo duda por que me han comentado que el sensor de herradura al prender o apagar aria una oscilacion y mi micro detectaria muchos 0 y 1 


include <P18F4550.INC>
config  FOSC=XTPLL_XT
config  PLLDIV=1
config  CPUDIV=OSC1_PLL2
config  PWRT=ON
config  BOR=OFF
config  WDT=OFF
config  MCLRE=ON
config  LVP=OFF
config  CP0=OFF
config  CP1=OFF
config  CP2=OFF
config  CP3=OFF
cblock 00H
contador
PDel0
PDel1
PDel2
var
val0
val1
val2
val3
val4
val5
val6
val7
val8
val9
val01
val02
val03
val04
val05
val06
val07
val08
val09
endc

org 00H
goto inicio

PDelay  movlw     .91       ; 1 set number of repetitions (C)
        movwf     PDel0     ; 1 |
PLoop0  movlw     .95       ; 1 set number of repetitions (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .138      ; 1 set number of repetitions (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 cycle delay
        decfsz    PDel2, 1  ; 1 + (1) is the time over? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) is the time over? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) is the time over? (C)
        goto      PLoop0    ; 2 no, loop
        clrwdt              ; 1 cycle delay
        return              ; 2+2 Done


inicio
movlw b'00001111'
movwf ADCON1
movwf TRISD
movlw 01h
clrf TRISB ;ESTABLECE PUERTO B CMO SALIDA
clrf PORTB ;LIMPIAS PUERTO B
clrf contador

;------------------constates de cambio------
movlw b'11010'  ;valor maximo que llega antes de cambiar
movwf val01

movlw b'101010' 
movwf val02

movlw b'111010' 
movwf val03

movlw b'1001010' 
movwf val04

movlw b'1011010' 
movwf val05

movlw b'1101010' 
movwf val06

movlw b'1111010' 
movwf val07

movlw b'10001010' 
movwf val08

movlw b'10011010' 
movwf val09
;---------------constantes nible alto----------
movlw .10
movwf val0

movlw b'00010000'   ; ultimo a mostrar 10
movwf val1

movlw b'00100000'   ; ultimo a mostrar 20
movwf val2

movlw b'00110000'   ; ultimo a mostrar 30
movwf val3

movlw b'01000000'   ; ultimo a mostrar 40
movwf val4

movlw b'01010000'   ; ultimo a mostrar 50
movwf val5

movlw b'01100000'   ; ultimo a mostrar 60
movwf val6

movlw b'01110000'   ; ultimo a mostrar 70
movwf val7

movlw b'10000000'   ; ultimo a mostrar 80
movwf val8

movlw b'10010000'   ; ultimo a mostrar 90
movwf val9
;---------------------------------------------------
;-----------------EMPIEZA EL CODIGO-----------------
;----------------------------------------------------
tu btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto tu ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf contador ;incrementa contador en 1 
movf contador,w ;mueve el valor de contador a w
cpfseq val0
goto te
goto segundo
te movwf PORTB
goto tu
;------------------------------->
segundo
clrf PORTB
clrf contador
CLRF PORTB
movf val1,w
clrf PORTB
movwf PORTB
goto tercero
;----------------------------------------------------
;----------------------------------------------------
tercero
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto tercero ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val1 ;incrementa contador en 1 
movf val1,w ;mueve el valor de contador a w
cpfseq val01
goto tee
goto cuarto
tee movwf PORTB
goto tercero

;--------------------------------------->
cuarto
clrf PORTB
clrf val1
CLRF PORTB
movf val2,w
clrf PORTB
movwf PORTB
goto quinto
;-----------------------------------
;-----------------------------------
quinto
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto quinto ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val2 ;incrementa contador en 1 
movf val2,w ;mueve el valor de contador a w
cpfseq val02
goto teee
goto seis
teee movwf PORTB
goto quinto
;--------------------------------->
seis
clrf PORTB
clrf val2
CLRF PORTB
movf val3,w
clrf PORTB
movwf PORTB
goto siete
;---------------------------------
;---------------------------------
siete
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto siete ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val3 ;incrementa contador en 1 
movf val3,w ;mueve el valor de contador a w
cpfseq val03
goto teeei
goto ocho
teeei movwf PORTB
goto siete
;---------------------------------
ocho
clrf PORTB
clrf val3
CLRF PORTB
movf val4,w
clrf PORTB
movwf PORTB
goto nueve
;---------------------------------
;---------------------------------
nueve
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto nueve ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val4 ;incrementa contador en 1 
movf val4,w ;mueve el valor de contador a w
cpfseq val04
goto teeeii
goto diez
teeeii movwf PORTB
goto nueve
;---------------------------------
diez
clrf PORTB
clrf val4
CLRF PORTB
movf val5,w
clrf PORTB
movwf PORTB
goto once
;---------------------------------
;---------------------------------
once
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto once ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val5 ;incrementa contador en 1 
movf val5,w ;mueve el valor de contador a w
cpfseq val05
goto tii
goto doce
tii movwf PORTB
goto once
;---------------------------------
doce
clrf PORTB
clrf val5
CLRF PORTB
movf val6,w
clrf PORTB
movwf PORTB
goto trece
;---------------------------------
;---------------------------------
trece
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto trece ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val6 ;incrementa contador en 1 
movf val6,w ;mueve el valor de contador a w
cpfseq val06
goto tiii
goto catorce
tiii movwf PORTB
goto trece
;--------------------------------->
catorce
clrf PORTB
clrf val6
CLRF PORTB
movf val7,w
clrf PORTB
movwf PORTB
goto quince
;----------------------------------""verificar apartir de aqui
;----------------------------------
quince
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto quince ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val7 ;incrementa contador en 1 
movf val7,w ;mueve el valor de contador a w
cpfseq val07
goto top
goto diesiseis
top movwf PORTB
goto quince
;--------------------------------->
diesiseis
clrf PORTB
clrf val7
CLRF PORTB
movf val8,w
clrf PORTB
movwf PORTB
goto diesisiete
;----------------------------------
;----------------------------------
diesisiete
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto diesisiete ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val8 ;incrementa contador en 1 
movf val8,w ;mueve el valor de contador a w
cpfseq val08
goto topp
goto diesiocho
topp movwf PORTB
goto diesisiete
;--------------------------------->
diesiocho
clrf PORTB
clrf val8
CLRF PORTB
movf val9,w
clrf PORTB
movwf PORTB
goto diesinueve
;----------------------------------
;----------------------------------
diesinueve
btfsc PORTD,0 ;pregunta si d0 es 0 volts

goto diesinueve ;sino se cumple la condicion de arriba vuelve a preguntar asta q se cumpla
rcall PDelay
incf val9 ;incrementa contador en 1 
movf val9,w ;mueve el valor de contador a w
cpfseq val09
goto toppp
goto tu
toppp movwf PORTB
;goto diesisiete

goto tu



end