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


Hola...deberías hacerle caso al compilador en cuanto a las faltas de sintaxis que cometes...por otro lado no dices que PIC usas, ni pusiste los fusibles de programación ni definiste la velocidad del oscilador del mismo.
Así corregido te compilara sin error pero dudo que si no haces lo que te dije anteriormente funcione como corresponde.

Código:
cont Var Byte 'Cont es una variable cuenta eventos
Cont1 Var Byte 'Cont1 es una variable cuenta hasta 125
Cont2 Var Byte 'Cont2 es una variable cuenta hasta 5
Digit Var Byte 'Digit es una variable tipo Byte
Patron Var Byte 'Patron es una variable tipo Byte
Digit1 Var Byte 'Digit1 Variable tipo Byte
Digit2 Var Byte 'Digit2 Variable tipo Byte
PULSO Var PORTB.7 'Pulso de entrada cuenta de productos
i var byte 'Variable tipo Byte
LedRojo Var PORTA.2 'Led Rojo Freno
Rele1 var PORTA.4 'Rele1 es Puerto de Salida freno
'
'
'Rutina Principal

CMCON = 7 'RA0 - RA3 son E/S Digitales
TRISA = 0 'Puerto A como salida
TRISB = $80 'Puerto B como Salida excepto bit 7
i = 0
'Habilitar interrupcion del TMRO
'
INTCON = %00100000 'Habilitar Interrupcion de TMRO
OPTION_REG = %00000111 'Inicializa el Prescaler
TMR0 = 217 'Cargar el registro TMRO
on interrupt GOTO PROCESO 'salta a rutina de proceso
INTCON = %10100000 'Habilitar interrupciones
CONT1 = 0 'CONT1 = 0
Cont2 = 0 'Cont2 = 0
'
'Revisar el puertoB.7 si llego pulso y esta alto
Loop:
BUTTON  PULSO , 1 , 255 , 20 , i , 0 , loop 'Se chequea por un pulso de entr
CONT1 = cont1 + 1 'Incrementa cont1 de 1 a 125
Cont2 = Cont2 + 1 'Incrementa Cont de 1 hasta 5
if Cont1 = 125 then freno1 'Chequea cuenta por 125
if Cont2 = 5 then freno2 'Chequea por cuenta de 5
goto Loop 'Continua esperando un evento externo
disable ' Se deshabilitan las otra interrupciones
'
Freno1: 'Rutina de freno1 cuenta de 5
Cont1 = 0 'Limpia el contador 1
high LedRojo '
Rele1 = 1'Prende Led Rojo indica freno act.
if Pulso = 0 Then Freno1 'Retardo 5 Mseg
Goto loop 'Regresa a Loop
'
Freno2: 'Rutina de Freno 2
Cont2 = 0 'Limpia el contador 2
high LedRojo '
Rele1 = 1 'Prende Led Rojo indica freno act.
if Pulso = 0 then Freno2 'Retardo 5 Mseg
Goto loop
'
'Rutina de servicio de la interrupcion

'
PROCESO: 'EL PROCESO A REALIZAR
'
TMR0 = 217 '
Digit = Cont Dig 1 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
PORTB = Patron 'Mostrar 10 digitos
Digit2 = 0 'Desactivar el digito 2
Digit1 = 1 'Activar el dijito 1
Pause 5 'Retardo 5 mseg
'
Digit = Cont dig 0 '
Lookup Digit,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Patron = Patron ^ $FF 'Invertir bits de la variable Patron
Digit2 = 0 'Desactivar el Digito 1
PORTB = Patron 'Mostrar el digito
Digit2 = 1 'Activar Digito 2
Pause 1 'Esperar un mseg
'
Intcon.2 = 0 'Re-Habilitar la interrupcion del TMRO
Resume 'Regresar al programa principal
Enable 'Habilitar Interrupciones
'
End
Saludos.

Ric.
01/10/2012 #2242
Moderador

Avatar de D@rkbytes

Jenry M dijo: Ver Mensaje
Apreciados colegas estoy tratando de contar eventos y he utilizado el comando BUTTON de PICBasic 2.60 para detectar un evento en el pin RB7, de la siguiente forma:

LOOP:
BUTTON , PULSO , 1 , 255 , 20 , i , 0 , LOOP

pero cuando compilo me da el error (BAD EXPRESION)

Tambien con el comando LOOKUP me da BAD EXPRESION
ej
Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Saludos.
Al parecer estas usando un PIC16F628A
En PICBasic Pro 2.60 LOOP no puede ser usado como etiqueta, ya que es una instrucción.
En esta parte: Lookup Digit,[$3F,$06$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Patron
Te hace falta separar $06$5B con una coma. --> $06,$5B
En Freno1: y Freno2: No determinas que hacer con Rele1

Como te menciona el amigo ricbevi, ya corrigio algunas partes de tu programa.
Pero cambia la etiqueta LOOP: como por ejemplo MainLoop:

Si compilas sin establecer los fuses, tendrás esta configuración por default...
Oscilador a cristal, Watch Dog Timer activado, Brown-Out Reset activado, Master Clear activado.
Y si no estableces la velocidad del reloj, PBP por default determinará 4MHz.

Esta sería una configuración de fuses para el PIC16F628A/48A en PBP 2.60
Código:
@ DEVICE PIC16F628A    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_ON,PWRT_ON,BOD_OFF,LVP_OFF
Y para establecer la frecuencia del reloj usas...
DEFINE OSC 10 ; Definir que se trabajará con 10MHz.
Para usar un cristal de croma de T.V. NTSC = (3.579545MHz)
DEFINE OSC 3

Suerte.
05/10/2012 #2243

Avatar de torres.electronico

Un apregunta, el tema anterior me desperto la curiosidad para saber como podria modificarlo para poder reconocer un patron de señal dado...Por ejemplo miren esta señal:

Mi camioneta tiene un sistema de codigos por pulsos para dar a conocer al usuario donde hay un problema determinado; El tema esta en que se me paso por la cabeza hacer bucles FOR-NEXT con retardos pequeños e implementar la interrupcion por hardware para reconocer los estados altos... el tema o mejor dicho consulta seria...como podria hacer para reconocer el tiempo de los estados altos cuando este dentro de la interrupcion?
Agradezco cualquier orientacion ... Saludos
Imágenes Adjuntas
Tipo de Archivo: jpg señal_camioneta.JPG (23,3 KB (Kilobytes), 316 visitas)
06/10/2012 #2244

Avatar de reyvilla

Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss
07/10/2012 #2245

Avatar de torres.electronico

reyvilla dijo: Ver Mensaje
Hola amigo torres devuelta yo por acá, viendo tu consulta, se me ocurre ahora que pudieras medir cuanto dura el estado en alto con dos interrupciones continuas las dos como mencionas por hardware y con ayuda del TMR0, al momento de haber un cambio de bajo a alto se activa la interrupción por flanco de subida e inmediatamente activa la el TMR0 como contador y nuevamente la interrupción de hardware pero esta vez por flanco de bajada y al momento de cambiar de alto a bajo paras el TMR0 y verificas su valor y allí ya tendrías el tiempo que duro en alto el pulso, bueno es lo que se me ocurre ahora pero por allí esta la idea, cualquier cosa me avisas...saludoss
Me ayudas con los bytes de configuracion para hacer esto? Como seteo la interrupcion por hardware para que detecte flanco de subida y flanco de bajada en PBP... Si no te mal interpreto el mensaje, cuando sale de la instruccion dentro del programa que es de la interrupcion por hardware, tendria que desactivar el tmr0 ¿verdad? Estoy pensando que alterminar la interrupcion, este volveria a la linea de donde salto y no me dejaria guardar un valor en una varible (este valor seria el tiempo)... Me parece que no te entendi
Mirá, quizas sea lo mismo, pero realizado de otra manera... Mi idea era que cuando detecte la interrupcion por hardware, salte a la rutina / sub programa de la interrupcion y que ahi dentro tenga un bucle con pequeños retardos y una funcion para incrementar una variable... Al volver a estado bajo el puerto de la interrupcion, vuelve al punto desde donde partio y sigue con el resto... luego, cuando nuevamente salte la interrupcion, como la primer variable ya no es cero, guardaria este dato en una segunda variable y asi mismo, cuando salte por 3era vez... Luego, tengo que pensar en como armar la tabla para comparar y sacar mensajes por el display... Muy lejos estoy de la idea inicial ¿no?
07/10/2012 #2246

Avatar de reyvilla

No vas tan mal, pero algo importante que debes tomar siempre en cuenta son los retardos por ciclos de maquina que consume el pic para cada instrucción, el asunto es necesitas mucha precisión para medir el estado del pulso en alto, y para eso si utilizas un bucle necesitarías restar el ciclo de maquina que no es mas que el tiempo que requirió el pic, mientras atiente la interrupción ya consumes tiempo y si aparte debes de saltar una sub-rutina le sumas mas tiempo y aun ni piensas en medir el pulso en alto y si lo hicieras de esa manera el programa seria mas tedioso ya que tendrías que sacar cuentas de cuanto tiempo has consumido antes de empezar a medir el pulso para luego restarlo, estamos hablando de micro-segundos pero que sumados valen bastante. Ahora lo que yo te comento es algo mas sencillo, tan sencillo que casi todo el código no es mas que configuraciones entre interrupciones y TMR0, de momento te dejo un ejemplo que subi hace ya un tiempo, no mide nada, y la única ejecucion que tiene aparte de las configuraciones del pic es un toggle, y ya con eso puedes detectar de forma instantánea cada una de los pines configurados como interrupción por hardware y con eso cambiar el estado de un led. Te dejo la simulación y el código ya mañana me pongo a practicar con uno mas completo para lo que tu requieres y así aprendo a medir flancos de subida.

Aquí el código comentado:

Código:
'''''''''''''''''''''''''''''''''''''''''''''''''''''''CONFIGURACION DE FUSES
@ DEVICE PIC12F675   
@ DEVICE INTRC_OSC_NOCLKOUT
@ DEVICE WDT_OFF       
@ DEVICE PWRT_OFF
@ DEVICE MCLR_OFF
@ DEVICE BOD_OFF
@ DEVICE PROTECT_OFF
@ DEVICE CPD_OFF 

'''''''''''''''''''''''''''''''''''''''''''''''''''''''DEFINICIÓN DE OSCILADOR Y CALIBRACIÓN DE OSCILADOR 
DEFINE OSCCAL_1K 1
DEFINE OSC 4  

INTCON = %10001000 'INTERRUPCIONES ACTIVADAS
OPTION_REG = %00000000
WPU = %00110110 'TODOS LOS PINES CON PULL-UP MENOS GPIO.0 y GPIO.3
IOC = %00111110 'TODOS LOS PINES COMO INTERRUPCION MENOS GPIO.0 
ANSEL = %00000000 'ADC DESABILITADO 
CMCON = %00000111 'COMPARADOR DESABILITADO 
         
SYMBOL LED = GPIO.0 

TRISIO =%00111110 'TODOS COMO ENTRADA MENOS GPIO.0    
GPIO  = %00000000 
    

ON INTERRUPT GOTO SWCHIT 
INTCON = %10001000 

INICIO:

GOTO INICIO

Disable
SWCHIT:
TOGGLE LED 
PAUSE 400
INTCON = %10001000 'EN ESTE PUNTO SI FUERA UN SOLO PIN DE HARIA UN TOGGLE PERO
Resume                     'SOLO DEL BIT DE INTERRUPCION POR CAMBIO DE ESTADO
Enable                      'DE PASARIA DE INTERRUNCION POR FLANCO DE BAJADA A 
                               'INTERRUNCION POR FLANCO DE SUBIDA
Los archivos estan aqui

http://www.forosdeelectronica.com/at...3&d=1335068599



Si te fijas no existe un código después del inicio solo tiene un goto inicio, luego viene la parte de interrupción la cual solo se activa si cambia uno de los pines...Luego me pongo con mas...saludosss
07/10/2012 #2247

Avatar de torres.electronico

Excelente Reymi... Yá me estoy poniendo con este tema por que ya veo que por fuerza mayor, no puedo hacer nada (ando con un pie en el laboratorio y otro en la camioneta por que me parece que hoy voy a ser papa por 1era vez)Ahora me pongo un toque con este tema y te subo lo que salga
Ya volvistes de gringolandia?
07/10/2012 #2248

Avatar de inspector gadget

decodificador binario con pic en basic pro
Saludos cordiales a todos los miembros del foro.
Solicito de manera respetuosa su colaboración frente al siguiente proyecto:
Estoy tratando de hacer que 8 leds conectados al puerto B me enciendan SOLAMENTE si se cumplen las siguientes condiciones en 4 bits de entrada en el puerto A identificados como p1, p2, p3 y p4:
P1=1 enciende led 1
P2, P3, P4 =1 enciende led 2
P2, P3 =1 enciende led 3
P2, P4 =1 enciende led 4
P2=1 enciende led 5
P3, P4=1 enciende led6
P3 =1 eenciende led7
P4=1 enciende led 8

como habrán visto, se trata de realizar un lector binario, pero no he conseguido un ejemplo que me pueda orientar sobre esto, y dado que tengo poca experiencia, pero quiero aprender, solicito su valiosa colaboración, pienso que habremos muchos novatos que pasamos por la dificultad de no poder decodificar este sistema, y si bien lo he logrado hacer con un integrado CD4028, es hora de trabajar con microcontroladores.
Para mejor comprensión, estos datos de la tabla anterior, son los que aparecen en una de esas tarjetitas receptoras de un sistema de control remoto, entonces al pulsar un botón en el transmisor remoto, supongamos el 2, aparecen las salidas P2,P3 y P4 en nivel alto en el receptor y duran en ese estado mientras tenga pulsado el botón y con esos datos intento que mantenga encendido un led por PERMANENTEMENTE, así yo suelte el botón, , pero cuando lo vuelva a oprimir, el led se apague, no se si usando la declaración TOOGLE sea conveniente realizar este propósito, y como esos datos duran solo el tiempo que mantenga presionado el pulsador, esto me permitiría que el pic lea esos datos, los decodifique y encienda el respectivo led, lo mismo debe suceder con cada uno de los 8 leds, así yo puedo tener encendido uno o varios al mismo tiempo y solo se apagaran al aparecer en el puerto A, los mismos datos que lo hicieron encender, osea al presionar nuevamente el pulsador correspondiente.
Agrego un avance d lo que me propongo hacer, pero la verdad, se que no estoy encarando el programa de la manera adecuada ya que como les comento, no encontré ningún ejemplo de como decodificar en binario con 4 bits d entrada, ademas una simulación, pero no se como configurar la entrada del pic, pero no creo que sea lo mas conveniente con pulsadores como yo lo hice, solamente quería simular las entradas con un pulso momentáneo en alto, pero la dificultad esta en cuando aparecen en alto 2 o mas entradas simultáneamente.
Nuevamente mis agradecimientos a quienes me puedan colaborar en este aprendizaje que nunca termina.

Código:
@ DEVICE PIC16F628A,WDT_OFF,PWRT_OFF,MCLR_OFF,BOD_OFF,CPD_OFF,PROTECT_OFF

CMCON = 7
TrisA = 255 'todos como entrada
TrisB = 0 'todos como salida

;configuracion de pines 
led1 var portb.0  
led2 var portb.1 
led3 var portb.2 
led4 var portb.3 
led5 var portb.4 
led6 var portb.5 
led7 var portb.6 
led8 var portb.7 

p1 var porta.0 
p2 var porta.1 
p3 var porta.2 
p4 var porta.3 

 PortB=0
inicio:
 if (P1=1) then led1=1
 if (P2=1) and (p3=1) and (p4=1) then led2=1
 if (P2=1) and (p3=1)  then led3=1
 if (P2=1) and (p4=1)  then led4=1
 if (P2=1) then led5=1
 if (P3=1) and (p4=1)  then led6=1
 if (P3=1) then led7=1
 if (P4=1) then led8=1
 
Goto inicio
Archivos Adjuntos
Tipo de Archivo: rar on off 16f628a 8CH.rar (14,6 KB (Kilobytes), 75 visitas)
07/10/2012 #2249

Avatar de reyvilla

Hola amigo inspector gadget te recomiendo este enlace donde explico a detalle lo que comentas de como hacer la configuración de las entradas y salidas, por otro lado te dejo un trazo del manual del PBP, para que tengas otra explicación, el manual de pbp, esta en español y esta en la red, buscas en google manual de pbp en español y creo que si es es el primero el segundo enlace.

Cuando arranca un microPIC , todos los pins son colocados en entrada .Para usar un pin como salida , el
pin o port debe ser colocado como salida o se debe usar un comando que automaticamente coloque al pin
como salida.
Para colocar un pin o port como salida (ó entrada) debe dar valores al registro TRIS . Colocando el bit de
TRIS como 0 , hace su pin una salida , y colocandolo en 1 lo hace una entrada .Por ejemplo :
TRISA = %00000000 ´ O TRISA = 0
Coloca todos los pins PORTA como salidas.
TRISB = % 11111111 ´ O TRISB = 1
Coloca todos los pins PORTB como entradas.
TRISC = % 10101010
Coloca todos los pins pares como salidas y los impares como entradas.
Cada bit individual puede ser manejado de la misma manera
TRISA.0 = 0
Coloca el PORTA , pin 0 como salida. Todos los demás pin permanecen sin cambio.
Enlace:
Curso de programación de PIC en PICBasic Pro

Por otro lado para leer un puerto completo no es muy dificil, lo que tienes que saber es que el puerto siempre se maneja como una variable en cierta forma de 8 bits, osea del bit 0 al bit 7, entonces en ves de (If (P1=1) then led1=1) preguntarias (IF PORTB = %00000001 THEN LED1 =1), y asi te evitas las declaraciones de todo el puerto b...Revisa de nuevo y cualquier cosa avisas

PD: Amigo lubeck si ya volví de texas y de mexico, vuelvo a viajar el 14 a mexico, avísame como vas con tu código yo me pongo en un rato a ver si subo un ejemplo completo.
07/10/2012 #2250


programación de pic16f877a
he trabajado anteriormente con otros modelos de pic (16f870) y no he tenido problemas pero ahora quiero trabajar con el 16f877a, realice un programa sencillo, lo simulo en proteus y procedo a quemarlo con el ic-prog, me dice que la programación esta ok, pero cuando lo monto en el protoboard no corre, para verificar monto ese mismo programa en el 16f870 y lo monto en el protoboard y corre a la perfección, quisiera que me dieran ideas de donde puede estar el problema; ayúdenme por favor.
Aquí adjunto el programa esta en pic basic pro

Código:
DEFINE OSC 4
cont VAR BYTE

inicio:
trisb = 0
trisc = 1
cont = 0
pul VAR portc.0
inicio2:

parada:
IF pul = 1 THEN
cont = 0
portb = 0
GOTO parada
ENDIF

portb = cont
cont = cont + 1
PAUSE 250
IF cont = 16 THEN
GOTO inicio
ELSE
GOTO inicio2
ENDIF

END
Imágenes Adjuntas
Tipo de Archivo: jpg ic-prog.jpg (184,3 KB (Kilobytes), 25 visitas)
Tipo de Archivo: jpg simulacion del programa en 16f877a.jpg (127,6 KB (Kilobytes), 52 visitas)
08/10/2012 #2251

Avatar de inspector gadget

gracias por responder reyvilla, voy a estudir tu informacion. gracias
08/10/2012 #2252

Avatar de torres.electronico

reyvilla dijo: Ver Mensaje
...avísame como vas con tu código yo me pongo en un rato a ver si subo un ejemplo completo.
Mirá como estoy con mi codigo:



Vos que ya sos papá me entendes jajaja... no sabes como ando
Imágenes Adjuntas
Tipo de Archivo: jpg GiulianaTorres.JPG (15,7 KB (Kilobytes), 355 visitas)
08/10/2012 #2253


torres.electronico, Felicidades por el pequeño
08/10/2012 #2254


Hola que tal, ando con un problema que me esta dando dolores de cabeza.
Es acerca de la Multiplexacion de displays de 7-seg. Catodo común.
Entiendo lo basico de la multiplexacion que es encender un display a la ves, solo que se hace tan rapido que el ojo humano no percibe el parpadeo de los mismos.
Bien pues quiero realizar un contador de 0-9999.
Tengo un programa en donde uso un LOOP pero no lleva multiplexacion es decir, las unidades las muestro por el portb y las decenas por el portd D.
Esto no presenta nigun problema ya que no lleva multiplexacion.
Mi problema viene cuando intento multiplexar, tengo la idea basica pero no logro hacer ya que tengo muchas dudas al momento de realizarlo.
Necesito una mano de vdd, es la primera ves que hago multiplexacion y no se como empezar.
Código:
TRISB=0
PORTB=0
TRISD=0
PORTD=0
VEC1 VAR BYTE
VEC2 VAR BYTE
I VAR BYTE
UNIDADES VAR BYTE
DECENAS VAR BYTE

INICIO:
WHILE 1=1
FOR i=0 TO 99
VEC1=I//10
VEC2=(I/10)//10
LOOKUP VEC1,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],UNIDADES
LOOKUP VEC2,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],DECENAS
PORTB=UNIDADES
PORTD=DECENAS
PAUSE 50
vec1=vec1+1
NEXT I
WEND
END
Ese es un contador de 0-99 como pueden apreciar no uso la multiplexacion.
Intente trasladar ese codigo con la idea que tengo de ir prendiendo los displays uno por uno, pero por ejemplo una ves que termino de contar las unidades como mostrar el numero de las decenas y que este se quede fijo hasta que las unidades hallan contado hasta 9 de nuevo???
08/10/2012 #2255

Avatar de reyvilla

Que alegría mi gran amigo felicitaciones y muchas bendiciones a torres Junior
08/10/2012 #2256

Avatar de Dario

felicitaciones torres, mis saludos a toda tu flia
10/10/2012 #2257


Buenas tardes. Disculpen la ignorancia pero cuando el fabricante menciona en la hoja de datos 1,000,000 ciclos de borrado/escritura en el caso de la memoria 24LC256, a que se refiere exactamente? es por cada direccion o por borrar completamente la memoria?

Por ejemplo si tengo unicamente 12 datos en la memoria, dejando la direccion 0 en blanco y empezando en la 1 hasta la 12. Si borro cada una de las direcciones que tengo ocupadas para reescribirle otro valor eso cuenta como 12 borrados/escritura dentro del millon de ciclos que dice poder hacer? o solo cuenta como 1 ciclo de borrado/escritura? o cada que agrego un dato extra para guardar en otra direccion limpia cuenta tambien ?

De antemano gracias por la ayuda. Saludos
12/10/2012 #2258


Hola que tal, ya pude realizar mi contador ascendente, ya entendi lo de la Multiplexacion.
Adunto mi codigo
Código:
cmcon=7; ACTIVA TODO EL PUERTO A EN DIGITAL
TRISB=0; TODO EL PUERTO EN SALIDA
PORTB=0; TODO EL PUERTO EN 0
VEC1 VAR BYTE
VEC2 VAR BYTE
VEC3 VAR BYTE
VEC4 VAR BYTE
I VAR BYTE
UNIDADES VAR BYTE
DECENAS VAR BYTE 
CENTENAS VAR BYTE
MILLARES VAR BYTE
TRISA=0
X VAR BYTE

INICIO:
WHILE 1=1
FOR i=0 TO 9999
VEC1=I//10
VEC2=(I/10)//10
VEC3=(i/100)//10
VEC4=(I/1000)//10
LOOKUP VEC1,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],UNIDADES
LOOKUP VEC2,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],DECENAS
LOOKUP VEC3,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],CENTENAS
LOOKUP VEC4,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],MILLARES


VEC1=VEC1+1

FOR X=0 TO 50
PORTA=%00001000:PORTB=UNIDADES
PAUSE 5
PORTA=%00000100:PORTB=DECENAS
PAUSE 5
PORTA=%00000010:PORTB=CENTENAS
PAUSE 5
PORTA=%00000001:PORTB=MILLARES
PAUSE 5
NEXT x



NEXT i 
WEND
END

Alguien me podria hechar la mano con el uso de las banderas.
Lo que tengo que hacer es lo siguiente, cuando conecto el uC al la corriente despliega el numero 7 y cuando pulso un boton muestra el numero 4, si lo vuelvo a pulsar muestra el numero 7 de nuevo y si lo vuelvo a pulsar muestra el numero 4 de nuevo.
Es como un set y un reset. Se que tengo que usar banderas pero aun no logro entender bien como usarlas. Adjunto lo que llevo de codigo. De inicio en proteus me muestra el 7 y cuando pulso el boton me muestra el 4 pero al pulsar de nuevo el boton ya no hace nada =(, alguien que me heche una manita, de antemano gracias.
Código:
trisb=0         
numero VAR BYTE      ;crea la variable número con valor 255 
bot VAR portc.0  ;nombre para el puerto C.4 
flag VAR BIT    ;creamos la variable flag de un bit 
flag1 var bit


display: 
      IF bot=0 THEN nueve r      
 pAUSE 80          ; pause para estabilizar el rebote de la tecla 
      if bot=1 then seis
 pause 80
Flag=0     ;cargar la variable con cero 
flag1=0
    GOTO display                  ;ir a display 


nueve: 
   IF  flag= 1 THEN GOTO display ;pregunta si la variable es uno 
      flag = 1     ;cargar la variable con uno 
      flag1=0
  portb=$66
   GOTO display                   ;ir a display 
   
seis:
if flag1=0 then goto display
flag=0
flag1=1
portb=$07
goto display



END
salu2
15/10/2012 #2259

Avatar de Nano24

Que tal amigos del foro, por acá les traigo un vídeo donde se ve un PIC generando tonos musicales, alguien sabe como sacar las notas exactas para sacar la música?

Se que usando el Sound o el Freqout, pero la verdad esta bastante difícil, sino vean el vídeo.

http://www.youtube.com/watch?feature...&v=L8GnCE3suKI
17/10/2012 #2260


Saludos
Buenos dias amigos aca dejo un pequeño aporte se que no es un proyecto grande pero estoy empezando a practicar programas en basic para hacer funcionar motores y este es un circuito con motor inversor de giro espero les agrade la idea final es ponerlo en mi casa para mover las cortinas jejeje y empiezo probando con motor dc
este es el codigo por favor si podria mejorarse espero puedan aportar y ayudarme a mejorar este proyecto
el pulsador necesita un retardo de 500 ms por tema de ruido
Código:
cmcon=7
DEFINE OSC 4			
TRISB = $F0
TRISA = $FF
        
OPEN    VAR PORTA.0
CLOSE   VAR PORTA.1

GIR1    VAR PORTB.0 
GIR2    VAR PORTB.1
SEN1    VAR PORTB.7
SEN2    VAR PORTB.6

low GIR1
low portb.1
low portb.2
LOW SEN1;=0

      Main:
        IF OPEN THEN GOSUB ABRIR
        IF CLOSE THEN GOSUB CERRAR     
 
   ABRIR: 
     pause 500
      IF OPEN THEN 
       HIGH gir1
        LOW GIR2
      ENDIF
       
      CERRAR: 
       PAUSE 500
        if close then
         low gir1
          high gir2
        endif
  GOTO MAIN

END
aca adjunto el diseño en proteus y el archivo hex el codigo del programa lo dejo aca mismo
¿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 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.