Contador modulo 16 y modulo 8 con pic 16f84, con interruptor optico de ranura

que tal compañeros
necesito armar un contador con un pic16f84 dicho contador utiliza un optointerruptor o sensor de barrera o como se llame, con el se generan los pulsos a contar, pero el detalle mas que nada es en la programacion del pic ya que se como conectar los componentes, el contador debe hacer el conteo de 0000 hasta 1111 (modulo 16) ya que este en 1111 se regresa a 0000 y asi sucesivamente y tambien debe contar de 0000 a 0111 (modulo 8) e igual cuando este en 0111 bricar a 0000 y asi sucesivamente
debo utilizar un pin para establecer que contador sea, por ejemplo si en dicho pin es un 1 que cuente modulo 16 y si es cero sea un contador modulo 8 o alreves no importa.
otro detalle es que solo necesitoque el conteo lo haga digamos internamente osea que no necesito que me muestre los cero y unos con leds o display u otra cosa.
solo necesito una salida (pin) este pin se pondran en 1 (estado alto) cuando el contador sea 0000 y 0001 en ambos contadores en este pin le conectar un rele claro con un transistor.
 

Adjuntos

  • sensor_ranura_833.jpg
    sensor_ranura_833.jpg
    19.8 KB · Visitas: 346
he buscado información en internet y en algunas paginas encontre que para usar el pic16f84 como contador externo se debe usar el pin RA4/TOCKI pero la verdad es que no se programar en ensamblador alguien me podria decir como hacer el programa en picbasic pro ya que siempre he usado este programa
 
Te pongo los pasos para usar el Timer0 como contador de eventos externos, solo que se supone que son de los PIC16F87x, igual y es lo mismo para el PIC16F84.

1. Asegurar que RA4 se encuentre configurada como entrada.

2. Se decide si se va a trabajar con el prescaler utilizando el bit RSA (con 0 se asigna al Timer).

3. Si se selecciona el prescaler, se fija el número de eventos que debe contar para que incremente el registro TMR0. Esto se hace con los bits PS2, PS1 y PS0, de otra forma ir al paso 4.

4. Seleccionar el flanco de incremento, para esta tarea se utiliza el bit T0SE (bit04 de OPTION_REG).
- Si T0SE=1 el incremento es con flancos de subida.
- Si T0SE=0 el incremento es con flancos de bajada.

5. Seleccionar al Timer como contador de eventos externos (mediante el bit T0CS) [T0CS es el bit05 de OPTION_REG].
- Si T0CS=1 Timer cuenta eventos externos.
- Si T0CS=0 Timer cuenta ciclos internos de reloj.

6. Asegurarse que la bandera de desbordamiento se encuentre abajo (poner en 0 el bit T0IF).

7. Escribir el número a partir del cual debe empezar a contar el registro TMR0. Nota: Al escribir algo en TMR0 reinicia el prescaler.

8. Esperar a que se levante la bandera T0IF

Te sugiero que revises el data sheet del PIC.

Buena Vibra!
 
Si te la ingenias puedes usar cualquier otro pin, pero ya no sería con el Timer0. Puedes estar leyendo constantemente el estado de un pin, pero si haces eso la frecuencia máxima que puedas obtener sera menor a la que tendrías con el Timer0.
Buena Vibra!
 
Te pongo los pasos para usar el Timer0 como contador de eventos externos, solo que se supone que son de los PIC16F87x, igual y es lo mismo para el PIC16F84.



Te sugiero que revises el data sheet del PIC.

Buena Vibra!

Hola me puedes ayudar mira estoy trabajando con 16f876a y quiero hacer el conteo de pulsos para despues sumarlo y guardarlos pero quiero trabajar por flanco por que he visto que si coloque que sume cuando este el pin en cero si este pin queda en cero el sigue contando y no uiero esto si no que cuando pase a cero cuanto una sola ves mira aqui coloco mi programa en basic te agardeceria la ayuda, veo que aqui colocas el registro OPTION_REG pero la verdad no se como utilizar esto

este es el del 16f876a
bit 7 RBPU: PORTB Pull-up Enable bit
1 = PORTB pull-ups are disabled
0 = PORTB pull-ups are enabled by individual port latch values
bit 6 INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin
bit 5 T0CS: TMR0 Clock Source Select bit
1 = Transition on RA4/T0CKI pin
0 = Internal instruction cycle clock (CLKO)
bit 4 T0SE: TMR0 Source Edge Select bit
1 = Increment on high-to-low transition on RA4/T0CKI pin
0 = Increment on low-to-high transition on RA4/T0CKI pin
bit 3 PSA: Prescaler Assignment bit
1 = Prescaler is assigned to the WDT
0 = Prescaler is assigned to the Timer0 module


este es mi programa
Define LCD_DREG PORTB
Define LCD_DBIT 4
Define LCD_RSREG PORTB
Define LCD_RSBIT 2
Define LCD_EREG PORTB
Define LCD_EBIT 3
TRISB = %00000011 ' en el puerto B coloco el pin 0 y el 1 como entradas y el resto como salidas
contador var byte
contador = 0
Pause 500
loop:

Lcdout $fe, 1 ' Clear LCD
IF PORTB.0 = 0 THEN
Contador = CONTADOR + 1
ENDIF
pause 50
Lcdout "sumatoria: ", DEC contador
Pause 100
Goto loop
End
 
Atrás
Arriba