desktop

Curso de programación de PIC en PICBasic Pro

.... 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?

la diferencia es que al linefeed le corresponde ese codigo ascii (el 10), esos codigos se manejan desde los inicios de la computación, y son internacionales, el codigo ascii del 100 puede ser la "A" o la "B", busca en el google dicha tabla ascii, ahora porque el linefeed(ascii 10)???... porque ese se les ocurrio poner cuando diseñaron el compilador bien pudieron poner cualquiera de los 255 ascii...

si estableciera T2400, debería entonces poner luego GPIO.4=1 ???
mira esta tabla de como hicieron el serin....
la diferencia entre el T2400 y el N2400 es la polaridad, es decir, con el T2400 va a mandar estados altos y con el N2400 estados bajos a una velocidad de 2400 baudios...
ahora esto esta mal...

Código:
SEROUT GPIO.4,N2400,["-","A",10]
GPIO.4 = 0

si quieres invertir la polaridad deberia ser asi...
Código:
T2400=0
T1200=1
T600=2
T300=3
N2400=4
N1200=5
N600=6
N300=7
' y seleccionan la variable que quieras y la pones en el serout
SEROUT GPIO.4,N2400,["-","A",10]
'o se puede poner asi...
SEROUT GPIO.4,4,["-","A",10]

GPIO.4 =0  ' GPIO.4 nada tiene que ver con eso de la velocidad
 
Última edición:
Hola lubeck, gracias por responder

mira esta tabla de como hicieron el serin....
la diferencia entre el T2400 y el N2400 es la polaridad, es decir, con el T2400 va a mandar estados altos y con el N2400 estados bajos a una velocidad de 2400 baudios...
ahora esto esta mal...

Código:
SEROUT GPIO.4,N2400,["-","A",10]
GPIO.4 = 0
si quieres invertir la polaridad deberia ser asi...
Código:
T2400=0
T1200=1
T600=2
T300=3
N2400=4
N1200=5
N600=6
N300=7
' y seleccionan la variable que quieras y la pones en el serout
SEROUT GPIO.4,N2400,["-","A",10]
'o se puede poner asi...
SEROUT GPIO.4,4,["-","A",10]

GPIO.4 =0  ' GPIO.4 nada tiene que ver con eso de la velocidad

Sí, entiendo lo del cambio de polaridad con el 'N' y 'T', sólo quería aclarar la línea 'GPIO.4 =0 ' en el código que me facilitó 'reyvilla', yo pensaba que era algo asi como asegurarse de que el pin 4 deje de transmitir.

Ahora, paralelamente, he intentado establecer la misma conexión serial entre estos PIC (que funciona en cable), pero esta vez con LEDs infrarrojos, pero al parecer los pulsos que salen del pin emisor, si bien hace que el led parpadeé (lo veo con una camara), al parecer son demasiado rapidos y el receptor no los alcanza a 'seguir'....alguién tiene experiencia en esto?...debo:

'alargar' los mensajes?....
cambiar de emisor - receptor. (IR LED)
modificar el codigo?


Saludos y gracias.
 
hola de nuevo lanpu me uno, a tu aclaratoria estube leyendo por alli, analizando, investigando y despues de tantas vueltas para poder enviar una señal serial por infrarojo necesitas modularla y otra cosa que lei por alli es que no puede ser mayor a 2400 ya que la señal se desvanece despues de alli. eso como para tomarlo en consideracion a la hora de desidirce hacerlo por infrarojo yo opte por RF mas rapido y te ahorras muchas lineas de codigo de programa. si consigues hacerlo buenisimo compartelo...saludoss
 
Que tal reyvilla, tu intentaste hacerlo con led infrarrojo y fotodiodo 'normal'?...o con esos receptores que usan los televisores. equipos de musica..etc

Como para ver por donde irme...

Lo otro sería contar directamente con un control remoto 'x' como emisor y construir solo un receptor con el pic.
 
modificar el codigo?

mmm.... yo te recomendaria que lo hiceras por frecuencias o tonos o DMTF, por lo que comentas si es muy
rapido el serial.... yo no lo he intentado por ninguna de las formas, es decir si he usado el DMTF pero no por infrarrojos hasta donde se todos los mandos(Controles Infrarojos) utilizan ese metodo..
por algo sera!
 
yo use un receptor TSOP1137, TSOP2236 creo que es de tv lo compre, y otra cosa tienes que saber a que corriente vas a poner a trabajar el emisor? eso con el datasheet para que los datos sean leibles.
si es con un control remoto de tv como emisor tienes que decodificar las señales primero.
 
hola esta factible el proyecto con esto lograrias el receptor por puerto serial del pc y abria que ver si se pueden utilizar los codigos resibidos para programar un pic en funcion a esos codigos. si puedes baja todo lo que puedas de alli por lo que veo tienes que estar registrado.

Edito: entre todo lo que busque encontre bastante revisa los siguientes link y me avisas.

http://libertadelectronica.wordpres...dificando-el-infrarrojo-capturando-la-accion/

http://www.rentron.com/

y hay mas luego los coloco.
 
Última edición:
Lo más parecido a lo que busco, de hecho usa un pic12f, lo malo, para mí es que esta en .asm y yo no me manejo.

Si es que alguien sabe y puede ayudar a pasarlo a pic basic, se lo agradecería.

Saludos!!
 

Adjuntos

  • 3ch_remote.zip
    4.1 KB · Visitas: 146
  • rx.gif
    rx.gif
    35.8 KB · Visitas: 92
  • tx.gif
    tx.gif
    65.2 KB · Visitas: 104
lanpu no es por desmotivarte pero en este foro ni en ninguno creo que vayas a lograr hacerlo desifrando ese programa, ya que de por si es fastidioso leerlo, enterderlo y analizarlo daria dolor de cabeza por lo menos a mi, a parte de que si entiendes el funcionamiento del sistema es mucho mas factible que tu generes un codigo propio con ayuda de todos que a esperar que alguien se ponga a desifrar y traducir de asm a pbp, te recomiendo leas un poco de como son las trasmiciones del los codigos rc5 que es un protocolo y despues de que lo comprendas y veas de que se trata entonces empiezas a ver como generar un codigo para ese protocolo...saludosss

edito: te recomiendo empieces por aqui:

https://www.forosdeelectronica.com/f24/protocolo-rc5-pic-ahora-funciona-10966/
 
Última edición:
Hola a todos, gracias reyvilla por el material, he recopilado bastante, ahora a hacerse el tiempo y a leer nomas.

Si alguien tiene un tiempito me ayuda un poco con este trocito de código, quiero contar el tiempo que el pulsador esta presionado, y si es mas de 5 seg que se encienda un led.

________ EDIT: tenía un error en la configuración del OSC en proteus____(gracias igual)

Es la simplicación de un proyecto más grande, que consiste en contar el tiempo que ciertos sensores infrarrojos estan tapados.



Código:
@ DEVICE pic16F628A
@ 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


Cnt VAR Word ' Cnt is a word variable
LED VAR PORTB.0
led2 var PORTB.2
IN VAR PORTB.1
PORTB=0
TRISB=%00000010
CMCON = 7

Cnt = 0

AGAIN:
IF Cnt>5 then led2=1
LED=1
IF IN =1 THEN CUENTA 
GOTO AGAIN

CUENTA:
LED=0
pause 1000
Cnt = Cnt +1 
IF IN=0 THEN AGAIN
GOTO CUENTA
END
Saludos y Gracias!
 

Adjuntos

  • 123.JPG
    123.JPG
    19.4 KB · Visitas: 81
Última edición:
Saludos nuevamente,

Disculpen si les interrumpo el hilo que vienen siguiendo pero tengo una inquietud que solo en este espacio sé que podré disipar, aquí siempre ayudan sin condicionamientos. Mi pregunta consiste en cómo invocar el estado de espera de un micro, será que se puede hacer por código? no estoy seguro pero creo haber visto algo aunque creo era en assembler y prefiero el basic mil veces.

Gracias Mil.
 
Si, exacto. Es que me gustaría que después de un determinado tiempo sin actividad de sensor, pulsador, swiche, etc, el micro pase a un mensaje específico en un lcd hasta que halla actividad.
 
@ DEVICE pic16F628A
@ 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


Cnt VAR Word ' Cnt is a word variable
LED VAR PORTB.0
led2 var PORTB.2
IN VAR PORTB.1
PORTB=0
TRISB=%00000010
CMCON = 7

Cnt = 0

AGAIN:
IF Cnt>5 then led2=1
LED=1
IF IN =1 THEN CUENTA 'aqui no seria mejor ponerlo a contar de una vez?
GOTO AGAIN

EJEMPLO :
IF IN = 1 THEN
LED = 0
Cnt= Cnt + 1
PAUSE 1000
CALL AGAIN 'Verifica que no sea mayor a 5. que como hay una pause de
'1000 aproximadamente serian 5 segundos y algo mas
GOTO EJEMPLO ' si no es mayor a 5 se queda contando.
GOTO AGAIN


y luego seria cuando es
IN = 0 THEN
GOTO AGAIN
END IF

ok, aqui te coloco el manual de pbp en español, con control F busca lo que necesites, es tu caso el comando sleep, y alli te aparece como usarlo y el tiempo maximo...saludos
 

Adjuntos

  • pic_basic_manual_sp.pdf
    450.7 KB · Visitas: 220
Última edición:
Cnt= Cnt + 1
PAUSE 1000
CALL AGAIN 'Verifica que no sea mayor a 5. que como hay una pause de
'1000 aproximadamente serian 5 segundos y algo mas....

En verdad contando segundos de esta forma se pierde exactitud, por lo que sería mejor incorporar el conómetro que puso mecatrodatos en las primeras páginas de este hilo, https://www.forosdeelectronica.com/f24/curso-programacion-pic-bsic-pro-20658/index2.html,
modificando un poco ese código :

EDIT: Actualicé las modificaciones al código

Código:
; CONFIGURACION PARA LA PROGRAMACION DEL PIC   
@ device xt_osc ; oscilador externo XT 
define osc 4 ; especifica que se va a utilizar uno de 4 Mhz 

' Define registros y bits del LCD

Define    LCD_DREG    PORTB
Define    LCD_DBIT    0
Define    LCD_RSREG    PORTB
Define    LCD_RSBIT    4
Define    LCD_EREG    PORTB
Define    LCD_EBIT    5

;variables de pines conctados al pic 16f84A

Symbol START_button = PORTA.0           
Symbol CLEAR_button = PORTA.2           
Symbol STOP_button = PORTA.1             
Symbol LED = PORTA.3 
SYMBOL SEN1 = PORTB.6 'PUERTO SENSOR1
SYMBOL LED2= PORTA.4'LED CUENTA

;variables de almacenamiento  de datos
Q VAR BIT
CNT VAR WORD           
Ticks VAR byte                           
Minute VAR byte                         
Second VAR byte                       
Disp VAR byte                         
TRISA = %00001111;15 ; PORTA 0,1,2,3,4 son entradas
TRISB = %01000000 ; portb es salida
LED2=0;
PAUSE 500 ;0.5 seg para inicializar lcd

;limpieza de variables creadas
CNT=0;
Minute = 0 
Second = 0 
Ticks = 0 
Disp = 1 ; mustra en el LCD 00:00 al iniciar

OPTION_REG = $05               ;  prescaler = 64
ON INTERRUPT GOTO ISR          ; ir a rutina ISR 
LCDOUT $FE, 1        


LOOP:

IF CLEAR_button = 0 THEN

Minute = 0
Second = 0
Ticks = 0
led= 0
Disp = 1
goto loop
ENDIF

IF START_button = 0 THEN
Q=1
high led
TMR0 = 0 ;inicializa registro TRMO
INTCON = $A0 ; habilita tiempo de interuupcion
Disp = 1 ; habilita LCD
ENDIF


IF STOP_button = 0 THEN
Q=0
low led
INTCON = 0 ; desabilita tiempo de interrupcion
Disp = 1 
ENDIF


IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT DEC2 Minute, ":",DEC2 Second
Disp = 0
ENDIF
GOTO LOOP            



DISABLE
ISR:
Ticks = Ticks + 1
IF Ticks < 61 THEN NoUpdate
Ticks = 0
Second = Second + 1
IF Second = 60 THEN
Second = 0
Minute = Minute + 1
IF Minute = 5 THEN
Minute = 0
led=0
ENDIF
ENDIF
Disp = 1

NoUpdate:
INTCON.2 = 0 ;rehabilitainterrupciones del TRMO
Resume
ENABLE ; 
END 


END ; Fin del programa

la idea es dejar los botones de control para comnzar/detenerse a contar y para el 'clear' general, agregar los sensores como switch que activa/desactivan el conteo segun sean bloqueados/desbloqueados los sensores.

finalmente, se agregaría un boton 'fin', que debería mostrar en el lcd, la cantidad total de veces que los sensores fueron bloqueados en el tiempo determinado (5 min)

Mi duda es, en que parte del código agrego ESTE CONTADOR que representa a 1 sensor para que no interrumpa al cronómetro:
Código:
'RUTINA QUE CUENTA
INICIO:
IF SEN1=0 and Q=1 THEN DESB
GOTO INICIO
END

DESB:
IF SEN1=1 THEN CUENTA
GOTO DESB
END

CUENTA:
CNT=CNT+1;
IF CNT=0 THEN LED2=1
GOTO INICIO 
END





Saludos! (Gracias por su tiempo y ayuda, han sido grandes impulsores de mi apredizaje. :cry:)
 
Última edición:
hola que tal amigos, esta fantastico todo este tutorial de pbp, quisiera saber si no tiene un ejemplo de el uso del puerto usb en este lenguaje, lo que pasa es que e buscado en internet pero no encuentro respuesta a mi duda.
 
No me acuerdo si ya se vio en este tema...
pero consigue el HID Wizzard y el MPASM y el microcode eso te genera gran parte del codigo
en java Vbasic y otro no recuerdo para el pc y obvio el archivo de pbp
Dibujo.JPG
(valido solo en pic18f2550 18f4550 y no recuerdo cual mas... otros dos creo)
 
Última edición:
Saludos a todos,

Nuevamente acudo a ustedes a pedir orientación, he tenido dificultad para regrabar un dato en memoria eeprom y pues, la verdad, no he sabido dónde estoy errando, aunque parece funcionar en la simulación, al quemarlo y probar el lcd queda en negro. La idea que tengo es la de capturar un valor de un sensor, sea de temperatura u otro, para referencia y cada tanto tiempo actulizarlo nuevamente. Publico un código básico y les doy mis mas sinceros agradecimientos por cualquier aclaración que puedan hacer.
Código:
CmCon=7  
 TrisB=0 
 EEPROM 0,[5]
 
DEFINE LCD_DREG PORTB 'UTILIZAR 4 BITS DEL PUERTO B PARA TX DE DATOS
DEFINE LCD_DBIT 4     'DESDE EL BIT B.4 AL BIT B.7
DEFINE LCD_RSREG PORTB'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO B
DEFINE LCD_RSBIT 1    'EN EL BIT B.1
DEFINE LCD_EREG PORTB 'UTILIZAR EL ENABLE EN EL PUERTO B
DEFINE LCD_EBIT 3     'EN EL BIT B.3



     CONT VAR BYTE
     EPROM VAR BYTE[1] 
     SENSOR1 VAR BYTE[1]
     
    Pause 200        
   
    for cont=0 to 1
    READ cont,EPROM[cont]
    next cont     
 	Lcdout $fe, 1 
    Lcdout "VOLTAJE REF. ",#EPROM[0]
    PAUSE 500

    MIDIENDO_VOLTAJE:
    
    SENSOR1[0]=1

    GRABANDO:      
    for cont=0 to 1
    WRITE cont,SENSOR1[cont]
    next cont 
  
   for cont=0 to 1
    READ cont,EPROM[cont]
    next cont     

    Lcdout $fe, 1 
    Lcdout " NUEVA REF.",#EPROM[0]
    PAUSE 500              
    End
 
Última edición:
Atrás
Arriba