Curso de programación de PIC en PICBasic Pro

D@rio

Adjunto a este post un archivo *.pdf de lo que presumo seria el Complemento a 2 usando los 2 Byte (Byte_H y Byte_L) del IGT-3205, no tengo la más minima seguridad que sea correcto, podrian estar ordenados al reves ambos Byte's, etc. . Quedo a la espera de algun comentario.

Para mi es el próximo paso a realizar a continuación de la Tablas en estado Estático y Dinámico del Gyro una vez que estemos seguros de como manejar esto.



Saludos, JuanKa.-

P.D.: Si bien el tema de "Complemento a 2" permite habilitar/agregar un thread, creo correcto haberlo colocado junto con el trabajo que estan llevando a cabo del Gyro IGT-3205.-
 

Adjuntos

  • Complemento-a-2-en-dos-Byte_02b.pdf
    102.4 KB · Visitas: 62
Que tal bandiita

bueno ps aqui molestando con una ayuda que por favor me puedan auxiliar.Primero este programa que les pongo lo vi en un libro, y de ahi me lo copie y lo modifique a mi gusto.

Lo que quiero es que se apague el cto cuando mantenga presionado el boton en pin 4 digamos que lo mantenga presionado durante 3seg y se apague.

La otra opcion es si me pueden decir si puedo reducirlo lo mas que se pueda, esto mas que nada es para aprenda mas comandos.

Ok.. espero sus respuestas y ojala no suene muy exigente y si fue asi no es mi intension......Saludos


INCLUDE "modedefs.bas"

@ device pic12F683, FCMEN_OFF
@ device pic12F683, IESO_OFF
@ device pic12F683, BOD_OFF
@ device pic12F683, CPD_OFF
@ device pic12F683, PROTECT_OFF
@ device pic12F683, MCLR_OFF
@ device pic12F683, PWRT_ON
@ device pic12F683, WDT_OFF
@ device pic12F683, INTRC_OSC_NOCLKOUT

OSCCON = $60 ' Internal 4MHz osc
DEFINE OSC 4
ADCON0 = 0 ' A/D off
CMCON0 = 7 ' Comparators off
ANSEL = 0 ' Set all digital
WPU = 0 ' Internal pull-ups = off
trisio = $8
pulsador var GPIO.3
led1 var GPIO.1
led2 var GPIO.2
led3 var GPIO.0
led4 var GPIO.4
led5 var GPIO.5
GPIO=0


inicio:
if pulsador=0 then ;pregunta si el pulsador es 0 entonces
gosub trampa ;salta a la etiqueta ciclo
goto prendido1 ;de lo contrario salta a la etiqueta prendido
endif
goto inicio

prendido1: ;etiqueta de salto
low led5
pause 200
high led1
pause 200 ;saque 1L por el pueto b.0
pregunta: ;etiqueta de salto
if pulsador=0 then ; pregunta si el pulsador es 0 entonces
goto prendido2 ; salta a la etiqueta apagado
endif
goto pregunta ;salte a pregunta hasta que presione nuevamente el pulsador

prendido2:
low led1
pause 200
high led2
pause 200
pregunta2:
if pulsador=0 then
goto prendido3
endif
goto pregunta2

prendido3:
low led1
pause 200
low led2
pause 200
high led3
pause 200
pregunta3:
if pulsador=0 then
endif

apagar:
pause 200
low led1
low led2
low led3
pause 200
preguntafinal:
if pulsador=0 then
goto preguntafinal
endif
goto inicio ;salte a la etiqueta inicio

trampa: ; etiqueta para salto llamada ciclo
if pulsador=0 then goto trampa ;si pulsador sigue presionado salte a trampa
return ;casco contrario retorne a la linea donde se quedo
end
 
Última edición:
Hola TiTaNB009, lo de los 3 segundos lo puedes hacer con una variable tipo contador y while, algo asi:

trampa: ; etiqueta para salto llamada ciclo
while pulsador = 0 and variablecount <= 3
variablecount = variablecount + 1
PAUSE 1000
goto trampa ;si pulsador sigue presionado salte a trampa
wend
return ;casco contrario retorne a la linea donde se quedo
end

Bueno habría que probarlo y depurarlo pero mas o menos es una idea de como se podría hacer saludos
 
hola que tal, pues yo nuevamente solicitando su ayuda, debo de realizar un contador de 0 a 99 don display de 7 segmentos he visto varios ejemplos aqui en el foro y un libro, la cuestion es que el profe quiere especificamente un diseño el cual 7 pines del puerto van directo al display y el ultimo pin se conecta a dos transistores uno pnp y otro npn, esto para con 1 solo pin controlor los dos comunes de los displays


la verdad no tengo idea de como realizar eso, si alguien me pudiera ayudar se los agradeceria mucho, adjunto la imagen para que me entiendan mejor
 

Adjuntos

  • 0-99.png
    0-99.png
    55.2 KB · Visitas: 60
Última edición:
Hola alejandrozama, es mas fácil de lo que parece, si vas a utilizar los 7 pines del puerto, y conociendo el pinaje del 7 segmentos lo que tendrías que hacer es codificar, osea lo mismo que hace el 7447 o el 7448, pero con los 7 pines del pic directos, como veo ya tienes el diagrama es catodo comun, lo que significa que debes enviar unos para activar cada segmento y con el arreglo de transistores siempre va estar activado uno o el otro y es cuestión de ir turnandolos mientras vas activando los segmentos, ejemplo para mostrar 01, digamos que a primera instancia siempre esta habilitado el primer display con el arreglo de transistores, entonces envías para que se vea un cero, activas los segmentos a,b,c,d,e y f
y eso lo haces enviando por el puerto b, %001111111, y allí ya tendrías en el primer display un 0, para el segundo habilitas el otro display y activas los segmentos b y c seria así: %10000110, si tienes una simulación y un código ya empezado es mucho mejor para poder ayudarte...saludoss
 
consegui un programa de un libro, este este es un contador de 0-99 ya lo probe y funciona muy bien solo que este diseño utiliza 2 pines para el control del comun de cada display (estoy utilizando de anodo comun), la simulacion se ve como parpadeando pero como dije en fisico funciona bien.

he tratado de hacer el areglo para solo utilizar un purto para el control de los comunes, la cuestion es que soy uan persona que se confunde con facilidad y se me pierde el hilo de lo que estoy haciendo 30 min despues vuelvo a donde empeze jajajja este es algo desesperante alguien me podria ayudar a como seria el areglo???

Código:
 @ device xt_osc 
define osc 4
Cnt VAR Byte 
Digit VAR Byte
Pattern VAR Byte 
Digit1 VAR PORTA.0
Digit2 VAR PORTA.1
First VAR Byte 
Second VAR Byte 
i VAR Word 

CMCON=7
TRISA=0 
TRISB=0

INTCON=%00100000
OPTION_REG=%00000111
TMR0=217
ON INTERRUPT GOTO ISR
INTCON=%10100000

LOOP:
Cnt=0

NXT:
Digit=Cnt DIG 1 
GOSUB CONVERT 
First=Pattern 
Digit=Cnt DIG 0 
GOSUB CONVERT 
Second=Pattern 
FOR i=1 to 500
Pause 1 
NEXT i
Cnt=Cnt + 1
IF Cnt>99 THEN LOOP
GOTO NXT 

DISABLE
ISR:
TMR0=216
PORTB=First
Digit2=0
Digit1=1
PAUSE 5

Digit1=0
PORTB=Second
Digit2=1
PAUSE 1
INTCON.2=0 
RESUME 
ENABLE 
CONVERT:

LOOKUP Digit,[$3F, $06, $5B, $4F, $66, $6D, $7D, $07, $7F, $6F],Pattern
Pattern=Pattern^$FF 
RETURN
END
 

Adjuntos

  • 0-99.rar
    9.5 KB · Visitas: 103
consegui un programa de un libro, este este es un contador de 0-99 ya lo probe y funciona muy bien solo que este diseño utiliza 2 pines para el control del comun de cada display (estoy utilizando de anodo comun), la simulacion se ve como parpadeando pero como dije en fisico funciona bien.

he tratado de hacer el areglo para solo utilizar un purto para el control de los comunes, la cuestion es que soy uan persona que se confunde con facilidad y se me pierde el hilo de lo que estoy haciendo 30 min despues vuelvo a donde empeze jajajja este es algo desesperante alguien me podria ayudar a como seria el areglo???
Saludos.
Revisa estas modificaciones que realice al código, quedaron como comentadas.
Estos cambios involucran también el cambio de PIC por un 16F84A
ya que use el código del link que cite anteriormente y al parecer es el mismo que subes.
solo que el que cite tiene unos cambios para incremento manual.
Las modificaciones son para cátodo común y una sola línea de control para los dos TR's.
Las simulaciones funcionan bien, pero no probé el circuito en la realidad. :apreton:
 

Adjuntos

  • 0-99 CC Modificados.rar
    34.8 KB · Visitas: 140
Última edición:
Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias
 
Última edición:
Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y tacometro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias
Me parece que se te olvido adjuntar el código :eek:pss:
 
Me parece que se te olvido adjuntar el código :eek:pss:
si tienenes razón gracias



Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo, adicionalmente me esta presentando errores al medir frecuencias inferiores a 50 Hz:enfadado:, no importa sí tengo que usar otro pic como por ejemplo un 877a, aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias
 

Adjuntos

  • multiserv.rar
    26.9 KB · Visitas: 93
Última edición:
Hola a todos, de nuevo por aqui molestandoles estoy algo desocupado y se me ocurrio hacer una herramienta multiple para mi banco de trabajo se trata de un circuito que me sirva para contar eventos para voltimetro y frecuencimetro pero no logro hacer que el pic me cuente los pulsos de un pulsador por ejemplo, adicionalmente me esta presentando errores al medir frecuencias inferiores a 50 Hz:enfadado:, no importa sí tengo que usar otro pic como por ejemplo un 877a, aqui subo el ejemplo a ver sí me pueden ayudar aver que me estara haciendo falta en mi programa de antemano gracias
Saludos.
Revisa los cambios que realice a tu programa.
Para la función de voltimetro si necesitas cambiar de PIC
Suerte y hasta luego. :apreton:
 

Adjuntos

  • multiserv.rar
    21.2 KB · Visitas: 95
Saludos.
Revisa estas modificaciones que realice al código, quedaron como comentadas.

estube algo ocupado el fin de samana ya arme el circuito y fucniona a la perfeccion, por como pude ver eres vastante rapido programando, muchas gracias y creo me seguiran viendo por el foro, ya que aparte de mis practicas he tenido en mente varios proyectos personales, como que las pics son adictivas.

saludos
 
Hola interesante código del contador, nunca había utilizado la instrucción DIG ahora se su significado muy bueno el dato, hice un pequeño cambio al código y me gustaría saber si esta correcto ya que funciona igual solo que no uso interrupciones coloco el código modificado:

Código:
REM PIC16F84A
@ DEVICE XT_OSC,PROTECT_OFF,WDT_OFF,PWRT_ON
;*******************************************************************************
DEFINE OSC 4				; Oscilador Configurado a 4Mhz.
TRISA = $FE					; %11111110	7,E 6,E 5,E 4,E 3,E 2,E 1,E 0,S
TRISB = $80					; %10000000	7,E 6,S 5,S 4,S 3,S 2,S 1,S 0,S
;*******************************************************************************

;DEFINICION DE VARIABLES

Cnt VAR Byte 
Digit VAR Byte 
Pattern VAR Byte 
Digit1 VAR PORTA.0 
Pbutton VAR PORTB.7 
i VAR Byte 

Cnt = 0 

LOOP1:
BUTTON Pbutton, 0,255,0, i, 0, MUESTRA
Cnt = Cnt + 1

MUESTRA:
Digit = Cnt DIG 1
LOOKUP Digit, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Pattern
PORTB = Pattern
Digit1 = 1
Pause 10 

Digit = Cnt DIG 0
LOOKUP Digit, [$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6F],Pattern
Digit1 = 0  
PORTB = Pattern
PAUSE 10 
CALL LOOP1
GOTO MUESTRA
END

cualquier cosa me avisan saludosss:apreton:
 
estube algo ocupado el fin de samana ya arme el circuito y fucniona a la perfeccion, por como pude ver eres vastante rapido programando, muchas gracias y creo me seguiran viendo por el foro, ya que aparte de mis practicas he tenido en mente varios proyectos personales, como que las pics son adictivas.

saludos

Saludos alejandrozama
Que bien que te funciono el código. Ya que en el simulador no funciona si se pone el TR PNP
Por ese motivo use el inversor.
Y si, si son adictivos los PIC. También el Proteus :D

Hola interesante código del contador, nunca había utilizado la instrucción DIG ahora se su significado muy bueno el dato, hice un pequeño cambio al código y me gustaría saber si esta correcto ya que funciona igual solo que no uso interrupciones coloco el código modificado:
cualquier cosa me avisan saludosss:apreton:
Saludos reyvilla
Ok. Si esta correcto el codigo sin usar interrupciones (Yo tampoco las creí necesarias)
Solo hay un detalle. ;) Hay que cambiar el CALL por un GOTO
Ya que se produce un Stack Overflow
Y suprimir el GOTO MUESTRA
De ahí en fuera todo funciona muy bien (y)
Me gustaria armar el circuito con los 2 TR's para ver como se ve en la realidad :)
Pero solo tengo displays de 7 segmentos sueltos, y me da fiaca hacer las conexiones :LOL:

Adjunto el proyecto con los cambios y su simulación

Suerte y hasta luego.
 

Adjuntos

  • Contador 0-99 CC No_Int.rar
    17.1 KB · Visitas: 110
Última edición:
Saludos.
Revisa los cambios que realice a tu programa.
Para la función de voltimetro si necesitas cambiar de PIC
Suerte y hasta luego. :apreton:

hola Darkbytes gracias por tu ayuda ahora ya no tiene problema el frecuencimetro pero no se como hacer para la función "contar" aquí necesito una función parecida a la que postearon los compañeros y tú del contador de 0 a 99 donde se cuentan las veces que se oprime el pulsador pues lo que busco es poder contar por ejemplo cuantos pulsos pasaron en un tren de pulsos en una determinada unidad de tiempo sin importar a que frecuencia entren.
Por favor ayudame me doy cuenta de que sabes muchisimo sobre este tema, y muchas gracias por tu tiempo, subo nuevamente el proyecto para que lo veas, ya esta compilada la reforma que le hiciste a mi código y le hice también algunas buscando que me funcione la función "contar" pero no lo he podido lograr.:apreton:
 

Adjuntos

  • multiserv.rar
    29.2 KB · Visitas: 63
Última edición:
hola Darkbytes gracias por tu ayuda ahora ya no tiene problema el frecuencimetro pero no se como hacer para la función "contar" aquí necesito una función parecida a la que postearon los compañeros y tú del contador de 0 a 99 donde se cuentan las veces que se oprime el pulsador pues lo que busco es poder contar por ejemplo cuantos pulsos pasaron en un tren de pulsos en una determinada unidad de tiempo sin importar a que frecuencia entren.
Por favor ayudame me doy cuenta de que sabes muchisimo sobre este tema, y muchas gracias por tu tiempo, subo nuevamente el proyecto para que lo veas, ya esta compilada la reforma que le hiciste a mi código y le hice también algunas buscando que me funcione la función "contar" pero no lo he podido lograr.:apreton:
Ok. Saludos.
A mi punto de vista lo que quieres es lo mismo que la función de frecuencimetro.
Ya que la función COUNT es lo que hace, contar pulsos en un determinado periodo de tiempo.
Lo único que cambiaria seria el periodo y la forma de representar la cuenta en el display.
Adjunto los cambios que realice para esto.
Suerte y hasta luego.
 

Adjuntos

  • multiserv_rev2.rar
    20.4 KB · Visitas: 81
hola amigos.
les cuento que todavia sigo luchando con el sensor itg3205 y he logrado mostrar la informacion del mismo en un display 7seg.X4 digitos y aqui subo el video. en el video puede verse claramente como marca la velocidad angular al ser movido hacia la izquierda. cambie la variable byte por una variable word y resulto que el numero que debia mostrar era mucho mayor al que yo calcule ya que al tener un convertidor analogico digital interno de 8 bits teoricamente el numero no debia pasar de 255, pero estaba equivocado, el numero era 65480 para el eje X_H jeje... en elprograma que escribi divido ese valor por 10 con lo que me da 6548 y asi lo puedo sacar en el display. en el video hago una prueba al eje Z_H, aqui lo dejo para que vean, saludosss. ah, aqui dejo el codigo tambien :D

Código:
@ DEVICE MCLR_OFF,HS_OSC, WDT_OFF, LVP_OFF, BOD_OFF, PWRT_ON, PROTECT_OFF
DEFINE   OSC   20                     'Para trabajar con un cristal de 20MHz
DEFINE I2C_HOLD 1
define I2C_SLOW 0                    'Velocidad de I2C de 400KHz
cmcon=7
trisa=0                              'puertos como salidas
trisb=0
porta=0 
portb=0
SDA VAR PORTA.1                      'entrada y salida de datos
SCL VAR PORTA.2                      'reloj 
numero var word
unid var byte
dece var byte
cent var byte
mile var byte
 
i2cwrite sda,scl,%11010000,62,[$80]  'resetear el ITG a 0
pause 10
i2cwrite sda,scl,%11010000,21,[$09]  'configuro SAMPLE RATE
pause 10
i2cwrite sda,scl,%11010000,22,[$18]  'registro 22 full scale a ±2000°/sec                                     'Modificado según ReyVilla 
pause 10
i2cwrite sda,scl,%11010000,23,[$00]  'sin interrupcion
pause 10
numero=0
leer:
  I2CREAD sda,scl,%11010000,33,[numero]    'leer eje Xout-H y guardar en a1
  pause 5
  numero=numero/10
  gosub display
goto leer

display:
  unid=numero dig 0
  dece=numero dig 1
  cent=numero dig 2
  mile=numero dig 3
  portb=224+mile
  pause 4
  portb=208+cent
  pause 4
  portb=176+dece
  pause 4
  portb=112+unid
  pause 4
  return

 
Última edición:
hola que tal, pues yo nuevamente por aqui lo cuestion es que hay una practica donde devo de utilizar la interrupcion externa.

la cuestion es que solo he visto 2 ejemplos en internet y no logro que el programa haga lo que quiero. como que hay algo que no entiendo

lo que el programa debe de realizar es lo siguiente, se devera estar ejecutando un programa principal (por ejemplo un corrimiento de luces en cualquier puerto pic16f877a) y cuando se presione un boton de b.0 entonces se encendera a.0 y este dato se rotara de a.0-a.3 por cada pulsacion del boton.

como siempre creo que no me explique, bueno la cuestion es que solo necesito algo de ayuda para hacer uncionar algo parecido ya que ahora no logro que funcione nada

explicacion de la practica textual
"Armar el circuito y realizar el programa que utilice la interrupción externa (RB0/INT) del PIC. Cuando suceda la interrupción hacer rotar el dato 01H del puerto A y así por cada interrupción que suceda, hacer rotar el dato del puerto A.
La rotación a la izquierda contrólela para que sea del Bit 0 al Bit 3"

Código:
@ device xt_osc 
define osc 4

x var byte



trisb=%00000001

trisa=%000000
porta=%000000


INTCON=%10100000
on interrupt goto pulsador


inicio:
portb=%00000010
pause 200
portb=%00000100
pause 200
portb=%00001000
pause 200
portb=%00010000
pause 200
portb=%00100000
pause 200
portb=%01000000
pause 200
portb=%10000000
pause 200
goto inicio
end

disable 
pulsador:
if x=8 then x=1
x=1
porta=x
pause 200
if (portb.0=1) then x=x*2
resume
enable


no se burlen de mi codigo. dejo la imagen
 

Adjuntos

  • interrupcion.jpg
    interrupcion.jpg
    89.2 KB · Visitas: 16
Atrás
Arriba