[Ayuda] Acumulador de pulsos con 16f84

Buenas amigos.

Estoy liado con un pequeño proyecto para utilizar en una "Maquina Recreativa Arcade".

Pretendo crear un acumulador de creditos (Partidas). Estos creditos llegan en forma de pulsos de un monedero electronico. Pretendo almacenarlos y mostrar el numero de creditos acumulados en un display 7 segmentos.
Ademas de acumularlos. Por medio de un pulsador se han de "gastar", enviando pulsos positivos a la maquina.

Mi nivel de programacion es bajo. Estoy empezando ahora en el lenguaje Ensamblador, me he leido varios libros sobre el 16f84 y he hecho bastantes ejercicios.

Bueno hasta ahora lo que he "medio conseguido" es un programa que mediante la entrada RB0 suma creditos a un registro llamado CREDITOS y mediante la entrada RB1 resto creditos. Ademas de mostrar el numumero de creditos en un Display de 7Seg.

Bueno la cuestion es que al simularlo en MPSim, el programa funciona, pero segun en el momento en que pulses la entrada (tengo puesto el tiempo de pulsacion 1 ciclo)

En cambio cuando lo simulo en PROTEUS, no funciona correctamente. Al pulsar RB0 en vez de sumar un credito (un pulso), suma muchisimos y el display se vuelve loco y al restar igual.

Bueno añado la carpeta del proyecto creado con MPLAB y el archivo acumulador.DSN del PROTEUS.

Haber si podeis hecharme un cable.

Saludos!!
 

Adjuntos

  • Acumulador.zip
    26.6 KB · Visitas: 28
Debes crear por soft un retardo para los pulsos, bueno este retardo discrimina los pulsos cortos (rebotes del contacto o ruido) y digamos algo asi como que un pulso valido debe tener como minimo 150mSeg de duracion, el pic detecta si el pulso cumple esa caracteristica e incrementa el contador si no la cumple simplemente no hace nada, igual para el pin que decrementa el contador, de esa forma evitas esos inconvenientes, chauuuuuuuu
 
Hola. Gracias por tu respuesta.

Ya he puesto un retardo de 143ms si no he hecho algo mal... La cosa es que sigue sin funcionar.

Tambien tiene otro problema y es que en cuanto acumulo mas de 9 creditos, se satura la PILA y se resetea el micro. Ya que la rutina de disp7seg solo muestra hasta el 9.

Aqui teneis el codigo, haber si me podeis ayudar.

Gracias.

Código:
;Acumulador de Credios para Recreativa
  LIST P=16f84
  RADIX HEX
;---------------ETIQUETAS--------------
 
  TMR0  EQU 0x01
  PC   EQU 0x02
  ESTADO  EQU 0x03
  PORTA  EQU 0x05
  PORTB  EQU 0x06
  CREDITOS EQU 0x0c
  REG1  EQU 0x0d
  REG2  EQU 0x0e
 
;-----------INICIO---------------------- 
 
   ORG   0    
   movlw  b'00111111'
   movwf  PORTB
   clrf  CREDITOS
   goto  inicio
 
;-----------CONFIGURANDO LOS REGISTROS--------
 
inicio  ORG   5
   bsf   ESTADO,5
   movlw  b'01000110'
   movwf  TMR0
   movlw  b'00001111'
   movwf  PORTA
   clrf  PORTB
   bcf   ESTADO,5
 
;-------EXPLORANDO ENTRADAS-------------------
   clrf  PORTA
explora  movfw  CREDITOS   ;Creditos > W
   movwf  REG1    ;W > REG1
   btfsc  PORTA,0    ;Exploro RB0 (+Creditos) 
   incf  CREDITOS,1   ;Incremento 1   
   clrf  TMR0
   call  retardo
   btfsc  PORTA,1    ;Exploro RB1 (-Creditos)
   decf  CREDITOS,1   ;Decremento 1
   clrf  TMR0
   call  retardo
   movfw  CREDITOS   ;CREDITOS > W
   subwf  REG1,0    ;Resto W a REG1
   btfsc  ESTADO,2   ;Si la resta es cero  
   goto  explora    ; vuelvo a explorar
   call  disp7seg   ; si no, llamo a disp7seg 
   movwf  PORTB    ; y muestro el numero de creditos
   goto  explora    ;vuelovo a explorar entradas
 
;------RUTINA DEL DISPLAY--------
disp7seg movfw CREDITOS
   addwf PC,1
   retlw b'00111111'
   retlw b'00000110'
   retlw b'01011011'
   retlw b'01001111'
   retlw b'01100110'
   retlw b'01101101'
   retlw b'01111101'
   retlw b'00000111'
   retlw b'01111111'
   retlw b'01100111'  
;-------RUTINA DE RETARDO--------
retardo  btfss TMR0,5
   goto retardo
   incf REG2
   btfss REG2,7
   goto retardo
   return
 
 
 
  end
 
LAs rutinas de retardo debes usarla en el momento de la deteccion del pulso, asi:

* detectas el pulso
* esperas digamos 10mS
* nuevamente detectas el pulso, si no esta el pulso entonces fue corto y sales de la rutina de deteccion, si esta continuas
* esperas 10mS
* nuevamente detectas el pulso, si no esta el pulso entonces fue corto y sales de la rutina de deteccion, si esta continuas y*15 asi hasta completas las 15 veces y al final seran 10*15=150mS
Obviamente no lo hagas asi literalmente, usa un REG y decrementalo para no alargar el codigo.

El error esta aca, es que detectas y ya incrementas, y desde un pulso hasta ruido lo tomas como valido

movwf REG1 ;W > REG1 btfsc PORTA,0 ;Exploro RB0 (+Creditos) incf CREDITOS,1 ;Incremento 1
 
ahhhhhhm. pues la verdad es que ahora que lo dices. es logico. muchas gracias.
Esta tarde me pondre, haber si se soluciona.
Por cierto, me podeis dar ideas para el tema del visionado del num de creditos en el disp. Principalmente para el fallo que tengo, que cuando hay mas de 9 creditos se satura la pila y se reinicia el PIC.
Lo que quiero es que cuando haya mas de 9 creditos, muestre 9 en el display, pero no se me ocurre como hacerlo.

Saludos!!
 
ahhhhhhm. pues la verdad es que ahora que lo dices. es logico. muchas gracias.
Esta tarde me pondre, haber si se soluciona.
Por cierto, me podeis dar ideas para el tema del visionado del num de creditos en el disp. Principalmente para el fallo que tengo, que cuando hay mas de 9 creditos se satura la pila y se reinicia el PIC.
Lo que quiero es que cuando haya mas de 9 creditos, muestre 9 en el display, pero no se me ocurre como hacerlo.

Saludos!!

Bueno no creo que se sature la pila no entiendo porque??? no usas la pila demasiado (recuerda que se puede anidar 9 llamadas a subrutinas y ahi es cuando se usa la pila, lo que pasa es que si el numero cargado en CREDITOS es mayor de 10 al llamar la tabla lo envias a una pocision incierta pero es un problema del PC (contador de programa) un forma es asegurando que el REG CREDITOS no tiene un numero mayor de 10, por que tu tabla de 7 segmentos solo tiene 10 salidas para retorno, comentanos, chauuuuuuuu
 
Hola de nuevo fdsergio.
Cierto ese es el problema. Lo que pasa es que soy un novato en el tema y no me explique bien.

La solucion que comentas es buena. El problema es que quiero acumular mas de 9 creditos.
Podria utilizar otro registro auxiliar el cual se utilizara solo para mostrar en el display. Y solo almacenara hasta nueve. Y que el registro "principal" Creditos que es el que se encargará de acumular y usar los creditos en la recreativa pueda almacenar un numero "ilimitado" de creditos.

Enfin voy a proseguir con el proyecto ahora que tengo tiempo, haber que soluciono y que nuevos problemas aparecen.

Muchisimas gracias por tu ayuda Sergio. Y estate atento porque seguro que precisare de tu ayuda.

Saludos y gracias de nuevo!!
 
Bueno pero en el REG podes guarda hasta el valor 255 necesitas mas???, ya ese valor lo mandas a la tabla y ella te recupera el numero, lo de mostrar el numero es otra cosa, te recomiendo esto: anota todos los requerimientos del sistema, entradas, salidas, funcionamiento, subilo aca y te ayudamos a que lo hagas, chauuuuuuuuu
 
EDITADO.

Solucionado el tema del retardo. Era una tonteria. No ponia el TMR0 a cero cuando salia de la rutina de retardo y solo contaba los 16ms la primera vez que entraba a la rutina...

Que lio.

Bueno ya he conseguido hacer un contador ascendente/descendente con dos pulsadores.

El problema es cuando al pulsar conseguimos una cantidad inferior a -1 o superior a 9.

Asi que ahora lo que pretendo es:
-Que si hay 0 CREDITOS. Al pulsar el pulsador de "gastar creditos" no decremente el registro
-Si se pulsa y la cantidad de creditos es mas de 9, siga sumando creditos, el programa no se sature y muestre en el display 9. (limite de Creditos con 99 seria suficiente)


PD: El Proyecto que pretendo es el siguiente:

Un acumulador de creditos para una maquina recreativa. Recibira pulsos de un monedero electronico y los acumulara. Mediante un pulsador gastaran/enviaran los Creditos/pulsos a la recreativa tras haber elegido un juego. (Esta ultima restriccion ahora mismo lo veo un poco dificil. Lo dejaremos para mas adelante)

Relacion de entradas/salidas
RA0 (Entrada) - Pulsos de un monedero electronico (+ 1 Credito)
RA1 (Entrada) - Pulsador de gastar Creditos (- 1 Credito)
RA2 (Entrada) - Sin usar (Por ahora...)
RA3 (Entrada) - Sin usar (Por ahora...)
RA4 (Salida) - Salida de Creditos en forma de pulsos hacia la Recreativa

PORTB (Salidas) - Display 7 Segmentos (en un futuro pretendo poner 2 display. Pero aun es pronto. Ahora ayudadme para usar uno)

Sobre el circuito electronico. Creo que no necesito ayuda. CUando llegue el momento si las tengo ya preguntare.

Y creo que no necesitais saber nada mas para poder ayudarme. Si necesitais algo mas. Pidelo.

PD2: Nose porque pido ayuda en plurar si solo me estas ayudando tu Sergio... jeje.
Ya entrara mas gente cuando pueda.


Saludos!!! y Muchisimas Gracias de nuevo!!
 
Última edición:
Bueno lo de los conteos para que no se pasen de de 0 a -1 se hace asi: antes de decrementar el registro probas si es igual a cero el contenido del mismo si es igual NO DECREMENTAs, si es diferente de 0 si lo haces, esto se hace de la misma manera para cualquier numero simplementes cargas el numero a confrontar y lo restas con el valor del registro, si la resta da cero son iguales y probas la bandera de ZERO asi lo hago yo, por lo del display podias usar las salidas del PORTB (8) y sacar el valor del contador en 2 juegos de BCD (binario codificado en decimal) y mandarlos a 2 SN7447 y mostrar los 2 digitos, seria mas sencilo, chauuuuuuu
 
Hola Sergio.

Haber lo de restar lo habia pensado, pero creí que si restaba 0 - 0 , la bandera Z no se iva a activar. Pensaba comprabarlo. Pero segun entiendo lo que me dices, me estas afirmando que si que saltara la bandera Z al restar 0-0. Verdad?

Sobre lo de los display, tambien habia pensado lo de usar dos BCD-7Seg pero lo vi mas complicado. Porque creo que habria que crear una rutina como la que tengo :
Código:
;------RUTINA DEL DISPLAY--------
disp7seg movfw CREDITOS
         addwf PC,1
         retlw b'00111111'
         retlw b'00000110'
         retlw b'01011011'
         retlw b'01001111'
         retlw b'01100110'
         retlw b'01101101'
         retlw b'01111101'
         retlw b'00000111'
         retlw b'01111111'
         retlw b'01100111'
Pero con 100 retlw... No?

O hay una forma mas corta e inteligente.La verdad es que no tengo ni idea...

Saludos compañero!!

PD: Aclarar que es el primer programa que creo. (No se programar ni he programado en mi vida en ningun lenguaje). Solo he practicado un poco (Por que me gusta) el .ASM en los PICs.
Y aclarar tambien que soy Ingeniero Electrico, y que mi interes y agrado por la electronica me ha hecho aprender muchas cositas, pero la verdad es que mi nivel de electronica es bastante flojo. Pero me encanta.
Aclaro todo esto por si en algun momento me explico mal, o parezco un poco inutil. Jeje
 
Última edición:
Hola, lo de la bandero de zero se pone a 1 cunado el resultado de uan operacion es 0, un ejemplo clasico es si moves un reg a el mismo, si el reg esta en 0 se activa la bandera de zero, es asi
Lo otro no te compliques tanto pues si bien tu tabla puede tener 100 retlw (hasta 255 es posible o mas manejando la paginacion) , chauuuuuuuuuu
 
Si, la funcion de la bandera zero la conocia. Lo que pensaba es que al restar 0 - 0 no iva a funcionar.
Ya he comrpobado que esta equivocado y ya he solucionado eso.

Ahora sobre lo del display. Segun entiendo lo que me dices. Es que lo haga asi... con 100 retlw.
Va ha ser un poco pesado hacer cien retlw... no?

Pero vamos. Asi lo haré.

Muchas Gracias de nuevo Sergio. Me estas ayudando muchisimo. En cuanto tenga otra duda ya te avisare.

Saludos!!
 
Noooo para nada yo lo hecho con hasta 200 y no molesta, logicamente leete lo referente a paginacion de la memoria de programa, eso te ayudara a entender mejor como se manejan y los cuidados al usar las tablas, chauuuuu
 
Sergio ya he terminado el programa y ha quedado todo segun tenia previsto. Para ser mi primer programa esta perfecto. Ya se que no es gran cosa...jeje. Pero para mi es un logro.

Ahora solo me falta conseguir los conversores BCD-7seg, diseñar el PCB y montarlo.

En cuanto tenga tiempo lo haré. Ya subire unas fotitos de como quedo y un video de su funcionamiento colocado en la Recreativa.

Creí que nunca terminaria el programa pero gracias a ti, Sergio, lo he acabado en una semana y con todas mis espectativas cumplidas.

Muchisimas Gracias.

Saludos!!!!
 
Sergio ya he terminado el programa y ha quedado todo segun tenia previsto. Para ser mi primer programa esta perfecto. Ya se que no es gran cosa...jeje. Pero para mi es un logro.

Ahora solo me falta conseguir los conversores BCD-7seg, diseñar el PCB y montarlo.

En cuanto tenga tiempo lo haré. Ya subire unas fotitos de como quedo y un video de su funcionamiento colocado en la Recreativa.

Creí que nunca terminaria el programa pero gracias a ti, Sergio, lo he acabado en una semana y con todas mis espectativas cumplidas.

Muchisimas Gracias.

Saludos!!!!
ç
Bien me alegro por ti, chauuuuuuu (y) (y)
 
Atrás
Arriba