TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Zero13 en 11 de Octubre de 2004, 14:15:00
-
Hola...me gustaria saber si alguien tiene algun ejemplo que funcione con el micro 16F876A para poder enviar desde un pic un texto ejemplo "13" por medio del mandato:
SEROUT
HSEROUT
Y por otro lado para el otro Micro que codigo basico debe de tener para poder comprobar si a traves del mandato:
SERIN
ó
HSERIN
Recibe ese texto "13"
He realizado mil pruebas y no lo consigo...please ayuda, ya que si lo consigo mi idea es utilizar dos placas de 433 Mhz de AUREL para pasar ese texto via RS232.
Gracias por adelantado a todos los que me podais ayudar.
Slds!
Zero13
-
Hola Zero13
Para transmision serout hay un ejemplo aqui pana
http://miarroba.com/foros/ver.php?foroid=8826&temaid=2682878&msgid=22128194#22128194
no es para el modelo de tu chip pero el func es el mismo.
Con el Hserout usarias la USART integrada , deja y te envio dos ejercicios para que los revises y simules en proteus
Salu2 pana
-
Mil Gracias!

Que hariamos sin los foros
...son...como dicen muchos foreros...nuestra fuente constante de conocimiento.
Slds!
Zero13
-
De nada pana, para eso estamos, si sabes la cantidad de informacion excata que vas atransmitir y recibir, no lo hagas omo en mis ejemplos, haslo con strings y arrays, por que eso del for quita un poco de tiempo, recuerda solo en direcciones consecutivas:
-----------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM VAR1[11] AS BYTE
DIM VAR2[13] AS BYTE <--ARRAY
STR VAR1="RESIVIENDO "
STR VAR2="TRANSMITIENDO" <--STR
HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000
HSERIAL_TXSTA = %00100100
HSERIAL_CLEAR = ON
CLS
PRINT STR VAR2
HRSOUT STR VAR114 <---STR NO NECESARIA SI QUIERES LEER TODA LA STR
END
---------------------------------------------------------------------------------
DEVICE 16F877
XTAL = 4
DECLARE LCD_DTPIN PORTA.0
DECLARE LCD_ENPIN PORTB.3
DECLARE LCD_RSPIN PORTA.4
DIM VAR1[11] AS BYTE
HSERIAL_BAUD = 9600
HSERIAL_RCSTA = %10010000 " 10010000
HSERIAL_TXSTA = %00100100 " 00100100
HSERIAL_CLEAR = ON
HRSIN STR VAR1
CLS
PRINT STR VAR1
DELAYMS 2000
END
Salu2 pana
-
Hola Lager, mira me pasa una cosa rara...
A traves del ICD he conseguido ver realmente que saca por el pin de TX el 16F876A y en vez de sacar lo que yo le pongo "13"....
Saca esto "gf="

Este es el codigo que he compilado y tengo actualmente activo...como es normal...la placa receptora...no funciona, ya que no recibe el esperado numero "13"....
Codigo: Software MicroCode Studio
include "modedefs.bas"
@ device HS_OSC
define osc 20
valor var byte
define hser_txsta 24h
define hser_baud 9600
define hser_spbrg 25
inicio:
valor=13
serout portc.6,N9600,[#valor,10]
pause 1000
goto inicio:
Este es el codigo de la placa emisora con un 16f876a con un cristal de 20 Mhz...que compilo en modo HighSpeed y que intento que transmita a 9600 baudios....
Veis algo raro...no lo entiendo...deberia de salir solo "13"
Slds!
Zero13
-
Escrito originalmente por Zero13
Hola Lager, mira me pasa una cosa rara...
@ device HS_OSC
define osc 20
valor var byte
--------------> aqui defines los registros de la usart...
define hser_txsta 24h
define hser_baud 9600
define hser_spbrg 25
inicio:
valor=13
----------> porque no utilizas hserout??? 







serout portc.6,N9600,[#valor,10]
yo lo pondría así.
hserout [bin(valor)] -----> te sacará 1101
si mandas hserout[valor] -----> te emitirá un CR, que es el código que corresponde al ascii 13
pause 1000
goto inicio:
espero solucionar algo con las correciones....
de momento, creo que lo mas importante, es que utilices la usart
-
Excelente observacion abago,
,
solo para complementar con info, no me acuerdo ya en pbpro, pero en proton+ serin, serout es usado igual pero SIN modulo usart!! ok? y Hrsout e hrsin, son comandos SOLO para chips con modulo usart . Por lo tanto no es necesairo(con el comando hrsout) definir el puerto, ya que dependiendo del micro, ya esta definido el usart.
p.ejemplo: el pic16f628 tiene su Tx en RB2 y su RX en RB1
Salu2 panas
-
Hola a los dos ....lager y abaro...
He conseguido algo...en el proceso de envio del texto que me interesa desde la placa transmisora a 9600 baudios...con el texto "13".....he comprobado...con una placa ICD de depuracion que sale el mensaje clarito y sin errores...tal cual asi:
13131313131313131313131313.....bla...bla
Pues bien en la placa receptora...esta con el mandato
inicio:
hserout 5000,inicio(wait("13"
)
" Se enciende Led
high portb.0
pause 250
low portb.0
pause 250
goto inicio:
Pues bien...me pasa algo muy raro....de vez en cuando se me enciende el led...pero no siempre...y eso que la placa emisora no para en enviar el 131313131313...etc..
Alguna idea...estoy perdiendo....los nervios..con el HSERIN...
Gracias por adelantado.
Zero13
Slds.
-
Hola Zero13,
inicio: <--------Label de bucle
hserout 5000,inicio(wait("13"
<.. aqui tienes un inicio y un wait que no se que hacen ahi ni estan definidas
" Se enciende Led
high portb.0
pause 250
low portb.0
pause 250
goto inicio: <---Vuelve al label de bucle "rutina que se repite siempre"
Por eso , no para de escribir tu pic, tu pic se enciende por solo 250 ms es muy poco ponle 1000 que es 1 segundo, no se si activaste o no las pullups, tienes que activarlas o en su defecto poner una resitencia de pullup (esto muchos no lo hacen y por eso no les trabaja bien este tipo de transmisiones...)en donde este conectado tu led, las puedes activar. no que tipo de dispositivo usas, pero acuerdate de poner a digital los pines con CMCON = 7. estos son solo unos consejos para evitar fluctuaciones de errores, pero de principio 250 ms de encendido de un led es MUY poco es 1/4 de segundo para que te des una idea, tambien es bueno que desde el principio se defina los puertos de salida y de entrada y se limpien los de salida,
para que solo prenda y apague el led puedes poner el label de bucle solo para los leds y asi obtienes parpadeos de led
MAsINFO;
HSEROUT Sólo puede ser usada en dispositivos que posean hardware USART , para habilitar tu modulo interno usa
DEFINE HSER_RCSTA 90h <--- recepcion
DEFINE HSER_TSTA 20h <--- transmision
DEFINE HSER_BAUD 2400 <---VELOCIDAD(esto te pudo haber presentado basura )
El formato(o protocolo como quieras llamarlo) por defecto de los datos seriales es 8N1 , 8 bits de datos ,sin paridad y 1 stop bit (asi debe etar configurado tu pc para recivir)7E1 ( 7 bits de datos , paridad par , 1 stop bit ) ó 7 O 1 ( 7 bits de datos , paridad impar ,1 stop bit ) pueden ser habilitados usando los siguientes declaraciones:
DEFINE HSER_EVEN 1 <-- paridad par
DEFINE HSER_ODD 1 <-- paridad impar
Dado que la recepción serial se realiza por hardware ,no es posible invertir los niveles para eliminar un driver RS - 232 .Por esto debe usarse un driver adecuado con HSEROUT .
Ejemplo:
´ enviar el valor decimal de B0 seguido por un linefeed a través del USART
HSEROUT [ dec B0 , 10 ]
En resumen, por favor leete el manual muy bien por que la verdad como lo declaras para pbpro , no se si funciona o no tu codigo pero te vendria bien leer el manual: http://www.todopic.com.ar/pbp_sp.html#ndp1
Salu2 pana
-
Mil gracias Lager
por tu info...
Tengo una simple pregunta... como le pongo una resistencia
"pullup"...siento mi desconocimiento 
Si es una resistencia....de que valor se debe poner ??
De nuevo gracias.
Slds!
Zero13
-
Las resistencia de pullup, solo pones una rsistencia que no te quite mucha correinte(hasta antes de la mitad de voltaje total que llegue a ese nodo) puede ser una de 4k del nodo donde va el pin a voltaje(5v) pero el portb tiene pullups activables pana, mejor usa el registro OPTION_REG.7=1 con eso activas la resitencias de todos los pines del puerto B.
Espero te sirva,
Salu2
-
Escrito originalmente por Zero13
Hola a los dos ....lager y abaro...
soy abago...
no abaro.... 



ahora, sobre el tema del código.....
no sería el tema utilizar hserin???, porque creo recordar que el wait solo se usa en la recepción.... 
inicio:
hserin 5000,inicio(wait("13"
)
----> esperamos 5 segundos a recivir "13" si no es así, volvemos a la etiqueta inicio....
----> si recivimos el comando "13", pasamos a realizar la intermitencia el el led de portb.0
" Se enciende Led
high portb.0
pause 1000
low portb.0
pause 1000
goto inicio:
como dice lager, 250ms, es poco tiempo, como para poder apreciar el parpadeo.
-
Mil gracias a los dos

-
Notas importantes sobre el wait:
a: el wait no espera a recibir exactamente lo que tu le has indicado que espere, sino que espera a recibir "algo" sea lo que sea, incluso el ruido que pueda haber en la linea lo activa. Por eso a veces parece que no funciona correctamente.
b: si la linea de datos que llega al puerto se queda enclavada en el valor de activo, el wait se queda bloqueado para siempre. La gran "guru" del foro oficial del picbasicpro sugiere usar, para aplicaciones criticas, un pequeño circuito con un multivibrador que desbloquee la entrada.
-
Chavales, ya consegui resolver el problema con el SEROUT del 16F88, los de picbasic.org me enseñaron la moraleja:
No uses oscilador interno si vas a usar comunicaciones seriales.
Pero no obstante , HRSOUT funciona, y SERIN tambien...
salu2
-
Que bueno que solucionaste TU problema pana Manex_1987, uso el 16f628 a 4Mhz en simulacion y armado lo e tenido trabajando con serin y hserin,y la temperatura a la que esta trabajando tu modelo, creo que eso no se aplica a todos los modelos.Otra cosa, abria que verse la calibracion del reloj interno que usaste, la velocidad a la que quieras transmitir y sobre todo hecharle una buena revizada al ds de ese micro, aunque si no quieres esos detalles siempre esta el Reloj externo para evitar ajustes externos para hacerlo funcionar
.
Salu2 panas
-
Lager, me he leido su data entero



-
No lo dudo pana, eres TENAZ!! y eso es muy bueno, pero tu problema REAL, radica en que estas especificando RELOJ EXTERNO no interno(hberlo dicho antes pana) tu solucion NUEVAMENTE comprobada:
device=16f88
INTRC_IO=0X3FFC <-------- RELOJ INERNO, NO CRISTAL DE 8 EXTERNO!!
OSCTUNE=0X0090 <-------CALIBRACION
all_digital true
portb_pullups on
DIM X AS BYTE
DF:
"SERIN PORTB.2,396,[X]
"IF X="1" THEN
"HIGH PORTA.2
"SEROUT PORTB.5,396,["ON"]
"ENDIF
"IF X="0" THEN
"LOW PORTA.2
"clear portb.5
SEROUT PORTB.5,396,["OFF"]
delayms 1000
"ENDIF
"GOTO DF
end
Si no especificas que es interno, solo sale una j, otra cosa, ya que es inexacto(por TODAS las razones que te ponga cualquier persona) usa una velocidad de RECEPCION en tu pc mayor, es decir en este caso 4800 (ya que evias a 2400).
Pruebalo y me dices, esto puedes aun variarlo, leete el ds(por ahi hay otro registro OSCCON) en la seccion de calibrar el RC interno para variar el osctune, no se quizas no tengas ni que reducir la velocidad , claro solo es una idea
.(CONFIG INTRC_IO)
Un abrazo pana
-
Escrito originalmente por MarquesSalsero
Notas importantes sobre el wait:
a: el wait no espera a recibir exactamente lo que tu le has indicado que espere, sino que espera a recibir "algo" sea lo que sea, incluso el ruido que pueda haber en la linea lo activa. Por eso a veces parece que no funciona correctamente.
b: si la linea de datos que llega al puerto se queda enclavada en el valor de activo, el wait se queda bloqueado para siempre. La gran "guru" del foro oficial del picbasicpro sugiere usar, para aplicaciones criticas, un pequeño circuito con un multivibrador que desbloquee la entrada.
Hola Marques,
Creo que a mi me pasa eso, utilizo Wait y aveces se me queda ahi, ademas es una apliación critica, en la que no podré resetear el circuito cuando se quede ahí. El 555 para que lo conectas? es decir como actúa sobre la entrada del PIC.
Un saludo
-
Hola amigos voy a colocar esto a pesar de que los mensajes arriba expuestos ya son algo viejos pero puede ser de ayuda.
Cuando se utiliza el pic basic pro y el comando serin, serin2, entre otros y se emplea el wait hay que tener encuenta lo siguiente, cuando se trabaja en RS-232 la linea de entrada de datos cuando no se reciben datos debe permanecer siempre en 1 logico (para logica verdadera) para que la instruccion serin comience a temporizar el tiempo programado en el wait, en caso de que la señal de entrada no se mantenga en uno logico y esta cambie de 0 a 1 y viceversa la instruccion serin, serin2 que empleen el wait no trabajara y se quedara alli sin hacer nada de hecho si el pin de entrada programado en serin, serin2... se coloca a cero logico fijo tampoco trabajara.
Espero poder ayudar con esta explicacion
Saludos