Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/10/2008 #1


Contador de personas con pic16f84
quisiera por favor ayuda con un proyecto electronico:
el circuito esta basado en un pic16f84 y su finalidad es contar interrupciones en el puerto B. el problrma es que el pic solo cuenta con registros de 8 bits, insuficientes para la aplicasion que va a tener pues deseo implementar una especie de contador de 16 bits y que esta información se visualize en un modulo lcd.

si alguien tiene una idea de como incrementar un registro de ocho bits y , cuando este desborde seguir la cuenta en otro registro.

Notra: estoy obligado a usar un 16f84
30/10/2008 #2

Avatar de pepechip

como dichos datos tendras que representarlos en un display, lo mejor es que guardes los datos en 3 registros, uno para las unidades, otro para las decenas y otro para las centenas.
30/10/2008 #3


el problema es que no se como incrementarlos cunando van desbordando
30/10/2008 #4

Avatar de metalmetropolis

Lo unico que te puedo decir, es que el programa tendras que compilarlo en lenguaje C.
Asi, puedes declarar un entero sin signo, por ejemplo:

unsigned int contador;

y con eso tienes automáticamente un contador de 16 bits, que significa 2^16 valores distintos, desde 0 hasta 65535. suficiente ?

bueno, el asunto es que el PIC de todas maneras trabaja con 8 bits, y es el compilador de C quien se encarga internemente del detalle de "acoplar dos registros" para construirno mas grande.

ahora, si solo debes usar lenguaje ensamblador, hay varias maneras de construir contadores.
incluso hay codigos escritos por ahi (busca en google no mas) para realizar retardos de segundos y cosas por el estilo.

respecto al display, no tengo idea como se utiliza.
aun soy novato en esto.

espero te halla podido ayudar en algo.

saludos!
30/10/2008 #5


es muy sencillo en ensamblador.

etiqueta_1 incf var_1 ;incrementa la primer variable y luego haces una comparacion

movf nueve,0 ; usas una constante con valor de 9
subwf var_1,0 ;llevas el valor de la variable al registro 0
btfss status,C ; revisa si el valor de carry es 1 si es asi el valor de la variable supero #9
goto etiqueta_1 ; sino a superado 9 regresa a incrementar la var_1

incf var_2 ; si supero 9 incrementas la variable 2 y haces otra comparacion


con este metodo determinas la primer variable como las unidades, decenas, etc.

espero que te sirva de lago y exito.
01/11/2008 #6


muchas gracias, ahora lo que todavia no se es como visualizar esos datos en un modulo lcd en decimal
04/11/2008 #7


de casualidad alguien conoce el modulo lcd lmg-162-stn o me pude proporcionar su hoja de datos
04/11/2008 #8

Avatar de pepechip

con 3 displays de 7 segmentos te resultaria mas facil realizarlo.
04/11/2008 #9


lo que pasa es que el programa tiene 2 contadores individuales que deberan visualizarse en el lcd, uno en cada linea y deseo contar hasta 10 000
04/11/2008 #10

Avatar de Moyano Jonathan

Decime bien detallado como queres que funcione tu proyecto para así te puedo ayudar , yo domino algo de c de ccs y te puedo ayudar con lo del contador y con lo del LCD.

Con lo de incrementar un registro de 16 bits sería más o menos así:

long int contador // Variable contador de 16 bits: 0 a 65535

while(true)
{
if(contador==10000) { // Mira si el contador llegó a 10000.
contador = 0x00; // Si es así Resetea la variable.
}
else
contador ++ // sino aumenta en 1 la variable
}
05/11/2008 #11


el programa debe ser en ensamblador, por que es que mas domino y seria dificil aprender c en estos momentos pues el proyento tiene que quedar en unos 10 dias.
se trata de un contador de pasajeros que reconosca entre una bajada y una subida, que las cuente y uqe las visualize en el lcd que tengo(lmg-162-stn). luego mediante retardos "contar el tiempo que esta interrumpida una line del puerto b del pic si rebasa 500ms activar una alarma que lo avise.
gracias por la ayuda a gradmaster es justo lo que necesitaba.
05/11/2008 #12


Comenten por favor cualquier idea me es util
06/11/2008 #13

Avatar de Meta

Hola:

La verdad que no siempre las personas salen uno a uno. Podría contar 1 con tres personas que salgan al mismo tiempo.

Por ejemplo:
Una mujer con un bebé en un brazo y otro hijo de 6 años pegado a la madre salen las mismo tiempo. Cosas así no es muy eficaz del todo. También hay salvajes de grupos de amigos que salen a lo bruto.


Un cordial saludo.
06/11/2008 #14


Si el programa es para el 16f84, para enviar a una lcd (16x2) hay una libreria que te ayuda a trabajar con ella. Permitiendote la configuración de 8 bits o de 4 (por si necesitas reducir lineas) en datos y dos bits más de control.

Si las necesitas puedo enviartelas así como un ejemplo de codigo en .ASM de como usarlas.
06/11/2008 #15

Avatar de Meta

Esa librería la encuentras aquí:

www.pic16f84a.org
06/11/2008 #16


la mayoria de las librerias estan diseñadas para el modulo lcd lm106l pero yo tengo un lmg-162-stn. esees ahora mi mayor problema. ¿alguien tiene la hoja de datos o sabe como funciona?
12/05/2010 #17


Respuesta: Contador de personas con pic16f84
Hola amigos, necesito que me ayuden con este programita, es un proyecto final y estoy un poco quedado, tengo que programar el pic16f877 simular en proteus y montarlo en la proto, el circuito es un contador de objetos opacos que pasan por una banda transportadora no importa el color, no sé cómo realizar el código para cargar en el pic. Les agradesco su ayuda.
12/05/2010 #18

Avatar de Meta

Respuesta: Contador de personas con pic16f84
ISAACTELLEZ dijo: Ver Mensaje
la mayoria de las librerias estan diseñadas para el modulo lcd lm106l pero yo tengo un lmg-162-stn. esees ahora mi mayor problema. ¿alguien tiene la hoja de datos o sabe como funciona?
Mejor consigue un HD44780 de Hitacgi y ahorras mucho tiempo y trabajo por 10 €.

Puedes usar un 16F88 que tiene 1 timer de 16 bits, y 2 de 8 bits.
12/05/2010 #19


Respuesta: Contador de personas con pic16f84
ah gracias, pero lo que necesito es el codigo para el pic, esque yo tengo este y no me funciona bien, yo conecto un convertidor a/d no uso el micro para convertir la señal.

#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock = 4000000)
#define use_portd_lcd TRUE
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)
#byte puerto_b = 06
#include <lcd.c>

int flanco_a,tiempo,d,desborde;
long bandera,velocidad,frecuencia,angular,cutil,base,po rc;

#int_ext

void conteo()
{
flanco_a= flanco_a + 1;
if( flanco_a == 1)
{
desborde = 0;
d = 0;
set_timer0(0);
delay_us(3);
ext_int_edge(H_TO_L);
velocidad = 0;
}
if( flanco_a == 2)
{
ext_int_edge(L_TO_H);
}
if ( flanco_a >= 3)
{
tiempo = get_timer0();
flanco_a = 1;
set_rtcc(0);
ext_int_edge(H_TO_L);
desborde = 0;
d = 0;
}
}

#int_rtcc

void desbordado()
{
desborde = desborde + 1;
d = desborde;
set_timer0(0);
}
void main()
{
cutil = 0;
set_tris_c(0xFd);
enable_interrupts(GLOBAL);
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
ext_int_edge(L_TO_H);
setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
flanco_a=0;
desborde = 0;
set_rtcc(0);
frecuencia = 0;
base = 0;
lcd_init();
lcd_gotoxy(5,1);
printf(lcd_putc,"0 RPM");
setup_timer_2(T2_DIV_BY_1, 255, 1);
setup_ccp1(CCP_PWM_PLUS_1);
cutil = 540;
delay_ms(10);
set_pwm1_duty(cutil);
do
{
delay_ms(6000);
lcd_init();
frecuencia = (3906) / (tiempo + 256*desborde);
angular = (frecuencia*60)/(24);
lcd_gotoxy(5,1);
printf(lcd_putc,"%lu RMP", angular);
if(angular > 185)
{
base = angular - 182;
if(base == 0)
{
cutil = 540;
}
else
{
cutil = cutil - 3*base;
}
}
if(angular < 180 )
{
base = 182 - angular;
if(base == 0)
{
cutil = 540;
}
else
{
cutil = 540 + 3*base;
}
}
set_pwm1_duty(cutil);
}
while(true);
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.