desktop

Curso de programación de PIC en PICBasic Pro

Oh... es correcto, la información es muy clara,sinembargo ahora pasaré a trucar los servos para que los giros sean completos tal como lo detalla el documento. Sigo atento a cualquier sugerencia respecto a los módulos rf y el código descrito anteriormente que espero poder hacer funcionar algún día.

Gracias por la info.
 
Última edición:
Cordial saludo amigo carlos jara por supuesto que estamos prestos a colaborar , anexo documento realizado por mi , donde se explica como utilizar el contador(S) y temporizador(S) del pic 16f877A , en esta parte se especifica las configuraciones de los registro y ejemplos para calcular el TMRO como contador y temporizador, esta en formato de documento agradecería a un miembro del foro lo convirtiera a PDF.

comentar es agradecer
 

Adjuntos

  • TEMPORIZADORES Y CONTADORES.rar
    502.9 KB · Visitas: 654
Última edición:
Buenas Noches amigos y amigas de foros electronica, soy nuevo en esta area y quisiera saber si me pueden ayudar con una transmision de modulos RF para comunicar dos pic 16f877a, en el proyecto que quiero haces es transmitir codigo morse, en primera instancia quisiera transmitir una palabra para que sea mostrada por una LCD de 16x2, si aguna persona pe pudiare ayudar se lo agradeceria...! yo tengo el codigo morse ya hecho en microc pero no se cono hacer para transmitirlo...!

el codigo es:
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;

#define t_punto 120
//#define t_raya 3 * t_punto
//#define t_sep t_punto
//#define t_sep_letras 3 * t_punto
//#define t_sep_palabra 5 * t_punto

void main() {
unsigned char i, p, n, fin_letra;

TRISC = 0x01;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 3, "Codigo MORSE");

i = 1;
while(1)
{
p = 0;
n = 0;
if(PORTC.B0==0)
{
Delay_ms(t_punto/2);
if(PORTC.B0==0)
{
fin_letra = 0;
do
{
Delay_ms(t_punto);
p = p << 1;
n++;
if(PORTC.B0==0) // raya
{
p++;
Delay_ms(2 * t_punto);
}
Delay_ms(t_punto);
if(PORTC.B0==1) // Termino letra
{
if(n==1)
{
switch (p)
{
case 0: Lcd_Out(2,i,"E");
break;
case 1: Lcd_Out(2,i,"T");
break;
}
}
if(n==2)
{
switch (p)
{
case 0: Lcd_Out(2,i,"I");
break;
case 1: Lcd_Out(2,i,"A");
break;
case 2: Lcd_Out(2,i,"N");
break;
case 3: Lcd_Out(2,i,"M");
break;
}
}
if(n==3)
{
switch (p)
{
case 0: Lcd_Out(2,i,"S");
break;
case 1: Lcd_Out(2,i,"U");
break;
case 2: Lcd_Out(2,i,"R");
break;
case 3: Lcd_Out(2,i,"W");
break;
case 4: Lcd_Out(2,i,"D");
break;
case 5: Lcd_Out(2,i,"K");
break;
case 6: Lcd_Out(2,i,"G");
break;
case 7: Lcd_Out(2,i,"O");
break;
}
}
if(n==4)
{
switch (p)
{
case 0: Lcd_Out(2,i,"H");
break;
case 1: Lcd_Out(2,i,"V");
break;
case 2: Lcd_Out(2,i,"F");
break;
case 3: Lcd_Out(2,i,"x");
break;
case 4: Lcd_Out(2,i,"L");
break;
case 5: Lcd_Out(2,i,"x");
break;
case 6: Lcd_Out(2,i,"P");
break;
case 7: Lcd_Out(2,i,"J");
break;
case 8: Lcd_Out(2,i,"B");
break;
case 9: Lcd_Out(2,i,"X");
break;
case 10: Lcd_Out(2,i,"C");
break;
case 11: Lcd_Out(2,i,"Y");
break;
case 12: Lcd_Out(2,i,"Z");
break;
case 13: Lcd_Out(2,i,"Q");
break;
case 14: Lcd_Out(2,i,"x");
break;
case 15: Lcd_Out(2,i,"no existe");
break;
}
}
i++;
fin_letra = 1;
}
} while(fin_letra==0);
Delay_ms(2 * t_punto);
if(PORTC.B0==1) // Termino palabra
{
Lcd_Out(2,i," ");
Delay_ms(2 * t_punto);
}

Delay_ms(500);
if(i>15)
{
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, "Codigo Morse");
i = 1;
}
else
i++;

} }
}
}
 
Saludos,

Agradecería una mano con el siguiente problema, quiero hacer un swiche con módulos rf, he implementado un código que aparentemente funciona, lo que sucede es que al agregar el antirrebote por sofware este deja de funcionar o lo hace mal, lo mismo sucede con antirrebote por hardware. Publico el código para cualquier aclaración.
Código:
'CODIGO PARA tx

 
 CMCON=7  

Include "modedefs.bas" 
BOTON1 var porta.2
TRISB=1

INICIO:
 PAUSE 10
 if boton1=0 then gosub LED_VERDE  
goto INICIO
 
LED_VERDE:
 serout portb.0,T9600,[$FF,$FF,"OK","C"] 
 goto inicio 

end
----
rx

Include "modedefs.bas"           'para usar serin
 CMCON=7
 TRISB=1
PAUSE 500      
datos var byte 
LED var porta.0 
ENTRADA VAR PORTB.0
LED=1

INICIO:
serin ENTRADA,T9600,["OK"],datos 
If datos="C" then TOGGLE LED
goto INICIO
end
 
Hola que, Necesito una ayudadita en esto.
Necesito controlar la velocidad de un motor a pasos unipolar, estoy usando el UL2003, el motor es de 6 hilos, no c si usar 4 pulsadores o solo 1, ah tambien debo hacerlo reversible.
Alguna idea de como implementarlo??? soy nuevo en esto.
salu2
 
Hola lubeck que tal!!!
oie solo tengo una duda...
El ejemplo que me pasaste que controla???
Veo un LCD es para ver las revoluciones por minuto??? o algo parecido.

Lo que me gustaria implementar es el control de el del motor pap, es dcir si pulso un boton que gire no c 90° y si pulso otro que gire 135° algo por estilo.

Lo he estado intentando pero no me sale ademas de que no conosco bien el funcionamiento del ULN2003.

Intente encender un led con un pulsador cuando mande un cero, pero me tope con eso del "sin antirebote" y "con antirebote" se la diferecia entre ambos pero no logro prender el led cuando lo hago "con atirebote", otra duda es, tiene esto algo que ver o en algo me afectara al hacer el programa para mi motor pap??
Por cierto mi Proteus no pudo abrir el archivo adjunto
salu2
 
Última edición:
Hola que tal!!!

oie solo tengo una duda...
no nada mas es una son mas :LOL:

El ejemplo que me pasaste que controla???
Motores paso a paso unipolares y bipolares
unipolar 6cables y bipolar 4 cables

Veo un LCD es para ver las revoluciones por minuto??? o algo parecido.
no recuerdo que muestra pero no son las revoluciones por minuto... podrias quitar esa parte del ejemplo

Lo que me gustaria implementar es el control de el del motor pap, es dcir si pulso un boton que gire no c 90° y si pulso otro que gire 135° algo por estilo.
te convendria mas un servomotor, los motores a pasos son eso dan paso por paso y debes contar el numero de pasos para llegar a los grados que requieres dando un numero de pulsos en secuencia...

Lo he estado intentando pero no me sale ademas de que no conosco bien el funcionamiento del ULN2003
.
el ULN es solo una etapa de potencia es decir los micros no dan suficiente amperaje para que se mueva un motor y el uln es el que le ayuda en el trabajo...

Intente encender un led con un pulsador cuando mande un cero, pero me tope con eso del "sin antirebote" y "con antirebote" se la diferecia entre ambos pero no logro prender el led cuando lo hago "con atirebote", otra duda es, tiene esto algo que ver o en algo me afectara al hacer el programa para mi motor pap??
el anti rebote no es mas que dar una pausa despues de presionar un boton para que no se repita mas de una vez o hay otro metodo sin pause con el mismo efecto...

salu2
 
Última edición:
jeje disculpa por las multiples dudas!!!
pero aun tengo demasiadas...
Estoy equivocado en cuanto a el control del motor pap quiza no soy muy bueno explicandome jejej lo que quiero hacer es que con pulsos varie la velocidad del motor o el numero de pasos dados.
Tengo una idea de como, corrigeme si estoy mal de favor
El motor pap que utilizo tiene 6 hilos, 2 son comunes y los otros 4 pertencen a las bobinas, si mando voltaje a una bobina da ciertos pasos, si le mando voltaje a otra bobina camina otros ciertos pasos.
Lo que tengo que controlar es eso. jejeje no soy muy bueno en esto apenas empiezo.

se que se hace con if..then ( lo de antirrebote afecta esto?)

espero ahora si haberme eplicado bien

Por cierto aqui un video de lo que quiero hacer
salu2
 
jeje disculpa por las multiples dudas!!!
no te preocupes era solo una broma...

pero aun tengo demasiadas...
Disipalas mira aqui hay un totorial que explica exactamente el funcionamiento de un PAP...
http://www.todorobot.com.ar/informacion/tutorial stepper/stepper-tutorial.htm

Estoy equivocado en cuanto a el control del motor pap quiza no soy muy bueno explicandome jejej lo que quiero hacer es que con pulsos varie la velocidad del motor o el numero de pasos dados.
si se varia la velocidad segun la rapidez con que hagas la secuencia de los pasos...

Tengo una idea de como, corrigeme si estoy mal de favor
El motor pap que utilizo tiene 6 hilos, 2 son comunes y los otros 4 pertencen a las bobinas, si mando voltaje a una bobina da ciertos pasos, si le mando voltaje a otra bobina camina otros ciertos pasos.
Lo que tengo que controlar es eso. jejeje no soy muy bueno en esto apenas empiezo.

mas o menos... lo que tienes que hacer es energizar bobina por bobina que son por ejemplo 4 empizas energizando una y luego la que sigue y la que sigue y asi das los pasos, en el concepto de los cables reviza eel tutorial...

se que se hace con if..then ( lo de antirrebote afecta esto?)

no entiendo a que te refieres con eso del antirrebote pero creo que esta confundiendo terminos...

espero ahora si haberme eplicado bien
si te entendi perfectamente desde el principio pero reviza a fondo el ejemplo y el tutorial que te puse y te quedara mas claro...

en el ejemplo el L298 hace lo mismo que el ULN2803 o los Transistores del video solo dan potencia al motor con una fuente de poder independiente a la del uC(microcontrolador)


saludos...
 
Muchas gracias Lubek, ya tengo mas claras mis ideas de como hechar a andar esto, espero hacer programa en el trascurso de la semana, aun me falta investigar algunas cosas, por lo mientras a pensar como se va a montar!!! Gracias de nuevo y por aqui andare de nuevo con mas dudas jeje, si no es mucha molestia!!!
salu2
 
Saludos nuevamente,

Me gustaría implementar un control por rf de varios canales, he programado para dos que aparentemente funcionan, sinembargo, cuando pasa un tiempo menor a una hora, el segundo puerto que programo cambia de estado sin motivo alguno, me gustaría tener la opinión de algun colaborador si es posible, a continuación publico el código del transmisor y receptor.
Código:
TX-------
CMCON=7  
Include "modedefs.bas" 
BOTON1 var PORTA.1
BOTON2 VAR  PORTA.2
I VAR BYTE
C VAR BYTE
LED1 VAR PORTA.3
LED2 VAR PORTA.4
TRISB=0


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"] 
goto INICIO 

OPCION_BLOQUEO:
serout portb.0,N2400,[$FF,$FF,"OK","D"]
GOTO INICIO

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
 
inicio:
serin ENTRADA,N2400,["OK"],datos 
If datos="C" then ACTIVACION_ALARMA
IF DATOS="D" THEN ACTIVACION_BLOQUEO

ACTIVACION_ALARMA:  
if LED1=0 then 
high led1
else
low led1
endif
goto INICIO

ACTIVACION_BLOQUEO:
if LED2=0 then 
high led2
else
low led2
endif
goto INICIO
end
 
cuando pasa un tiempo menor a una hora, el segundo puerto que programo cambia de estado sin motivo alguno,

Puede ser que tu programación este bien.... haz esta prueba conecta una licuadora o similar en la misma toma de tu circuito y prendelo varias veces si cambia si razon puede ser algo que se llama no se que EMI si no encuentras informacion con ese dato postea... en el foro hay un post de Fogonazo que lo menciona en un caso similar al tuyo...

puede ser que poniendo unos capacitores en la alimentacion del micro se resuelva...

saludos...
 
Puede ser que tu programación este bien.... haz esta prueba conecta una licuadora o similar en la misma toma de tu circuito y prendelo varias veces si cambia si razon puede ser algo que se llama no se que EMI si no encuentras informacion con ese dato postea... en el foro hay un post de Fogonazo que lo menciona en un caso similar al tuyo...

puede ser que poniendo unos capacitores en la alimentacion del micro se resuelva...

saludos...

eh lubeck? lo que le estas intentando decir al compañero es que debido al tipo de fuente que tiene le entra "ruido electrico" al pic y eso deriva en que le da inestabilidad y una actuacion aleatoria al pic? es eso? y de ser asi generalmente se colocan en la alimentacion un condensador electrolitico de 470uF y otro de 100nF saludos!
 
eh lubeck? lo que le estas intentando decir al compañero es que debido al tipo de fuente que tiene le entra "ruido electrico" al pic y eso deriva en que le da inestabilidad y una actuacion aleatoria al pic? es eso? y de ser asi generalmente se colocan en la alimentacion un condensador electrolitico de 470uF y otro de 100nF

si mas o menos... pero en el caso que menciono no se resolvió poniéndole los condensadores... no recuerdo... pero a otro compañero si le funciono... entonces yo diria que intentara poner los condensadores como indicas.... incluso lo mas cerca del uC... el de 100nf
 
si mas o menos... pero en el caso que menciono no se resolvió poniéndole los condensadores... no recuerdo... pero a otro compañero si le funciono... entonces yo diria que intentara poner los condensadores como indicas....

si! otra es que el compañero verifique bien como conecto los condensadores que van en el cristal del pic!! podria ser eso tambien!!
 
TrisB=255
TrisC=0
Portc=%110000

SensA var word
SensB var word
AStep Var word

ADCON1 = %10000010
astep=0
Pause 500

Inicio:
if portb.0=1 then
if portb.1=0 then astep=Astep+1
if portb.1=1 then
if astep<>0 then astep=Astep-1
endif
endif

Goto inicio
End

MueveF:
if astep>=5 then astep=1
if astep<=0 then astep=4
if astep=1 then portc=58
if astep=2 then portc=54
if astep=3 then portc=53
if astep=4 then portc=57
pause 10

return

MueveH:
if astep>=9 then astep=1
if astep<=0 then astep=8
if astep=1 then portc=17
if astep=2 then portc=57
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 10

return

Hola que tal lubeck ya estuve checando y viendo el programa del control del motro pap pero hay cosas que no comprendo del todo, codigos que desconosco su función, si me puedieras hechar la mano de favor.

-Por que se utiliza trisb=255???
-Me podrias explicar la Subrutina "Mueve F" y "Mueve H" me refiero a porque el If y porque los signos aritmeticos con condiciones?
- La variable "AStep" cual es su función?
- La subrutina "ADC"
- "Sens A" y "Sensb" por que estas variables, cual es su función, como las conecto al ULN2??

salu2
 
-Por que se utiliza trisb=255???
Trisb es para definir un puerto en sus ocho bits como entrada o salida
si convirtiéramos el 255 o binario seria 11111111
entonces si con 0 se define que sea de salida y 1 que sean como entrada
deducimos que con
trisb=255 le estamos diciendo al uC que los ocho bits o puertos van a ser de entrada...
y seria lo mismo que trisb=%11111111

-Me podrias explicar la Subrutina "Mueve F" y "Mueve H" me refiero a porque el If y porque los signos aritmeticos con condiciones?
la rutina F es para hacer un paso completo(full) y la H es para hacer un medio Paso(half) si revisas bien el tutorial te fijaras que existen esas dos maneras de hacer los pasos incluso hay otra que son lo micropasos
los if then es para energizar las bobinas... jejej no recuerdo como le hice dejame repasarlo...

- La variable "AStep" cual es su función?
la variable astep guarda el paso anterior y tener como referencia este para incrementar el siguiente paso... y si el paso tremina el ciclo de las bobinas se reinicializa...

- La subrutina "ADC"
- "Sens A" y "Sensb" por que estas variables, cual es su función, como las conecto al ULN2??
ya me acorde para que es el display... :LOL:
la subrutina ADC que no la veo en el codigo que pusiste sirve segun recuerdo para mostrar el consumo de los motores en los puertos de conversión Analogico Digital y en sensA y SensB llega la corriente....
estos los puedes quitar junto con el lcd , el codigo y las resistencias....
basicamente dejar el codigo como lo pusiste... tambien quitas el ADCON1 que es algo similar al TRIS pero generalmente se usa para el puertoA...
 
Lubeck ya estuve diseñando mi programa pero es muy rustico, ya entiendo varias cosas que hace rato no entendia, pero aun me quedan dudas.

Inicio:
if portb.0=1 then
if portb.1=0 then astep=Astep+1
if portb.1=1 then
if astep<>0 then astep=Astep-1
endif
if portb.2=0 then gosub mueveh
if portb.2=1 then gosub muevef
if portb.3=0 then Lcdout $fe,1,"Value A:", DEC astep
endif
if portb.3=1 then gosub adc
Goto inicio
End

En tus if, el primero de todos se supone que es como un paro y arranque, no??? si este es verdadero ejecuta todo lo demás pero si es falso los demás no hacen nada, mi duda es. el primer if no tiene una instruccion en si para mover el motor y en la simulacion cuando lo activas el motor tiene un movimiento como es esto?

-if portb.3=0 then Lcdout $fe,1,"Value A:", DEC astep
En ese If mandas una intruccion al LCD, que relación tiene que cuando lo pulsas afecta el movimiento del motor ?? Digiste que la subrutina ADC no la pelara porque va relacionado al display, que relacion tiene que cuando aprieto el tercer pulsador afecta el movimiento del motor si cuando condicionas el portb.3 no hay ninguna instruccion que se mande al motor??? o bueno al menos yo no la veo; La instruccion "DEC" que función tiene?? pq esta relacionada con la variable AStep.

Lo de las subrutinas Mueve F y H no las entiendo del todo.

Gracias por tu ayuda y tu tiempo.
salu2
 
Atrás
Arriba