Curso de programación de PIC en PICBasic Pro

esto es un bosquejo de lo que tendría que hacer para el receptor?

tengo un poco de dudas si con el 'IF', y con los 300 ms del 'COUNT', ese tiempo es que luego debo tener en cuenta para hacer el transmisor?

es decir, en esos 300 ms tengo que hacer que entren los 3 pulsos para que W1=3??


saludos!

Código:
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off


adcon0=0     '  desactiva el ADC
ansel=0 '  digital
cmcon=7'comparador apagado
trisio=0
VRCON=0
INCLUDE "modedefs.bas" 
define OSCCAL_1K 1

entrada var gpio.2
verde var gpio.4
azul  var gpio.5
rojo  var gpio.1
W1 var byte

contar: 
low rojo;
low verde;
low azul;
COUNT entrada, 300, W1

If W1=1 then gosub rutina 1;
if W1=2 then gosub rutina 2;
if w1=3 then gosub rutina 3 ;
else gosub contar ;
endif             ;

rutina 1:
high verde;
return;

rutina 2:
high azul;
return;

rutina 3:
high rojo;
return;
end
 
Como se usaria el comando serin para evitar que quede a la espera y poder seguir por ejemplo sacando una señal pwm sin que se corte? (sin pwm por hard)
 
Intenta asi fernando...
Código:
Inicio:

'Aqui  codigo

serin portb.0,2,1,inicio,B0 ' solo va a esperar 1 milisegundo si no recibe nada se va a inicio...
goto inicio
end
 
Hola lbech el codigo serin como lo estas configurando me ha ayudado mucho en adelantar mi proyecto pero como podria hacer los siguiente:

cuando reciba lo escrito en la pc y lo envie por rs232 el pic lo recosca y me realice una secuencia de efectos con led osea si envio la palabra "Foros" el micro lo recibe y realice el encedido y apagado
correspondiente a esas letras y se mantega el efecto hasta que envie otra palabra
el pic va a tener 26 leds conectados que corresponde a cada letra del abcedario.
por los momentos solo tengo esto y cuando envio la letra "A" funciona bien pero cuando envio por ejemplo "Carro" solo me recibe la "ca" y comienza la secuencia mas no recibe el dato compleato
pd: por lo momentos estoy usando dos led "A yB" y una pantalla para visualizar los datos que estoy recibiendo.
inicio:
SerIn PORTC.7, T2400,1,LETRAS, b1
J:If (b1 < "a") or (b1 > "z") Then LCDOUT, B1:GOTO LETRAS
B1 = B1 - $20
GOTO INICIO

LETRAS:
If b1 = "A" THEN
HIGH PORTB.0
PAUSE 250
LOW PORTB.0
PAUSE 250
ENDIF
GOTO INICIO
End

Gracias de antemano...
 
:cry:

Por favor, alguien me puede ayudar con una comunicacion serial entre 2 PIC12f675, intente con estos codigos, pero no me corren en proteus y ya no se que más cambiar :


emisor

Código:
@ DEVICE pic12F675, intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"
define OSC 4 
define OSCCAL_1K 1

botonA var gpio.1
botonB var gpio.2
botonC var gpio.4

transmitir:
if botonA=0 then envio1
if botonB=0 then envio2
if botonC=0 then envio3
goto transmitir

envio1:
serout gpio.5,N2400,["A"]
pause 500
goto transmitir

envio2:
serout gpio.5,N2400,["B"]
pause 500
goto transmitir

envio3:
serout gpio.5,N2400,["C"]
pause 500
goto transmitir

end

receptor
Código:
@ DEVICE pic12F675,intrc_osc_noclkout, wdt_off, pwrt_on, mclr_off, bod_off, protect_off
INCLUDE "modedefs.bas"

define OSCCAL_1K 1


ledr var gpio.1
leda var gpio.2
ledv var gpio.4
datos var byte

high ledr
pause 500
low ledr

recibir:

serin gpio.0,N2400,1,recibir,datos
if datos="A" then high ledr
pause 1000
if datos="B" then high leda
pause 1000
if datos="C" then high ledv
pause 1000

low ledr:low leda:low ledv
goto recibir
end


Muchas gracias a quien se dé el tiempo, adjunto la simulación.
 

Adjuntos

  • simulacion.rar
    13.6 KB · Visitas: 143
Última edición:
cuando reciba lo escrito en la pc y lo envie por rs232 el pic lo recosca
WILLY...
cuando no se usa la espera de la comunicacion serial, se complica un poco la transmision, es decir tienes que utilizan un algoritmo o método para que el receptor identifique que va haber una trasnmicion... es decir si es por el puerto serie se utiliza la peticion de envio... creo que es el DTX no recuerdo...
 
Hola reyvilla, si estuve leyendo tus post y de lubeck, de hecho probe tus simulaciones en proteus y trate de modificar el mandoCF.pbp, pero me perdí en el intento. :(

Luego me basé en un código que aparece en un libro para un 16f628a, y lo modifique para los 12f675, compila bien pero en la simulación no corre.

Me podrías ayudar un poco con tu código, lo que pasa es que estoy recién empezando y colapso un poco con lo del teclado. :)

(no hay problema en que utilice el Oscilador interno cierto?? )
Gracias!
 
Última edición:
hola lanpu, disculpa la demora he estado algo ocupado, coloca el codigo del programa con los cambios que hicistes he indica donde fue que te perdiste a ver si te ayudo un poco.

y no noy hay problema con el oscilador interno, de echo yo lo monte con ese mismo codigo en el protoboard con los 2 16f628A y el oscilador interno y funciono bien.
 
Hola, reyvilla, estaba leyendo otra vez tu codigo, y trate de sacarle lo que supongo esta demás para mi,y anotaba al costado lo que supongo hace cada sección.

Yo solo necesito 3 o 4 pulsadores. ( si me ayudas, no se como poner la imagen para que se vea, la adjunté)

Dejé una parte de tu código como guia y ahora quiero ver como construyo sobre él.

Código:
@ device pic12f675,intrc_osc,wdt_off,pwrt_off,mclr_off,protect_off 

INCLUDE "modedefs.bas"  
define OSCCAL_1K 1
Define Osc 4
CMCON = 7
ansel=0
vrcon=0
adcon0=0

TRISIO = %00001001 
gpio   = %00000000

ACEPTADO  VAR GPIO.1
LEYENDO   VAR GPIO.2 '
IN        VAR GPIO.0  '
ESPERANDO VAR GPIO.5 
led var GPIO.4
SERIAL    VAR WORD
DATAID    VAR WORD   '


CLEAR
 
' LEYENDO = 0    'en esta parte lee el dato almacenado en la eeprom
' ACEPTADO = 0
' READ 5,serial 
' GPIO.4 = 1       '¿por que haces    esto????
 'SEROUT GPIO.4,T9600,[" CODIGO ACTUAL ",SERIAL,10]   'inicio
 
 
 INICIO:
 LEYENDO = 0         ' aqui espera hasta que llegue algo a gpio.o
 ACEPTADO = 0
 ESPERANDO = 1
 IF IN = 1 THEN
 ESPERANDO = 0
 GOTO LEE
 ENDIF
 
 IF IN = 0 THEN
 GOTO INICIO 
 ENDIF 
 
 GOTO INICIO
 
  
 LEE:                              'una vez que algo llego a gpio.0, lo graba en dataid, anteponiendo '-'
 LEYENDO = 1
 
 SERIN IN,T9600,[" - "],DATAID 'Y ES LA BANDERA, SI Y NO LLEGA SE QUEDA ESPERANDO

 high led 
 pause 500
 low led
 'SEROUT GPIO.4,T9600,[" CODIGO LEIDO ",DATAID,10]    'saca lo leido por gpio.4
 LEYENDO = 0
 if dataid="1" then high led  ' por ejemplo que encienda un led cuando dataid= 'algo'
  low led
 goto inicio
 end

Saludos.
 

Adjuntos

  • 1.jpeg
    1.jpeg
    38.8 KB · Visitas: 79
fijate algo "triosio" es para definir cual va ser entrada y cual va hacer salida si esto no esta bien definico pues ni modo cuando presiones el boton este va quedar siempre en 0 o en 1. ahora estuve analizando un poco tu circuito con el programa proteus y un programa de prueba y el 12f675 tiene una serie de comparadores y A/D. que no se si necesites, pero el codigo que hice lo probe con el 12f629 y el 12f675 y me fue mejor con el 12f629 ya que el 12f675 tiende a no sensar, no se si se debe a los a/d o los comparadores, aun no lo descubro estoy leyendo el datahseet a ver si aparece algo. si te sirve con el 12f675 me avisas. y si no tambien saludosss.

edito: ya vi la razon por el cual no sensa colocale debajo del cmcon = 7 el ANSEL=0 y listo.
 
Última edición:
si me funciono le hice unos pequeños cambios rapidos para hacerlo mas facil, revisa y adaptalo a lo que requieras...saludossss
 

Adjuntos

  • simulacion.rar
    52.7 KB · Visitas: 192
;382753 dijo:
mira este...
Código:
@ DEVICE pic16F87
@ DEVICE INTRC_OSC_NOCLKOUT ' Opción del Osc Interno
@ DEVICE WDT_Off ' Watchdog Timer ON
@ DEVICE PWRT_Off ' Power-On Timer
@ DEVICE BOD_Off
@ DEVICE MCLR_OFF ' Master Clear Opción interno
@ DEVICE LVP_OFF ' Bajo voltaje de programación
@ DEVICE CPD_OFF ' Protección del código de memoria OFF
@ DEVICE PROTECT_OFF' protección de código OFF
Define Osc 4
CMCON = 7 'HACE QUE SE TRABAJE CON LAS ENTRADAS EN DIGITAL
TrisA=1 
trisB=0
 
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
 
pulsador var porta.0
contador var byte
 
clear
PortB=0
 
inicio:
if pulsador then
 pause 200
 contador = contador+1
 if contador >=8 then contador =0
endif
select case contador
 case 0 
  led1=1: pause 200
  Led1=0 : pause 200
  LED1=1 : PAUSE 200
  LED1=0
 case 1
  led2=1 : pause 200
  Led2=0 : Pause 200
  LED2=1 : PAUSE 200
  LED2=0 
 case 2
  led3=1 : pause 200
  Led3=0 : Pause 200
  LED3=1 : PAUSE 200
  LED3=0 
 case 3
  led4=1 : pause 200
  Led4=0 : Pause 200
  LED4=1 : PAUSE 200
  LED4=0 
 case 4
  led5=1 : pause 200
  Led5=0 : Pause 200
  LED5=1 : PAUSE 200
  LED5=0 
 case 5
  led6=1 : pause 200
  Led6=0 : Pause 200
  LED6=1 : PAUSE 200
  LED6=0 
 case 6
  led7=1 : pause 200
  Led7=0 : Pause 200
  LED7=1 : PAUSE 200
  LED7=0 
 case 7
  led8=1 : pause 200
  Led8=0 : Pause 200
  LED8=1 : PAUSE 200
  LED8=0 
end select
goto inicio
end
por motivos del temporizador (pause) que usas se debe mantener un momento el boton pulsado hasta que haga el cambio de la secuiencia...

lubeck yo tambien estoy tratando de hacer algo similar, pero a mi me salta de rutina a rutina sin oprimir nada.
Este es el codigo.

CMCON = %00001111
TRISA = %11111111 'todos los pines como entradas
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
contador var byte
clear

inicio:
if pulsador then : pause 300
contador = contador+1
if contador >=5 then contador =0
select case contador
case 0


PORTB = %00000001
pauseUS 1500
PORTB = %00000000
pauseUS 1500
case 1


PORTB = %00000010
pause 1500
PORTB = %00000000
pause 1500

case 2



PORTB = %00000100
pause 1500
PORTB = %00000000
pause 1500
case 3


PORTB = %00001000 ;
pause 1500
portb = %00000000
pause 1500


end select
goto inicio
end

La instruccion ENDIF me tira error al compilar, por eso la borre, sera ese el problema?Gracias.
 
prueba asi, no lo revise, pero creo que es esto...
Código:
CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
contador var byte
clear

inicio:
[B]if pulsador then
 pause 300 
 contador = contador+1
endif[/B]
if contador >=5 then contador =0
select case contador
case 0 


PORTB = %00000001 
pauseUS 1500
PORTB = %00000000 
pauseUS 1500
case 1


PORTB = %00000010
pause 1500
PORTB = %00000000
pause 1500

case 2



PORTB = %00000100
pause 1500
PORTB = %00000000
pause 1500
case 3


PORTB = %00001000  
pause 1500
portb = %00000000
pause 1500 


end select
goto inicio
end
 
CMCON = %00001111
TRISA = %11111111 'todos los pines como entradas
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
boton var porta.6 'puerto del boton
contador var byte
star var bit
High star
pause 500

inicio:
stope:
portb = %00000000
if boton then toggle star:pause 300
if star then goto stope

if pulsador then
pause 300
contador = contador+1
endif
if contador >=3 then contador =0
select case contador

case 0

case 1

case 3

end select
goto inicio
END

Ahora funcina, agregue un boton de start/stop que funciona bien, pero no me incrementa la variable contador cuando esta en stop, lo puedo acomodar facilmente?si no lo dejo asi. Muchas gracias por tu ayuda.
 
intenta asi...

Código:
CMCON = %00001111 
TRISA = %11111111 'todos los pines como entradas 
TRISB = %00000000 'todos los pines como salidas
portb = %00000000
pulsador var porta.0
boton var porta.6 'puerto del boton
contador var byte
star var bit
High star
pause 500

inicio:
stope:
portb = %00000000
if boton then toggle star:pause 300

if pulsador then 
pause 300 
contador = contador+1
endif
if contador >=3 then contador =0
[B]if star then goto stope[/B]

select case contador
case 0 
case 1
case 3
end select
goto inicio
END
 
Última edición:
Otra vez yo, ya programe los dos 12f675 con comunicación serial (básica) y arme los circuitos en el protoboard, funcionó todo bien.

Me gustaría si aclarar unas dudas del codigo si es posible:


SEROUT GPIO.4,N2400,["-","A",10]
GPIO.4 = 0

.... leía en el manual pbp y dice que el '10' corresponde a un 'linefeed'...¿qué significa? ¿que diferencia tiene un linefeed de 10 ó 100?

si estableciera T2400, debería entonces poner luego GPIO.4=1 ???

Saludos!


 
Gracias Lubeck, parece que funciona.

Ahora para migrar a un 16f886, porque quiero agregarle un lcd para ver en que secuencia esta, que tengo que cambiar?Porque hice una prueba pero no cambia el "case". El start/stop si funciona.
El lcd la conecto al puerto c y funciona:

Define LCD_DREG PORTc '*bit de datos del LCD
Define lCD_DBIT 0 '*por B.0 ,B.1, B.2 y B.3
Define LCD_RSREG PORTc '*bit de registro del LCD conectar
Define LCD_RSBIT 5 '*en el puerto B.5
Define LCD_EREG PORTc '*bit de Enable conectar en el
Define LCD_EBIT 4 '*puerto B.4

Gracias.
 
Última edición:
Atrás
Arriba