Curso de programación de PIC en PICBasic Pro

Código:
define  OSC 4 ' se define el tipo de oscilador a usar

Define  LCD_DREG        PORTD ' De aqui a->
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTD
Define  LCD_RSBIT       2
Define  LCD_EREG        PORTD
Define  LCD_EBIT        3  ' <- aqui se definen lo pueros del LCD

Define  ADC_BITS        10     	' De aqui a->
Define  ADC_CLOCK       3     	
Define  ADC_SAMPLEUS    50  '<- se define como se a manejar el conversor analogico a digital  	

TrisB=%11111111 ' se definen todos los puertos como entrada
TrisC=%00000000 ' se definen todos lo puertos como salida

Portc=%110000 ' se le dice que lel bit 4y5 se inicialicen en alto los demas en bajo

SensA   var word	'de aqui a ->				
SensB   var word
AStep   Var word '<- a aqui se declan la variables en tipo word o doble byte		

ADCON1 = %10000010	' se define el puertoA esto se ve en la tabla del Datasheet de cada uC
astep=0	' se inicializa variable  astep=0		
Pause 500  ' se hace una pausa de 500 milisegundos

     		
Inicio: ' se crea una etiqueta 
 if portb.0=1 then  ' si se pulsa la tecla colocada en Mueve entonces
  if portb.1=0 then astep=Astep+1 ' aumenta un paso si el boton derecha esta sin presionar
  if portb.1=1 then                      'si no
   if astep<>0 then astep=Astep-1 ' entonces verifica que no este en el primer paso si no es asi disminuye
  endif                                       ' un paso esto es para dar hacia la derecha o izquierda
  if portb.2=0 then gosub mueveh 'si el pulsador Hall/full esta desactivado se va a la rutina mueveH 
  if portb.2=1 then gosub muevef  ' si el pulsador Hall/full esta activado se va a la rutina MueveF
  if portb.3=0 then Lcdout $fe,1,"Value A:", DEC astep ' si el pulsador senece va a desplegar en Decimal
                                                                         ' el valor de Astep... osea el numero del paso en
                                                                         ' la secuencia de 8 pasos en caso de ser Full
                                                                        ' o 4 en caso de ser Half
 endif              
 if portb.3=1 then gosub adc ' si el pulador sense esta en alto entonces se va a la rutina ADC
Goto inicio ' se hace un bucle      				
End ' se termian el codigo
Hasta ahi se entiende...?????
 
Última edición:
Código:
MueveF: ´esta es la subrutina de medio paso o sea solo son 4 pasos
 if astep>=5 then astep=1 ' si el paso es mayor o igual a 5 se inicia la secuencia en 1 porque nada mas 
                                    ' son 4 pasos esto sirve cuando gira a la derecha
 if astep<=0 then astep=4 'pero si esta girando a la izq si el paso llega a 1 se va a 4
 if astep=1 then portc=58 ' aqui se manda la secuencia en decimal al puertoc haz la conversion en binario
 if astep=2 then portc=54 ' de cada uno de estos valores y te daras cuenta en que orden los manda...
 if astep=3 then portc=53 ' el 58,54,53,57
 if astep=4 then portc=57
 pause 100 ' se hace una pausa para que no vibre el motor y le de chance de dar el sig. paso

return

MueveH: ' esto es lo mismo que lo anterior pero en 8 pasos
 if astep>=9 then astep=1 ' aqui definimos igual los linites de los pasos en el contador
 if astep<=0 then astep=8 'y aqui
 if astep=1 then portc=17 ' haz la conversion en binario del 17,57, 40...etc y te daras cuenta como es la
 if astep=2 then portc=57' secuencia
 if astep=3 then portc=40
 if astep=4 then portc=58
 if astep=5 then portc=18
 if astep=6 then portc=54
 if astep=7 then portc=46
 if astep=8 then portc=53 
 pause 100 ' hace una pausa en cada paso para que termine de dar el paso si  no nada mas vibra el motor

return

ADC:
 ADCIN 0, SensA ' toma la lectura de la corriente en la resistencia sensa			
 ADCIN 1, SensB	' en la sensb		
 Lcdout $fe,1,"Value A:", DEC sensa," B:",Dec sensb ' el valor lo convierte en decimal DEC  y lo desplega
Return
Se entendio....

FIN....
 
Muchas gracias compañeros, he puesto en práctica lo de los condensadores pero sigo notando el mal comportamiento, lo que me parece extraño es que funcione bien cuando se programe para controlar un solo pin mientras que al tratar de hacerlo con otros, no funciona bien. También puedo darme cuenta del ruido pues coloqué un led en la salida del módulo receptor y éste parpadea con swicheos, bajones de luz, etc sin afectar los pines programados, entonces será investigar más a fondo y estar atento aquí en el foro porque lo que yo pretendía era colocarselo a mi moto para activar una alarma y un bloqueo de la llanta trasera pero... ahora lo veo como peligroso, imaginen una alta velocidad y un bloqueo espontáneo con una tractomula detrás!!!. :unsure:
 
he puesto en práctica lo de los condensadores pero sigo notando el mal comportamiento,
mmm... se pone interesante que pic estas usando???? ya lo mencionaste???

hay algo raro con el cmcon=7

porque lo pusiste????

lo del bloqueo de la llanta si me parece peligroso pero podrias bloquar la corriente o la gasolina o que se yo!!!! y lo mas importante el saber que esta pasando....
 
Última edición:
Hola amigo Lubeck,
Yo siempre utilizo el 16f628a. Francamente no sé a qué se debe el problema, en una ocasión anterior cuando pretendía utilizarlo para mostrar los números de un teclado, el pin a5 que es el mclr, no lo dejaba funcionar bien, nuestro compañero mecatrodatos me dió la mano con eso, por tal motivo es que dudo que sea ruido pero tampoco puedo asertar con la respuesta al problema.

El cmcon para la conversión análogo a digital de portA será lo que está afectando???
A probar enseguida.
 
Última edición:
edite mi mensaje viste lo del cmcon=7

porque lo pones???

no domino muy bien el puertoA pero creo que lo estas poniendo como comparador y debe ser digital....

revisamos eso???? o estas seguro que asi va???
 
Si claro,pero para este pic el cmcon=7 apaga los comparadores y los convierte a digitales, además quité la línea y probé, la falla se sigue manifestando, sigo interesado en el bloqueo para complicarle la vida a los ladrones, si se diera el caso, trabándoles la moto para que no puedan llevarsela apagada.
 
Última edición:
dale un tiempo variable con la entrada de los pulsadores hazle contar los pulsos y eso le haces proporcional al tiempo que vayan cambiando los bits de salida para cada bobina del motor
 
Saludos atricio

... creo que estas hablando del otro caso de los motores.... disculpa si me equivoco...

el problema de viggiani es este https://www.forosdeelectronica.com/posts/342750/
viggiani
y si pruebas cambiarlo de puerto al B o C u otro que no sea el A

dejame verificarlo pero segun yo es con el ADCON1 con lo que se define si es digital...

Viggiani...

Tienes toda la razon es CMCON=7 para ese micro...
descartado eso...

hablas de una transmision de RF, no???
ya descartaste que sea eso verdad.... o sea que no esta conectado cuando se vuelve inestable...
 
Última edición:
Pues no sé si serán los módulos rf los que presenten problema (FSI000A-CDR03A), hasta ahora los veo funcionando bien y como te comenté anteriormente, cuando programo para un solo pin parece funcionar bien por lo que creo que el problema no es tan trivial como parece. Voy a probar con un solo pin durante todo el día a ver si se mantiene y lo estoy comentando aquí nuevamente esta noche, de lo contrario, pues me tocaría desechar la idea del bloqueo con rf y pensarlo con teclado directamente en la moto para mayor seguridad.

Gracias.
 
ahi si que me declaro ignorante no se como debenhacer eso lo que yo he hecho es con los modulos de rf mover a un robot como un control remoto pero solo a un solo canal no en diferentes si alguien si lo sabe seria bueno q lo poste por favor
 
Pues eso si que sería bueno, he probado el mismo código para el pic16f819 y con sorpresa observo el mismo problema, funciona bien para un canal, el otro se apaga en menos de 10 minutos, le dejo esa inquietud a los más expertos porque ya me cansé de darle por un lado y el otro sin buenos resultados, entonces no sé cómo será para implementar el ejemplo que brinda el señor Christian Bodington en su edición gratuita de "Basic para Microcontroladores Pic", específicamente el proyecto N°41 sobre un control de 8 canales, cuya única diferencia está en que utiliza la instrucción toggle (que usé con el mismo resultado) y el pic16f877.
 
Pues yo no soy experto pero yo haria una prueba con esto en el codigo si no funciona casi podria asegurar que el codigo no es... con reserva de la cuestion de definir los osciladores...
Código:
TX-------
Include "modedefs.bas" 
CMCON=7  
[B]TRISA=6[/B]
TRISB=0
BOTON1 var PORTA.1
BOTON2 VAR  PORTA.2
I VAR BYTE ' no se para que la declara
C VAR BYTE ' no se para que la declara
LED1 VAR PORTA.3
LED2 VAR PORTA.4

INICIO: 
if boton1=0 then gosub ACTIVAR_ALARMA 
IF BOTON2=0 THEN GOSUB  OPCION_BLOQUEO
goto INICIO 

ACTIVAR_ALARMA:
serout portb.0,N2400,[$FF,$FF,"OK","C"] 
[B]return[/B]

OPCION_BLOQUEO:
serout portb.0,N2400,[$FF,$FF,"OK","D"]
[B]return[/B]

end

RX------
Include "modedefs.bas"           'para usar serin
CMCON=7
TRISB=%11110011
     
datos var byte 
LED1 var PORTB.2
LED2 VAR PORTB.3 
ENTRADA VAR PORTB.0
X VAR BYTE ' no se para que  define esta variable
 
inicio:
serin ENTRADA,N2400,["OK"],datos 
If datos="C" then gosub ACTIVACION_ALARMA
IF DATOS="D" THEN gosub ACTIVACION_BLOQUEO
[B]Goto Inicio[/B]

ACTIVACION_ALARMA:  
if LED1=0 then 
high led1
else
low led1
endif
[B]return[/B]

ACTIVACION_BLOQUEO:
if LED2=0 then 
high led2
else
low led2
endif
[B]return[/B]
end
tienes algun esquema????
 
Última edición:
hola, buenas quisiera dar un pequeño aporte y ver si me pueden dar sus criticas constructivas al respecto y por supuesto si hay alguna mejora.
se trata de un minutero programable muy parecido al de un microhondas, me lo mandaron como un proyecto de la univ. con compuertas y demas pero quise no enrollarme y hable con el profe y me permitio utilizar un pic siempre y cuando cumpliera el cometido osea programar un tiempo en minutos y que al culminar osea llegar a cero este envie una alarma pues como ven es bien sencillo mas el programita me salio algo largo y me costo ya que a pesar de tener conosiendo al pic mas de un año a penas he logrado utilizar unos 30 comandos del pbp de los mas de 50 que se pueden usar. mas que todo debido a que no he tenido tiempo para ponerme mas de lleno con el pbp. en fin el programa, me gustaria saber si esta bien o se puede mejorar utilizando otras instrucciones...de atemano muchas gracias...
 

Adjuntos

Para Lubeck,
No, no tengo esquema pero es bien básico pues lo único que tengo conectado a las salidas en el receptor son un par de leds, nada más, éste sería el punto de partida para mi pequeño proyecto.

Estoy probando los cambios que sugeriste y creo que funciona efectivamente, parece ser el retorno a inicio lo que afectaba la segunda salida, de cualquier forma mañana lo someto a prueba durante un largo periodo y con mucho ruido.

Por cierto, trisa=6 que significa?

Muchas gracias.
 
Última edición:
Para Lubeck,
No, no tengo esquema pero es bien básico pues lo único que tengo conectado a las salidas en el receptor son un par de leds, nada más, éste sería el punto de partida para mi pequeño proyecto.

Estoy probando los cambios que sugeriste y creo que funciona efectivamente, parece ser el retorno a inicio lo que afectaba la segunda salida, de cualquier forma mañana lo someto a prueba durante un largo periodo y con mucho ruido.

Por cierto, trisa=6 que significa?

Muchas gracias.
eh, saludos compañero sera que podrias darme algunos datos??? si es claro que no los has dado ya por ejemplo:

que modelo de pic estas usando?
que cristal estas usando?
condensadores de cuantos picofaradios estas usando y cuantos para el cristal?

saludos!

HADES:cool:

hola, buenas quisiera dar un pequeño aporte y ver si me pueden dar sus criticas constructivas al respecto y por supuesto si hay alguna mejora.
se trata de un minutero programable muy parecido al de un microhondas, me lo mandaron como un proyecto de la univ. con compuertas y demas pero quise no enrollarme y hable con el profe y me permitio utilizar un pic siempre y cuando cumpliera el cometido osea programar un tiempo en minutos y que al culminar osea llegar a cero este envie una alarma pues como ven es bien sencillo mas el programita me salio algo largo y me costo ya que a pesar de tener conosiendo al pic mas de un año a penas he logrado utilizar unos 30 comandos del pbp de los mas de 50 que se pueden usar. mas que todo debido a que no he tenido tiempo para ponerme mas de lleno con el pbp. en fin el programa, me gustaria saber si esta bien o se puede mejorar utilizando otras instrucciones...de atemano muchas gracias...
Disculpa que lenguaje estas usando pregunto porque decis que usas pbp
entonces???

saludos!

HADES:cool:
 
Última edición:
Saludo amigo Hades,

Utilizo el 16f628a
Cristal de 4Mhz
cerámicos para el cristal de 18pf

Utilizo una fuente variable con lm317 con filtros de 2500 mf que parece funcionar bien y un regulador en el board de 5v con otro pequeño filtro de 470mf y uno de 100nf sobre las entradas del pic.