TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: Abago en 17 de Marzo de 2004, 00:01:00

Título: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 17 de Marzo de 2004, 00:01:00
Hola a todos...
Ante todo, daros las gracias por entrar a echar un ojo a mi consulta...
Bueno, os cuento lo que me sucede...
estoy liado con un proyecto, que desde hace varios meses, va siendo mi quebradero de cabeza, y lo que me hace tener ganas de vivir..
Mi interés se basa en las comunicaciones serie...
Empecé con una pic 16f84 trabajando con el serin y serout, en invertido...
después, me decidí a ir metiendome con el max232, y hasta hay todo funcionó muy bien, claro está, después de leer, leer y leer... y sobre todo cacharrear y perder muchas horas de sueño.

Finalmente, y bajo la orientación del genio de sispic, me decidí a usar un 16f876, y usar la uart.
Todo funciona perfectamente...
mi circuitillo se conecta con el hiperterminel a las mil maravillas.

PERO!!!!!!!!
aqui viene el problema.
Ahora estoy intentando conectarme con un modem.
Con el HSEROUT, todo funciona bien, mando por ejemplo un atdt6090909 y el modem llama a ese numero, sin problemas.
pero con el HSERIN, no consigo hacer nada...

bueno, parece que empieza a recivir datos, y de pronto, se cuelga...

os dejo un programilla de ejemplo a ver si veis que puede ser...
En principio, pienso que puede ser por un desbordamiento del buffer de recepción... Pero admito sugerencias...

El programa hace lo siguiente.
enciende dos led, para saber en que parte del código estoy.
llama al +346090909
y espera a tener conexión.
para leer algun dato, lo que hago es colgar mi teléfono para que el modem responda con un BUSY, o espero a que la central telefonica le indique al modem, que no descuelgo, leyendo un NO CARRIER.

una vez que recivo los datos desde el modem, con la función hserin, leo los cuatro primeros dígitos, y los guardo en la eprom.

asi sucesivamente...
despues, leo el pic con el grabador, y sorpresa... no ha cogido ningún dato, o a escrito algún caracter raro..
Si simulo este mismo proceso con el hiperterminal, todo funciona bien...

A nivel de hardware, para usar el hiperterminal o el modem, uso dos cables distintos, dado que los pines de rx/tx, se invierten..


DEFINE OSC 4
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 4800

tmp var byte[5]
cont var word
i var byte

cont = 0

inicio:
high portb.7
pause 1000
hserout["ATDT+346090909",13]
low portb.7
hserin[tmp(1),tmp(2),tmp(3),tmp(4)]
high portb.6
for i = 1 to 3
write cont , tmp
cont = cont + 1
next
low portb.6
pause 1000
high portb.7
high portb.6
pause 1000
low portb.6
low portb.7

goto inicio
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: jorgeansuini en 17 de Marzo de 2004, 04:13:00
Buenas:

Normalmente no utilizo hserin, pero viendo el codigo ,te comento un problemita:
esto

for i = 1 to 3
write cont , tmp
cont = cont + 1
next

deberia ser asi:

for i = 1 to 3
write cont , tmp(i)
cont = cont + 1
next
 
Igualmente,usando serin,en pic basic plus, me sucedió que no me tomaba variables indexadas,no analice mucho el tema y puse variables individuales.-
saludos

jorge
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 17 de Marzo de 2004, 09:20:00
Tienes razón...
Voy a ver si por un fallo tan tonto,  el  programa no leia la uart...
TNKS.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 20 de Marzo de 2004, 22:48:00
Al parecer, el fallo es algo mas complicado...
Ya cambié los errores de código, y tras cacharrear, he conseguido leer algo...
Tambien me he dado cuenta de que con el hiperterminal, también puedo llegar a colgar el pic..
El tema está en que con el hiperterminal, no se colgaba, dado que le pasaba los datos escribiendo desde el teclado, a una velocidad muy lenta, para lo que es la velocidad a la que trabaja el pic...
Espero algún dia llegar a escribir a 4Mhz...

Bueno, el caso es que si dejo pulsada una tecla, durante unos segundos... CRASH... El pic se queda loco...

A ver si algún alma caritativa, ha hecho pruevas con los pic y los modem, y sabe por donde viene el error...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Sispic en 21 de Marzo de 2004, 00:52:00
Hola Abago , por que no lo intentas utilizando control de flujo , solo seiran dos lineas mas .

Creo que el moden se puede configurar así .
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 21 de Marzo de 2004, 06:51:00
Hola a todos, se que ando muy desaparecido pero a ver si puedo ayudar algo.

Cuando usas las funciones de hardware debes tener en cuenta que el buffer de recepcion se satura enseguida ( solo dos bytes recibidos y crasss ).

Los modems sueles ser muy parlanchines, y en el momento que inicias una conexión ( lo puedes comprobar con el terminal ) se dedican a devolver tanta información que como no tengas un buen sistema de almacenamiento intermedio el buffer de entrada se bloque y deja de funcionar. Esto lo puedes comprobar mirando el bit de saturacion del usart.

En tu caso y con las pausas que has puesto.... pues nada que antes de que te hayas dado cuenta usart saturada.

En la gues de melabs hay un sistema de recepcion con la usart de hardware con almacenamiento intermedio que yo lo probe en su momento y funcionaba bastante bien, se basa en crear un array de n caracteres ( depende de la memoria que tengas libre ) FIFO circular y almacenar en el los caracteres recibidos usando para ello una interrupcion de perifericos. Luego puedes ir leyendo los caracteres uno a uno, segun tengas tiempo, y actuando en consecuencia. Aun asi si tienes un buffer de entrada de, digamos, 32 caracteres y no vas vaciandolo de forma regular y rapidito, te aseguo que el modem o simplemente el terminal mandando carateres en autorepetición te lo van a saturar.

Hechale un viastazo al programa que te comento, se encuentra en

http://www.melabs.com/resources/samples/x1/pbp/serbufAx.bas

y

http://www.melabs.com/resources/samples/x1/pbp/serbufx.bas

uno lo hace en ensamblador y el otro en basic.

Puedes si lo necesitas hacer un control de flujo for hardware, simplemente debes comprobar cada vez que recibes un caracter cuanta memoria te queda libre en el buffer y si te quedan menos de seis o siete posiciones libres activar la linea de control de flujo. Ten en cuante que el control de flujo no es instantaneo y que aunque le digas al modem que deje de enviar informacion este aun enviara algun caracter. Esta pensado para las USART "serias" que suelen tener un buffer de entrada de un minimo de cuatro bytes y pueden llegar a los 256 bytes.

Otro asunto a tener encuenta es que cuando le digas al moedm que no te envie mas datos el tendrá que almacenar en su propia memoria intermedia lo que vaya recibiendo para luego poder enviarlo al pic cuando este lo solicite... y los modems tampoco tienen un buffer enorme.


no se si te habré aclarado algo o te habre liado aun mas, pero te has metido en uno de los aspectos mas complicados de la programacion, control en tiempo real o casi.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 21 de Marzo de 2004, 19:04:00
GRACIAS A TODOS...
Como siempre, mis amigos inseparables...
Siempre que tengo una duda, apareceis por aqui para ayudarme...
desde mis principios, cuando empecé teniendo problemas casi para encender un led, hasta ahora, en los momentos en los que ya mi mente se empieza a dirigir a proyectos mas ambiciosos.

Voy a hechar un ojo a la documentación de los links, a ver si saco algo en claro. Gracias Marques

SISPIC. Sobre el tema del control de flujo que comentas, El problema está en que el modem, viene por defecto bloqueado para que no utilice control de flujo.
He intentado cambiarle los parámetros, pero me da error.
Parece ser que viene de fabrica preparado para no usar el control de flujo.

De todos modos, lo que realmente me interesa, es leer una pequeña cantidad de información, asi que creo que con la solución de marques, puede funcionar.
como ya comenté antes, necesito leer las respuestas que dan los comandos AT del modem.
Si algún día, intento descargar ficheros binarios desde el modem al pic y viceversa, creo que tendré que usar el FLOW.
Pero de momento eso lo dejo para mi proxima inquietud.

Voy a ver si saco algo en claro estos días.
TNKS.
Si se os ocurre algo más, o veis algo de documentación o código que funcione, estoy por aqui...


Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 24 de Marzo de 2004, 13:21:00
Empiezo a pensar que esto de aprender es mas que una ciencia...

Bueno, resulta, que he migrado el proyecto de un 16f876-04
a un 16f876-20
he subido la frecuencia del reloj a 20Mhz
He establecido la comunicación a 9600 bps.
Y parece que FUNCIONA!!!!!!!!!!!!!!!!

@ DEVICE HS_OSC

DEFINE OSC 20
DEFINE HSER_TXSTA 20H
DEFINE HSER_RCSTA 90H
DEFINE HSER_BAUD 9600
DEFINE HSER_CLROERR 1

inicio:
high portb.6
pause 2000
 hserout["ATDT+34NNNNNNNNN",10,13]
 pause 2
 hserin 5000,inicio, [wait("BUS"]
low portb.6

goto inicio

Ahora el pic hace una llamada a mi telefono movil, le doy a la tecla colgar del tfl, y  en la protoboard, se enciente el led de portb6...


AHORA MI CONSULTA:
me gustaría hacer una función, que estubiese escuchando el puerto RX constantemente.
Como se maneja la interrupción de la uart???
Bueno, sigo estudiando, y ya os voy contando mis progresos...

Espero que este post le sirva a mas de uno de los que como yo, nos leemos el foro de arriba a abajo...

MUCHAS GRACIAS A TODOS POR EL ASESORAMIENTO....
Y ya sabeis, si teneis idea de como gestionar la interrupción por RX en asm, o sabeis como me puedo currar la función de escucha del puerto, SOY TODO OIDOS....

TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 24 de Marzo de 2004, 15:08:00
Como podras ver en varias consultas en algunos de los foros de diferentes lenguajes, deberas hacer manejo del control de errores que posee la usart.
Hay un bit quem te indica error de recepcion, por lo tanto deberas testearlo transcurridos algunos milisegundos (Hserin posee esa opcion) y saltas a una etiqueta donde reseteas el bit de error.
Sino el micro se cuelga!!

El hecho que hayas cambiado de velocidad de micro hace que el error posible de recepcion de la UART sea mas aceptable, por lo cual tarda mas en producirse.
Esto es comprobable cuando hay tramas muy largas (preguntale a Pacala sino) y el error porcentual se acumula, originando un error de recepcion por falta de sincronismo.

Aqui va un ejemplo de como utilizar la interrupcion y considerar el bit de error:

Codigo:
 
    disable
 Interrupcion:
    INTCON.7 = 0        "apago interrupciones generales
    INTCON.6 = 0        "idem con perifericas
    INTCON.5 = 0        "idem con Int de TMR0

    if (PIR1.5 = 1) then    "no es interrupcion del TMR0, es TX
        hserin Espera,LabelExit2,[WAIT (">",hex2 DirIn,SKIP 1,hex2 CheckIn]    
"        hserin Espera,LabelExit,[WAIT (">",RX4),SKIP 1,hex2 CheckIn]
       " hserin Espera,LabelExit,[hex2 DirIn,SKIP 1,hex2 ChecKIn]  
        gosub  CalcCheckIn
        if (DirIn = Direccion)and (ChecKIn = MiCheck) then
            Gosub   PrepDigitos
            gosub   TXint
        endif
    endif  
    if (INTCON.2 = 1) then  "Si hay bandera de interrupcion por Timer0  
        ticks = ticks + 1      " Cuenta partes de segundo
        INTCON.2 = 0    " Reseteo bandera de interrupcion por Timer0  
        IF ticks < 61 Then LabelExit  
        " 61 ticks por segundo (16.384ms por tick)
        ticks = 0   " Paso un segundo - actualizo tiempo
        Convert = ticks
        second = second + 1
        CantConv = AuxConv "guardo cantidad de conversiones por segundo
        AuxConv = 0        "limpio auxiliar de conversiones por segundo
        Var1 = Var2        "guardo actualizaciones de display por segundo
        Var2 = 0           "limpio actualizaciones de display por segundo
        IF second >= 3600 Then  "si algo no paso antes borro cuenta
            second = 0
        endif
    endif  
 LabelExit2:
    RCSTA.4 = 0        "reparo error de recepcion
 LabelExit:
    RCSTA.4 = 1        "habilito recepcion continua
    INTCON.7 = 1        "enciendo interrupciones generales
    INTCON.6 = 1        "idem con perifericas
    INTCON.5 = 1        "idem con Int de TMR0
    RESUME


Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 25 de Marzo de 2004, 13:01:00
Gracias MGLSOFT
La idea, es ampliar el handler de interrupción que ya tengo hecho para otras utilidades.
El handler está en ASM, gracias a la ayuda de sispic.
Ahora, me gustaría poder ampliarlo, para que me maneje las interrupciones de la uart.
La idea, es hacer un sniffer del puerto serie.
Leo datos continuamente, y si detecto algo que me sea de utilidad, ejecuto una función.

Ahora, me he encontrado con un problema banal, para lo que el proyecto puede llegar a ser, pero yo pregunto a los maestros,
por si os surge alguna idea de porque viene el error...

hserin 5000,inicio, [wait("AT+", str resp9]
if resp(1) = "C" then
 Hserout["COMANDO -  ",resp(8),resp(9), 10,13]
endif

Leo 9 caracteres, desde el momento en el que detecto la cadena AT+
Introduzco la cadena AT+COMANDO01 por terminal
Ahora al comparar resp(1) con "C", no entra en el IF.

Sin embargo si al igual que haces tu en el código que dejaste antes,  al principio del programa asigno a una variable, el caracter "C" y lo meto en la comparación... Funciona BIEN...

Muchas gracias...
Cada dia aprendo mas gracias a vosotros....

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 25 de Marzo de 2004, 14:08:00
Estas seguro que el caracter inicial del string no es el resp(0)?

Yo probaria mandarle dos C con Hiperterminal...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 25 de Marzo de 2004, 15:22:00
Si pongo a rest(0), no funciona de todas todas...
si pongo rest(1)
y preasigno el valor que quiero comparar a la var tmp, funciona.

Ahora tengo otro problema.
haciendo los tests pertinentes para buscar errores, lo que he hecho ha sido guardar el dato a comparar en la memoria interna del pic.
he guardado el valor "6" en la posición 0 de la memoria.
ahora con el hiperterminal, introduzco
AT+61

dejo un ejemplo, porque el codigo real , no lo tengo en este equipo

tmp var byte
resp var byte

inicio:
read 0,tmp
hserin 5000,inicio, [wait("AT+", str resp2]

if resp(1) = tmp then high porta.0

goto inicio

----
En principio resp(1) = "6"
y tmp = "6"....

Pues no funciona...
En principio, resp(1), está guardado como un caracter ascii, y tmp????

Tengo graves problemas con la conversión de tipos...
Otra cosa mas que tengo que aprender...

TNKS.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 25 de Marzo de 2004, 21:48:00
A que te refieres con lo de mandar dos C con el hiperterminal???

Tnks
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 26 de Marzo de 2004, 05:37:00
Es otra forma de comprobar en que posicion inicia a guardar los datos llegados por el COMM.
Si le llegan dos C seguidas y recibes solo la segunda pueden ser dos cosas, una que se desincronice la Usart, la otra es que realmente guarde a partir de la segunda C....
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 26 de Marzo de 2004, 06:16:00
Para comprovar que los datos que envio al pic, llegan corectamente, acabo de ponerle que los guarde en la memoria interna del micro...
Tras un rato de escribir, ya tengo parte del quijote en la memoria interna del pic.
parece que leer lee bien, pero no se porque no puedo comparar???

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 26 de Marzo de 2004, 07:03:00
Debes tener un problema con los formatos, el string guarda seguramente los bytes como caracteres ASCII, mientras el otro dato seguramente esta en decimal, prueba hacer un cambio de formato antes de comparar...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 26 de Marzo de 2004, 15:06:00
Hay está la pregunta....!!!
¿¿¿¿
Como se cambia el formato de datos???

la función hserin, guarda los datos como ascii
y la función read, los guarda como decimal o hexadecimal....
como hago la transformacion???

Eso es lo primero que me vino a la cabeza....
Es un error muy tipico en programación....
En lenguajes como visual basic, php, c, si que lo conozco, pero en PBP, no conozco la función o procedimiento de conversión de datos...

TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 27 de Marzo de 2004, 05:19:00
No puedes formatear el dato de EEPROM , pero si puedes hacerlo dentro del Serin, utilizando el modificador DEC y el HEX, lee un poco acerca de Serin, Serin2, Serout y Serout2, para saber como utilizarlos.

Si la montaña no viene a mi...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Marzo de 2004, 15:11:00
Actualmente estoy utilizando hserin, y ya intenté formatear los datos como tu bien dices con dec/hex, pero los resultados no fueron buenos....
pero creo recordar, que la comparación, la hice contra los datos directamente leidos a variable, por lo que deduzco que intenté comparar contra ascii...
En que formato leemos los datos de la eprom con read??? en decimal o hexadecimal???
dependiendo de esto, creo que no debe ser demasiado dificil encontrar el fallo...

mread var byte
sread var byte

.
.
.
read 0, mread
hserin [hex sread]
if mread = sread then high portb.7
.
.
.


Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 29 de Marzo de 2004, 18:24:00
Unas cosas se arreglan, y otras empiezan a fallar....
Ahora, que la comunicación serie, empieza a funcionar,
le adjunto al código, la rutina de gestión de interrupciones que tenia creada, y se acelera el proceso de tal modo, que no funciona...

El problema está en que la rutina, está preparada para gestionar las interrupciones con un cristal de 4Mhz

Y ahora uso uno de 20Mhz....

El preescaler a 32...


El programa va a tal velocidad, que no soy capaz de detectar en que parte del código está el problema,por medio de los leds que uso para control.

Si le quito la configuración del preescaler, parace que funciona mejor... Pero me he perdido...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 30 de Marzo de 2004, 13:46:00
Parece que no es el peescaler...
el problema lo tengo al habilitar la interupción por timer0

si pongo el timer, el programa, funciona, pero me tira los datos que le vienen en gana por el serial...

os dejo un example... a ver si encontrais algo raro... porque ya empiezo a desesperar...


OPTION_REG=%00000100   " prescaler 1:32
INTCON = %11010000    " Enable interrupt on general,PORTB.0, timer0


si pongo intcon = 11110000, funciona, pero hace lo que le viene en gana
si lo pongo = 11010000, todo funciona bien...

aqui la parte de código que maneja las interrupciones...
la he cortado, porque sino, ocupa mucho...

la interrupción de la uart, tampoco funciona...

Perdonar si son demasiadas preguntas, pero es que esta vez, parece que no quiere funcionar nada...

-----------------------------------------
asm
intt
      bcf     INTCON,GIE
;
GuardarRegistros
      movwf   wsave                ;Salva W
      swapf   STATUS,W             ;Invierte STATUS --> W
      CLRF     STATUS                 ; sets to BANK0
      movwf   ssave                ;Salva STATUS
      MOVF    PCLATH,W
     MOVWF     psave                  ; save pclath
      CLRF     PCLATH
      MOVF     FSR,W
      MOVWF  fsave                  ; save fsr reg

;
      BTFSC    PIR1,RCIF              ;hay enterrupción en la uart???
      goto    rxint                     ;si

      btfsc   INTCON,INTF          ;? Hubo interrupcion en RB0 ?
      goto    In                   ;Si
      btfsc   INTCON,T0IF          ;? Hubo sobrefujo en TMR0 ?
      goto    T0                   ;Si
      btfss   INTCON,RBIF          ;? Hubo algun cambio de RB4-RB7 ?
      goto    RestaurarRegistros   ;No

rb47
.
goto    RestaurarRegistros
.
.
.
.
T0    bcf     INTCON,T0IF          ;Pone a cero para poder salir de la ISR
      decfsz  ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      endasm
         hserout["timer - ", dec(minutos),10,13]
      asm
      goto    RestaurarRegistros
.
in
goto    RestaurarRegistros
.
.
.
.
.
rxint
      endasm
        high portb.4
      asm
      BCF   PIR1,RCIF
;
RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      ; Restore PCLATH, STATUS and W registers
    MOVF   fsave,W   ; get saved fsr reg
   MOVWF   FSR      ; restore   
   MOVF   psave,W   ; get saved pclath
   MOVWF   PCLATH      ; restore
   SWAPF   ssave,W   ; get saved status in w
   MOVWF   STATUS      ; restore status ( and bank )
   SWAPF   Wsave,F   ; reload into self to set status bits
   SWAPF   Wsave,W   ; and restore
    bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
    bsf     INTCON , GIE             ; Activa interrupciones generales
   
    retfie
EndAsm
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 30 de Marzo de 2004, 17:17:00
Creo que el error esta en estas lineas dentro del assembler, no por sintaxis sino por tiempo de ejecucion....




endasm
  hserout["timer - ", dec(minutos),10,13]
asm




Es muy probable que al interrumpir por tanto tiempo como es lo que lleva enviar este mensaje, se solapen las interrupciones y entres en una llamada recursiva al handler de interrupcion, que el PBP no puede resolver...

Prueba de sacarlo fuera de la interrupcion, y ejecutalo segun el estado de una bandera (flag) que te diga DeboTransmitir, por ejemplo.
Afuera el PBP no interrumpira esta transmicion, guardara el estado de la int hasta que pueda hacerlo...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 30 de Marzo de 2004, 17:44:00
Gracias MGL...
En cuanto llegue a casa, lo miro, porque ahora ando poniendo copitas a mis clientes...

Una cosita....
En la parte del hadler de interrupción, la parte en la que veo si hay interrupción por recepción en la UART, hay algo mal????
No me funciona!!!!

lo que quiero, es leer si llega algo a la uart, y meterlo en un array
para luego interpretarlo....
Ves algo mal???

--  BTFSC PIR1,RCIF --
TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 30 de Marzo de 2004, 22:05:00
Acabo de mirarlo...
Si dejo el hserin dentro del handler, lo envia al serial bien...
Pero si lo saco suera, manda lo que le viene en gana...
lo que he hecho, es poner debajo del incremento de minutos,
bsf _TimerMinutos

y en el programa principal

if timerminutos = 1 then
 hserout ["Time - ", minutos,10,13]
 timerminutos = 0
endif

si habilito el intcon = 11010000
la transmisión serie, funciona perfecta, pero si habilito el timer0
intcon=11110000, no funciona... Vamos, mada datos, pero son ilegibles... no los manda en el formato que debería...

hserout ["Hola Mundo",10,13]
saca al hiperterminal
Hmla  loundM
por ejemplo...
alguna idea???
Toy medio loco...
Al final, la gestión de tiempos, la voy a hacer con el pause...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 31 de Marzo de 2004, 07:04:00
Que bueno !!
Hiciste tu propio circuito Scrambler !!
Ahora puedes enviar mensajes codificados !!

Je..je..fue una broma.
Revisaste bien si estas seteando las Interrupciones bien ?
Porque en vez de habilitar todo junto no los habilitas por separado, bit a bit de Intcon, asi puedes probar en que condicion anda y en cual no, por ejemplo haciendo que bajo determinada condicion use el Tmr0 y en otras no...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 31 de Marzo de 2004, 15:56:00
Me he perdido por completo...
Mis conocimientos, son mínimos al lado de los tuyos.
En el código que puse antes para el manejo de interrupciones, es lo poco que se sobre el tema, y lo entiendo por su sencillez, pero
en cuanto intento incrementar el código, vienen los problemas...

Esto es como el que entiende el idioma ingles, pero no sabe hablarlo.

Mi idea, es en un futuro, poder gestionar la interrupción por rb0, rb4-rb7, tmr0, y uart.
con rb0 rb4-7, hago un rastreo de las entradas para hacer algo asi como un automata...
con timer0, gestiono los tiempos de actuación de las salidas.
y con la interrupción de uart, gestiono el llenado de un array, qye luego interpreto en el programa principal.
asi, puedo gestionar las salidas, dependiendo de las entradas,
y tambien por comunicación serie, interpretando una serie de comandos tipo AT.

alguna idea con codigo de ejemplo??
Encuentras algún error en el código que postee antes???

TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 31 de Marzo de 2004, 16:06:00
Quiero ayudarte, pero para eso por favor enviame una idea del circuito y el codigo completo, si es posible bien comentado.

En cuanto al PLC, miraste en el foro de proyectos, Hagamos un PLC con Pic!!

Alli esta una buena parte de lo que necesitas, pero en asm...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 31 de Marzo de 2004, 21:19:00
el circuito...
en principio. esta montado del siguiente modo...
portb como entradas...
y porta como salidas.
El portc. solo lo uso para los datos serie por la uart.
al portc, le he puesto un max232, con salidas RX,TX y masa a un conector db9
al porta, todos los pines conectador a una resistencia de 330 ohmios y diodos led contra masa...
mas adelante, cuando consiga que los led hagan lo que yo quiero, le pondré la parte de potencia con transistores bc547, o similares... pero de momento con comandar los led, estoy contento

las entradas, con pulsadores con entrada a 5v salida con una resistencio de 1k contra masa para leer 1 logico.

el clock, un cristal de 20mhz con dos condensadores como siempre
y la alimentación a su sitio..

hasta ahora este es el circuito

 sobre el tema del código,  dame unas horas, que ahora estoy en mi bar poniendo copitas....
mañana en cuanto me levante de la cama, te lo mando, o si quieres, lo pongo por aqui...
asi, cuando funcione, dejamos que otra gente, no tenga tantos problemas como yo...

tnks
si algún dia vienes a madrid, recuerda, que estás invitado a tomar unas copas en mi bar.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: manu2097 en 01 de Abril de 2004, 09:57:00
erdonad la pregunta, pues no se si tendría que haberla formulado en este hilo.

Resulta que también estoy liado con la usart, y tengo un lío algo serio

Cuando utilizo la instrucción hserin 1000,error,[wait("CMT",wait("+",str ntelef11,wait("F",str mens8] pues funciona bien el pic detecta el mensaje del GSM y tal. Pero cuando lo hago por interrupciones y lo configuro todo, aparentemente el programa va bien hasta que el gsm quiere mandar algo por el serie, salta la interrupción se va a la subrutina y ejecuta la instrucción hserin pero no encuentra CMT así que está 1000ms esperando sin encontrar nada y luego salta a error y sale de la interrupción.
Bueno después de ver ejemplos he llegado a pensar que cuando utilizo interrupciones no puedo utilizar el hserin con wait ni nada adicional solo puedo leer el byte que está en el buffer de la usart y ya está. ¿Este pensamiento es cierto? ¿he de ir byte a byte leyendo el bufer de la usar y almacenarlo en una cadena los caracteres para depuse trabajar y extraer de ella los valores que quiero?

Estoy algo confuso.
Un saludo a todos y gracias de antemano.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 01 de Abril de 2004, 15:55:00
Manu, desgraciadamente,por lo que he leido por aqui...
es lo que nos va a tocar hacer....


Ahora viene mi pregunta....
te funcionan las interrupciones de la uart???
es posible que me mandes algo de código, con el que contrastar en que me estoy equivocando???
a mi no me funcionan....
Las tratas en ASM o en PBP?¿?

A ver si entre todos, conseguimos hacer que este post, sirva para que la gente aprenda de nuestros errores....

Aunque realmente, aqui, el que mas soluciones da, es MGLSOFT
porque yo lo único que hago es mandar código con errores...
lo vamos depurando, pero va muy lenta la cosa...
en determinados momentos llega a desesperar......
Pero merece la pena pelear, para aprender...

Tnks...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Sispic en 02 de Abril de 2004, 01:16:00
Codigo:

wsave      var   BYTE    $020 SYSTEM
wsave1      var   BYTE    $0a0 SYSTEM
wsave2      var   BYTE    $120 SYSTEM
wsave3      var   BYTE    $1a0 SYSTEM
ssave      var   BYTE    BANK0 SYSTEM
psave      var   BYTE    BANK0 SYSTEM



;*****************************************************************************************
;*****************************************************************************************
;
;      If you are using a PIC with 2K or less,
;      you MUST unremarke the lines that follow.
;
;   movwf   wsave         ;only for PICs with 2k or less
;   swapf   STATUS,w      ;only for PICs with 2k or less
;   clrf   STATUS         ;only for PICs with 2k or less
;   movwf   ssave         ;only for PICs with 2k or less
;   movf   PCLATH,w      ;only for PICs with 2k or less
;   movwf   psave         ;only for PICs with 2k or less
;
;*****************************************************************************************
;*****************************************************************************************

; interrupcode follows here

bla
bla
bla
ble




;end of interruptcode
; restorecode follows here

   movf   psave,w         ;restore
   movwf   PCLATH
   swapf   ssave,w
   movwf   STATUS
   swapf   wsave,f
   swapf   wsave,w
   retfie



seguro que al salir no restaura correctamente los registros , intenta así

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 02 de Abril de 2004, 06:06:00
Por eso le estaba pidiendo que pusiera el codigo completo, ya que puede estar pasandose de largo algo que no vemos, al poner solo una parte de la interrupcion.

No tengas verguenza de hacerlo, si tiene errores puede que salgas de aqui con la respuesta, sino es asi alguien mas va a aprender un poco mas de ti, aunque no lo creas...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: sebastianvera en 02 de Abril de 2004, 13:10:00
Ya que leí todas las posts y quedé mas perdido que antes quería preguntarles si alguien tiene algun vinculo a algun site que explique interrupciones y hserin para BOBOS, ya que leyendo de a puñados no logro armarme ni una sola idea.

aprovecho para agradecer todo el trabajo y esfuerzo q ponen para mantener este foro en el alto nivel en el q se mantiene.

Lo poco que he aprendido de programacion de pics hasta ahora ha sido gracias a ustedes. Sigan adelante!
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 02 de Abril de 2004, 23:44:00
Aqui os dejo el código.....
de lo que hasta ahora es mi programa de pruebas....
Es la versión genérica. porque cada dia, le cambio algo, y todo empieza a fallar de nuevo....

tal y como está, no funciona la transmisión ni la recepción por la uart....
en el hiperterminal, aparecen la letras desordenadas, y sin ningún tipo de coherencia....
como muy bien dice mglsoft, un Scrambler pero con mi desgracia, de no saber como decodificarlo...

Bueno, espero que veais algo erroneo que sea grave....
Y a los que aprendeis como yo... Espero os sirva a iniciación al tormento de los problemas y las buenas soluciones...




@ DEVICE HS_OSC
"Definición oscilador
DEFINE OSC 20
" Definición parametros serie UART
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600



"Definición de interrupciones
"TMR0=6
OPTION_REG=%00000100   " prescaler 1:32
INTCON = %11110000    " Enable interrupt on general,PORTB.0, timer0

"INTCON.7 = 1 "enciendo interrupciones generales - GIE
"INTCON.6 = 1 "enciendo interrupciones perifericas - PEIE
"INTCON.5 = 1 "enciendo interrupciones de TMR0 overflow - T0IE
"INTCON.4 = 1 "enciendo interrupcion RB0/INT - INTE

"INTCON.3 = 1 "RB port Change Interrupt enable bit - RBIE
"INTCON.2 = 1 "FLAG TMT0 Interrupt - T0IF
"INTCON.1 = 1 "FLAG RB0/INT external interrupt  - INTF
"INTCON.0 = 1 "FLAG RB Port change interrupt - RBIF

"definición del handler de interrupción
Define  INTHAND  _myint

"Definición de variables de sistema para gestión de interrupciones en ASM
wsave      var   BYTE    bank0 SYSTEM
ssave      var   BYTE    BANK0 SYSTEM
psave      var   BYTE    BANK0 SYSTEM
fsave       var byte    BANK0 SYSTEM

ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system


"Variables de programa
Flag_RB0     var bit
Flag_RB47    var bit
flag_timer   var bit
flag_Uart    var bit
bufferuart   var byte
cont         var word  
trisa = %111111  " Porta todo entradas
trisb = %00000001 " Portb0 entrada demás salidas
trisc = %10111111 " Portc.7 salida TX demas entradas


goto inicio

myint:
asm
intt
      bcf     INTCON,GIE
;
GuardarRegistros
      movwf   wsave                ;Salva W
      swapf   STATUS,W             ;Invierte STATUS --> W
      CLRF     STATUS                 ; sets to BANK0
      movwf   ssave                ;Salva STATUS
      MOVF    PCLATH,W
     MOVWF     psave                  ; save pclath
      CLRF     PCLATH
      MOVF     FSR,W
     MOVWF     fsave                  ; save fsr reg

;
      BTFSC   PIR1,RCIF              ;hay enterrupción rx en la uart???
      bsf     _Flag_uart
      btfsc   INTCON,INTF          ;? Hubo interrupcion en RB0 ?
      goto    In                   ;Si
      btfsc   INTCON,T0IF          ;? Hubo sobrefujo en TMR0 ?
      goto    T0                   ;Si
      btfss   INTCON,RBIF          ;? Hubo algun cambio de RB4-RB7 ?
      goto    RestaurarRegistros   ;No
;
Rb47  bcf     INTCON,RBIE          ;Pone a cero para poder salir de la ISR
      bsf     _Flag_RB47                ;Poner aqui el codigo de atención de la interrupción por cambios en RB4~RB7
      goto    RestaurarRegistros
;
T0    bcf     INTCON,T0IF          ;Pone a cero para poder salir de la ISR
      decfsz  ticks,f
      goto RestaurarRegistros
      movlw 122     ; Paso un segundo - actualiza tiempo
      movwf ticks
      movlw 6
      movwf tmr0
      clrf Convert         ; Convert = 0
      incf   segundos,f
      movf   segundos,w
      sublw 60
      btfss STATUS,Z   ; 60 segundos ?
      goto  RestaurarRegistros   ; no
      clrf   segundos   ; si
      incf  minutos,f
      bsf _flag_timer

      goto    RestaurarRegistros
;
In    bcf     INTCON,INTF          ;Pone a cero para poder salir de la ISR
      btfss   _Flag_RB0
      goto    in1
      bcf     _Flag_RB0
      goto    RestaurarRegistros
in1   bsf     _Flag_RB0
      goto    RestaurarRegistros

RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      ; Restore PCLATH, STATUS and W registers
    MOVF   fsave,W   ; get saved fsr reg
   MOVWF   FSR      ; restore   
   MOVF   psave,W   ; get saved pclath
   MOVWF   PCLATH      ; restore
   SWAPF   ssave,W   ; get saved status in w
   MOVWF   STATUS      ; restore status ( and bank )
   SWAPF   Wsave,F   ; reload into self to set status bits
   SWAPF   Wsave,W   ; and restore
    bcf   INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
    bsf     INTCON , GIE             ; Activa interrupciones generales
   
    retfie
EndAsm


ActivaInterr:
  ticks=122    " aqui, realmente, no se como calcular los ticks para 20Mhz
  segundos=0  
  minutos=0
  Flag_RB0 = 0
  low portb
Return

Check_portc0:
  If portc.0 = 1 then
        HSEROUT ["Port.C0 Activado...",13]
  endif
return   

Blink:
        "la idea, es usar el timer para hacer que un led parpadee a determinada frecuencia,
        "pero de momento como el timer no funciona, lo he hecho asi...
        if portb.6 = 0 then
           if cont = 0 then
              high portb.6
              pause 300
           else  
            cont = cont - 1
           endif
        else
            low  portb.6
            pause 300
            cont = 9000
        endif  
return        

inicio:  "***********************************************
HIGH portb.7

high portb.1
HSEROuT ["PROGRAMA DE TESTEO DE INTERRUPCION Y GESTIÓN DE UART V.1.0  FALLANDO A TOPE...",10,13]

pause 30
call activainterr

inr:
LOW PORTB
" si ha pasado algo por la uart RX, encendemos testigo portb.5
if flag_uart = 1 then
 high portb.5
 pause 3000
 low portb.5
 flag_uart = 0
endif

call blink " hacemos que parpadee portb.6
call Check_portc0  "leemos estado portc0

"espero entrada de comando actuador, que encenderá testigos 2,3,4
hserin 3000,reloj,[wait("ENCIENDE",bufferuart] " aqui introduzco por hiperterminal
if bufferuart = "1" then high portb.2             " un valor entre 1 y 3
if bufferuart = "2" then high portb.3
if bufferuart = "3" then high portb.4

reloj:
if flag_timer = 1 then
 high portb.1
 hserout["minutos desde arranque del programa - ", dec (minutos),10,13]
 flag_timer = 0
 low portb
endif
 


   
goto inr
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: manu2097 en 05 de Abril de 2004, 12:03:00
Espero no ofender a nadie con mi comentario pero me ha sorprendido mucho que el pic se bloqueara al escuchar el serie con la instrucción hserin y no estaba utilizando interrupciones, fue mandarle 2 tramas largas de caracteres y quedarse colgado. Esto con el serin2 no pasa pero como es software no podremos utilizar interrupciones, entonces como queremos utilizar interrupciones tendremos que utilizar la USART pero no tengo claro como funciona la USART. Por lo que tengo entendido es que la bandera PIR1.5 se desactiva por hardware así que creo que dentro dela interrupción si vacías el bufer de entrada la bandera se actualiza ha cero y supongo yo que entonces comienza a llenar el bufer de nuevo hasta que se llene y vuelva a dispararse la bandera de nuevo. Veo demasiado difícil hacer rutinas que funcionen  como el wait(“aadf”) del serin2   yendo carácter a carácter.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 08 de Abril de 2004, 16:06:00
manu, mi idea, es mas o menos lo que comentas en tu post...
a ver si le echan los maestros un ojo a mi código, y sigo haciendo pruebas, y saco algo en claro....
y a ver si poco a poco, sacamos el proyecto adelante....
porque mi idea, es hacer un sniffer de puerto serie, para todo tipo de trastos, con lo que podremos interpretar tramas de cualquier aparato que hable por rs232...
solo quedará hacer un interprete de comandos para cada aparato, que lea el buffer de la uart y haga lo que nosotros queramos.
en principio, mi proyecto, se ha basado en hablar con un modem, pero ahora la idea es algo mas ambiciosa, y quiero que mi circuito, hable con cualquier aparato serie...
pero viendo la cantidad de problemas con los que me estoy encontrando, creo que el proyecto va para largo.
Animo y a trabajar duro.
ya verás como entre todos conseguimos hacer un proyecto interesante.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 09 de Abril de 2004, 16:40:00
estoy reduciendo poco a poco los posibles errores del código...
y parece que la cosa no va mal...

aqui os dejo la última varsión del código que estoy testeando...

@ DEVICE HS_OSC
"Definición oscilador
DEFINE OSC 20
" Definición parametros serie UART
DEFINE HSER_RCSTA 90H
DEFINE HSER_TXSTA 20H
DEFINE HSER_BAUD 9600



"Definición de interrupciones
"TMR0=6
OPTION_REG=%00000111   " prescaler 1:32
INTCON = %11100000      " Enable interrupt on general, timer0

"INTCON.7 = 1 "enciendo interrupciones generales - GIE
"INTCON.6 = 1 "enciendo interrupciones perifericas - PEIE
"INTCON.5 = 1 "enciendo interrupciones de TMR0 overflow - T0IE
"INTCON.4 = 1 "enciendo interrupcion RB0/INT - INTE

"INTCON.3 = 1 "RB port Change Interrupt enable bit - RBIE
"INTCON.2 = 1 "FLAG TMT0 Interrupt - T0IF
"INTCON.1 = 1 "FLAG RB0/INT external interrupt  - INTF
"INTCON.0 = 1 "FLAG RB Port change interrupt - RBIF

"definición del handler de interrupción
Define  INTHAND  _myint

"Definición de variables de sistema para gestión de interrupciones en ASM
wsave           var     BYTE    $020 SYSTEM
wsave1          var     BYTE    $0a0 SYSTEM
wsave2          var     BYTE    $120 SYSTEM
wsave3          var     BYTE    $1a0 SYSTEM
ssave           var     BYTE    BANK0 SYSTEM
psave           var     BYTE    BANK0 SYSTEM
fsave       var byte    BANK0 SYSTEM

ticks        var byte bank0 system
Convert      var byte bank0 system
segundos     var byte bank0 system
minutos      var byte bank0 system


"Variables de programa
Flag_RB0     var bit
Flag_RB47    var bit
flag_timer   var bit
flag_Uart    var bit
bufferuart   var byte
cont         var word
trisa = %111111  " Porta todo entradas
trisb = %00000000 " Portb0 entrada demás salidas
trisc = %10111111 " Portc.7 salida TX demas entradas


GoTo inicio

myint:
asm
intt
      bcf INTCON, GIE
;
GuardarRegistros
      movwf   wsave                ;Salva W
      swapf   STATUS,W             ;Invierte STATUS --> W
      CLRF        STATUS                 ; sets to BANK0
      movwf   ssave                ;Salva STATUS
      MOVF PCLATH, W
          MOVWF   psave                ; save pclath
      clrf PCLATH
      MOVF FSR, W
          MOVWF   fsave                ; save fsr reg

;
      BTFSC   PIR1,RCIF              ;hay enterrupción rx en la uart???
      bsf     _Flag_uart
      btfsc   INTCON,INTF          ;? Hubo interrupcion en RB0 ?
      goto    In                   ;Si
      btfsc   INTCON,T0IF          ;? Hubo sobrefujo en TMR0 ?
      goto    T0                   ;Si
      btfss   INTCON,RBIF          ;? Hubo algun cambio de RB4-RB7 ?
      goto    RestaurarRegistros   ;No
;
Rb47  bcf     INTCON,RBIE          ;Pone a cero para poder salir de la ISR
      bsf     _Flag_RB47                ;Poner aqui el codigo de atención de la interrupción por cambios en RB4~RB7
      GoTo RestaurarRegistros
;
T0    bcf     INTCON,T0IF          ;Pone a cero para poder salir de la ISR
      decfsz ticks, F
      GoTo RestaurarRegistros
      movlw 77     ; Paso un segundo - actualiza tiempo
      MOVWF ticks
      movlw 6
      MOVWF tmr0
      clrf Convert         ; Convert = 0
      incf segundos, F
      MOVF segundos, W
      sublw 30
      btfss STATUS,Z    ; 30 segundos ?
      goto  RestaurarRegistros  ; no
      clrf      segundos        ; si
      incf minutos, F
      bsf _flag_timer

      GoTo RestaurarRegistros
;
In    bcf     INTCON,INTF          ;Pone a cero para poder salir de la ISR
      btfss   _Flag_RB0
      GoTo in1
      bcf     _Flag_RB0
      GoTo RestaurarRegistros
in1   bsf     _Flag_RB0
      GoTo RestaurarRegistros

RestaurarRegistros
      ; Retorna habilitando todas las interrupciones
      ; Restore PCLATH, STATUS and W registers
    MOVF        fsave,W ; get saved fsr reg
        MOVWF   FSR             ; restore
        MOVF    psave,W ; get saved pclath
        MOVWF   PCLATH          ; restore
        SWAPF   ssave,W ; get saved status in w
        MOVWF   STATUS          ; restore status ( and bank )
        SWAPF   Wsave,F ; reload into self to set status bits
        SWAPF   Wsave,W ; and restore
    bcf INTCON , T0IF  ; Resetea bandera de interrupcion por Timer0
    bsf     INTCON , GIE             ; Activa interrupciones generales
   
    retfie
endasm


ActivaInterr:
  asm
      ;-------CONFIGURACIO INTERRUPCIONS UART---

      BSF STATUS,RP0 ;BANK 1
      BCF PIE1,TXIE ;DESACTIVA INT TRANSMISIO DE UART
      BSF PIE1,RCIE ;ACTIVA INT RECEPCIO DE UART
      BCF STATUS,RP0 ;BANK 0
  endasm
  ticks = 77  " aqui, realmente, no se como calcular los ticks para 20Mhz
  segundos = 0
  minutos = 0
Return


inicio:  "***********************************************
Call ActivaInterr:
high portb.0
high portb.1
high portb.2
high portb.3
high portb.4
high portb.5
high portb.6
high portb.7
pause 3000
low portb.0
low portb.1
low portb.2
low portb.3
low portb.4
low portb.5
low portb.6
low portb.7

inr:


If flag_uart = 1 Then
bufferuart = RCREG
hserout [bin (flag_uart), " - " , bin (bufferuart),10,13]
 high portb.6
 flag_uart = 0
 asm
  bcf PIR1, RCIF
 endasm
End If
 
If flag_timer = 1 Then
   high portb.7
   pause 100
   low portb.7
   flag_timer = 0
End If

GoTo inr


aqui vienen las preguntas...
la primera... he puesto el preescaler a 255, dado que a 32, parece dar mas problemas con el hserout...

una pregunta que supongo que será algo tonta, pero se escapa a mis conocimientos....
en el principio del código, empiezo encendiendo todos los led que he puesto en portb....
y luego dejo el código rotando dentro de la etiqueta inr...
bueno, pues en cuanto introduzco algún caracter a la uart, la interrupción, aparentemente, se activa, pero me enciende de nuevo los led del portb, como si retornase a la etiqueta inicio....
alguna idea???

segunda duda???
como leo el valor que a entrado a la uart?? para meterlo en una variable buffer???
porque tal y como lo he puesto, el valor lo pinta como un "0"..

de momento poco mas...
y muy contanto, porque al menos voy viendo resultados....

muchas gracias y un saludo.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 10 de Abril de 2004, 06:20:00
Creo que el micro resetea porque se pasa de tiempo recibiendo por la Usart, seguramente tienes el fuse del watch dog activo (esto puedes verificarlo poniendo el micro en el grabador y leyendo la configuracion de los fuses).
Si es como digo tienes dos caminos:
 1.- Activar el reset del watchdog durante la interrupcion por Usart, lee bien en el comando hserout, debe tener una opcion para hacerlo.
2.- Desactivar el watchdog desde los fuses.

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 12 de Abril de 2004, 14:05:00
Parece que aun no siendo religioso... La semana santa me ha venido bien para pensar


La cosa mejora por dias...
al menos la recepción de la uart por interrupción, la estoy haciendo bien...
Poco a poco...
ahora otra duda....
Sabeis como funciona el wait() del comando hserin???
o como simular algo parecido???

Yo le doy vueltas... Pero aún no se me ocurre como hacerlo sin ocupar lineas y lineas...
Y como me gusta hacer las cosas bien... No quiero anidar if if if if if

Alguna idea???

una vez que esto funcione... Ya le meto el timer... y me sigo pegando...
porque quiero ir demasiado rápido y al final no funciona nada...
Asi que me he decidido a depurar la parte de comunicaciones.. y luego ya la iré ampliando con el error del timer!!!

De todos modos, habeis visto algún error en el código que dejé anteriormente???


AH!!! se me olvidaba.....
MGL, tienes razón, tengo el flag del perro guardian habilitado...
Tnks.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 12 de Abril de 2004, 14:36:00
Felicitaciones !!
Mas alla de lo que hayas descubierto en tus rutinas, hay algo muy importante que aprendiste....
Y es lo mas tonto de  todas las cosas, pero dificil de comprender cuando uno se mete en problemas por hacer todo de una.

Un gran problema tiene forma segura de fraccionarlo en muchos pequeños problemas, los cuales seran facilmente solucionables... solo hay que encontrar el tamaño de las fracciones, despues es facil solucionarlos, y finalmente se habra solucionado el problema que veiamos imposible de solucionar..
Pregunta: Para que quieres emular el WAIT del Hserin??
Estas haciendo la recepcion en assembler??
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 12 de Abril de 2004, 15:29:00
No me habia dado cuenta, pero lo de desglosar los grandes problemas en pequéños, es lo que hacen los consultores... Y les funciona muy bien!!!
Gracias por tu apollo MGL....
Sobre lo de la simulación de wait()
es lo que sin haberte explicado, has deducido sin pestañear...
la rutina de recepción, es una mezcla entre mis ideas propias, y parte del código del link que dejó marques salsero al principio del post....

lo que hago es recepcionar los datos serie en un buffer anillo, y ya trabajo sobre este buffer...
pero el problema me a aparecido cuando me he dado cuenta de que la rutina wait, me la tendría que hacer a mano, al igual que el comand.com
la idea, es facil, voy leyendo los datos del buffer continuamente, hasta que leo algo que me interesa, pero como comparo varios comandos??? sin hacer uso de 1500 IF???

alguna sugerenia¿¿

he intentado habilitar la interrupción por timer0, ya sabes, no podia quedarme tranquilo...
y si la habilito, el programa se resetea.
si le deshabilito el fuse wdt, el programa se para.... y no hace nada
en que partes del código tendría que limpiar el perro para que funcionase??
como las limpio???
cuantas veces???
supongo que debería hacerlo al entrar en el handler de interrupción.. no?

MUCHAS GRACIAS!!!

CADA DIA ESTOY MAS CONTENTO DE APRENDER!!!
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 12 de Abril de 2004, 16:16:00
Sencillo.
Si utilizas el Timer0 , no puedes usar el prescaler para el watchDog, por lo tanto este resetea el micro transcurridos 18 Mseg desde la ultima vez que borres su estado.

Si miras las instrucciones del assembler veras que algunas tomas dos ciclos y otras uno solo, para un reloj de 4 MHZ el ciclo es de 1 microsegundo, por lo tanto puedes borrar el WatchDog cada 9000 instrucciones sin temor al reset, pero en la realidad yo no me fio de eso, y hago un reset cada vez que interrumpo, cada vez que hago una lectura del teclado, etc.
De esa forma puedes realizar tu codigo sin temor al reset del micro por superacion del WD.
Ojo no abuses porque creo que esta es una de las instrucciones de dos ciclos...

Lo otro a tener en cuenta es tratar los errores de comunicacion de la USART, porque si tambien interrumpes por Timer0 vas a tener un tiempo adicional entre medio de la recepcion de un caracter (recordar a Murphy y sus leyes), que hara que se bloquee la comunicacion.

Y aqui te di una punta de lo que debe hacer tu rutina Wait, es un loop de espera de caracteres que activa el reset del WD y revisa errores de la USART....
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 12 de Abril de 2004, 16:20:00
Ahhh !

Me olvidaba.
Para resetear el wd, la instruccion es CLRWDT, del set de instrucciones de asm.
En Basic tienes una forma de obligar al compilador a usarlo o no, creo que por defecto lo usa...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 12 de Abril de 2004, 19:14:00
mientras ponía copitas...
ya me he creado al menos en papel, una idea de la rutina command.com, o interprete de comandos...
asi a primera vista, parece que puede llegar a funcionar....
en lo que llego a casa, me pongo a trabajar con ella....

sobre el tema del timer y el wartdog, me he perdido un poquillo...
y por lo que comentas, puede ser un poco peligroso... y algo mas dificil.... pero llegaré a entenderlo al 90%
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 14 de Abril de 2004, 13:32:00
funciona!!!!!!!!!!!!!!
He tenido que hacer algún que otro retoque, porque en papel, las cosas no son igual, pero funciona bien, al menos de momento...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 14 de Abril de 2004, 18:28:00
nueva pregunta...
en el código que dejó Marques

http://www.melabs.com/resources/samples/x1/pbp/serbufAx.bas

utiliza un buffer de reccepción de 30 caracteres tipo byte
yo he incrementado el valor a 64, que es el valor maximo si no me equivoco de una variable array tipo byte
Bueno, mi idea, es incrementar el buffer a 128 o mas...
Es posible???
bueno, haciendo 2 variables array de 64, ya tendría el doble de buffer, y haciendo una pequeña modificación al codigo, sería biable...
Pero???
hay alguna forma de hacerlo directamente sobre la misma variable??

hay alguna forma de detener la recepción, interpretar datos, y volver iniciar la recepción para rellenar el buffer, sin arriesgarme a tener errores o saturar el buffer del dispositivo externo???

Influirá mucho en el consumo de memoria el crear 2, 3 o 4 variables para incrementar el buffer???

Como puedo calcular la memoria utilizada al declarar las variables? y saber la que me sobra para declarar mas???



Pero como se nota que soy novato...
TNKS.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 15 de Abril de 2004, 16:37:00
Antes de nada siento estar tan perdido y no poder dedicarle tiempo a mis aficiones pero hay otras cosas importantes que me comen dmasiado tiempo.

Ahora por partes...

Simular wait si usas la recepcion en un buffer y por interrupciones no tiene ningun sentido. La intencion del wait en el comando de recepcion serie del pbp es para evitar que si no recibes nada en el puerto el programa se quede detenido por siempre, de esa manera le puedes decir que esperas recibir algo y si no lo comienzas a recibier en cien milisegundos ( por ejemplo ) le das una pasada al resto del programa y lo vuelves a intentar. Si estas recibiendo caracter a caracter por medio de una interrupcion no necesitas quedarte parado en una linea del programa a la espera de los datos asi que deduce tu mismo porque el simular el wait no tiene sentido.

El tamaño maximo de los arrays en pbp para el tamaño byte depende unica y exclusivamente de la memoria del pic que estes usando. Es decir si tienes un pic con 84 posiciones de ram nunca podras tener un buffer de 64 bytes ¿OKAPA? lo que es muy importante es que los arrays deben encontrarse en un mismo banco de memoria  en los pics de 12 bits, 14 bits y en la serie 17Cxxx en los pics de la serie 18Xxxx pueden ser tan grandes como RAM tengas (todo esto lo pone en el manual ¿EH? ).

No necesitas detener la recepción para nada, pero si es absolutamente necesario ( si no te da tiempo a procesar los datos recibidos ), puedes hacer una interrupcion por hardware como ya te comente en el anterior mensaje.

Suerte y me algro de que te vaya bien.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 15 de Abril de 2004, 20:23:00
Gracias Marques

A ver... estoy utilizando una pic16f876 y es posible que migre a la 877, aunque creo recordar, que la unica diferencia, radica en que tiene mas puertos...

Sobre el tema del wait.. Ya llegué a la misma conclusión que tu comentas...
lo que he hecho, es crear la variable
buffer var byte[63]
en vez de usar el
buffer_size que pone en el programa que me dejaste de ejemplo,
en el cual se define a 30

Bueno, el problema, es que como mi idea, es poder conectarme a cualquier maquina que envie tramas por puerto serie, no se exactamente la cantidad de caracteres, que puedo llegar a recivir...
ahora en principio, como estoy empezando, pues lo que hago, es leer comandos mandados por mi desde el hiperterminal... y no superan los 30 caracteres...
pero????
y si una máquina, manda una trama de 500 caracteres??? y al programa, no le da tiempo a interpretar antes de ir vaciando el buffer???
BUFFER OVERRUN!!!
Me he hecho un pequeño programa en VB, para ver que es lo que pasaba, y al mandarle una trama de golpe de mas del tamaño del buffer.... El buffer se satura... Y!!! BUFFER OVERRUN....
Si le meto comandos a mano.. como mis dedos van muy despacito... Nuca llego a saturar el buffer...
definí el tamaño del array de buffer a 63, creyendo que era el tamaño máximo que podia definir, y aparentemente, todo funciona bien si mando datos a mano....

Pero??? como puedo ampliar el tamaño del buffer??? hasta por ejemplo 500???
cual el el tamaño maximo con el que puedo declarar el array buffer??? en un 16f876???
Cual es el tamaño recomendado???
De que modo puedo gestionar el buffer de un modo mas inteligente,  sin usarun control de flujo por hardware???

Muchas gracias!!!
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 16 de Abril de 2004, 13:17:00
Vamos a ver hombre que hay que leerse los manuales de los chips, pero en este caso y sin que sirva de precedente te voy a hacer yo los deberes.

Segun la hoja que te de datos del 876/877, puedes ver que en el Bank0 tienes 96 bytes consecutivos de RAM disponibles y en los otros bancos mas o menos lo mismo pero organizados de forma rara.

Asi que el maximo tamaño del buffer puede ser de 96 Bytes.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 17 de Abril de 2004, 14:52:00
Gracias marques, lo que me pasa, es que tengo un pequeño problema de entendimiento con los datasheet....
Vamos, que no me entero de la mitad de lo que leo...
Gracias por hacerme los deberes....

Este problema, viene, por no empezar a aprender desde el principio, como todo el mundo...
SIEMPRE EMPEZANDO LA CASA POR EL TEJADO!!!!

Y luego vienen, estas dudas existenciales....

bueno, y sobre el tema que comenté antes, que solución me darías en el caso de recivir mas datos de los que el buffer pueda aguantar???

y pregunta de novato...
si dimensiono el array con los 96 caracteres que el banco 0 me permite.... Voy a dejar un poco falto de memoria al pic para otros menesteres no????

TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 19 de Abril de 2004, 07:35:00
En realidad hay cuatro bancos, hablo de memoria ya que ahora no tengo el datasheet a mano, el primer banco tiene 96 Bytes, el segundo y el tercero tienen 80 bytes mas los 16Bytes sepueriores del banco uno reflejados mas otros 16 bytes añadidos en la parte inferior y el cuarto banco ( creo recordar ) que tiene 80 bytes mas los 16Bytes sepueriores del banco uno reflejados.

Lo de los 16 bytes reflejados quiere decir que estes en el banco que estes, si intentas leer o escribir en alguno de los 16 bytes superiores, siempre vas a acceder a lo mismo, a lo del banco uno. Esto es muy interesante pues te permite acceder a esas posiciones de memoria sin importar en que banco de memoria te encuentras.

En cuanto a tu proyecto, es muy majo, pero yo qde vez en cuando necesito espiar los buses de comunicaciones para descifrar un protocolo, o bien para localizar problemas de comunicaciones y siempre lo he hecho con un ordenador ( Macintosh o Pc ) y un programa de comunicaciones, de hecho hay varios programas especificos para esta funcion incluso como freeware. Ten en cuenta que a veces hay que analizar bloques de comunicaciones de cientos e incluso miles de caracteres y que eso nunca lo podras hacer con un simple pic. POdrias poner memoria RAM externa y almacenar los datos temporalmente... pero seria complicar mucho el tema y es como esos que se compran un opel corsa y le ponen alerones y pegatinas por todos los lados, queda "muy majo"  pero nunca haran lo que un verdadero deportivo. Asi que si lo estas hacienmdo como un ejercicio para tu autoformación, perfecto. Si lo que quieres es una herramienta de trabajo fiable que te ayude a soluciones futuros problemas, pues ¿ que quieres que te diga ? gastate 10Euros en un programa shareware y como el Pc ya lo tienes, pues bueno, pues eso, que al cesar lo que es del cesar y al pic lo que puede hacer.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 19 de Abril de 2004, 17:25:00
gracias marques....
Bueno, la idea,que me das es buena, y como muy bien dices, la idea es un proyecto para aprender, pero me tomo los proyectos como retos, y hasta que no los hago funcionar, no paro....
pensando este fin de semana, me he puesto a conectar de nuevo el circuito con el modem, y he visto que las tramas, no son demasiado largar, como para saturar el buffer, menos en el caso de recepción de un SMS.
en este caso, el pic, recive una trama algo mas larga que el buffer... y CRASH!!!!

la trama es algo como
+CMT: "+34609090909", 0,0,0, "A ver si capturo el contenido del SMS y hago funcionar mi idea.... "
con un buffer de 30 bits, el buffer se satura....

alguna idea, de como puedo desglosar la recepcción??? para poder extraer el numero de telefono?? y el contenido del sms???
sin saturar el buffer???

Por una parte, el handler de interrupción, me va llenando el buffer
y por otra parte, en el módulo principal, estoy gestonando la entrada del comando +CMT como comando valido

una vez que detecto el comando válido, actuo en consecuencia,  y desgloso la trama para separar el numero de telefono, y el contenido, y guardarlo en la eeprom interna del pic...

pero lo que no se, es si al ser el contenido del sms, mas grande que el buffer, será posible ir limpiando buffer segun le van entrando los datos y desglosando los datos al mismo tiempo....

Vamos, que estoy un poco perdido...
aun estando muy contento de haber conseguido que la recepción por uart, me funcione...

TNKS


Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 19 de Abril de 2004, 17:30:00
se me olvidaba....
Una preguntilla maslll

Me gustaría poder gestionar los tiempos de funcionamiento del programa de un modo, mas o menos real
pero al activar la interrupción del timer0, el programa, empieza a hacer cosas raras....
hay alguna idea de como puedo incrementar el código que me mandaste, para poder habilitar el timer0, y gestionar los tiempos???

TNKS
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 21 de Abril de 2004, 04:50:00
Bueno, el problema principal consiste en ir vaciando el buffer por lo menos a la misma velocidad que se va llenando, mejor si es algo mas rapido

Las soluciones son basicamente dos, o procesas los datos mas rapidos, o los recibes mas lento. Así que o bien mejoras tus algoritmos de parseado ( toma palabro ) y analisis del texto recibido o fuerzas al modem a que se comunique a una velocidad mas baja. Tampoco es mala idea usar un pic mas rápido.

Yo recuerdo hace años que en un proyecto me vi obligado a poner un Z80 ( que tiempos aquellos ) para control de todo el sistema y otro mas con una ram de 2Kbytes y un UARTpara poder soportar los bloques de informacion que me llegaban a veces. Una solución´puede ser usar una memoria externa de 1Kbye y usarla como tampon o buffer.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 21 de Abril de 2004, 09:18:00
JEJE...
Yo también empecé con el Z80...
Y recuerdo lo que me costó aprender lo poco que nos enseñaban en clase...
Y lo que mas recuerdo es lo de tener que convertir el programa a mano a HEX, y luego meterlo el entrenador... PUFFFF... Que suplicio.....


Bueno, a lo que ivamos....
La idea que me das, es la que mas o menos estaba empezando a enfocar...
Mi idea es, dado que el pic, lo tengo trabajando a 20Mhz, y depuro las funciones de interprete de comandos al maximo, hacer una lectura en tiempo real... Vamos como si el pic fuese multitarea...

Me explico....
en el módulo principal... El pic, hace sus cositas.. Lee, los pines del portb, enciende los del porta... o lo que sea...
y cada determinado tiempo, entro en la rutina de detección de comando serie....
Bueno, la idea, es la siguiente....
Una vez que entro en la interrupción,  comparo el tamaño del buffer, y si es mayor que 2 caracteres, que es el comando mas corto que he puesto (SI/NO), entonces, lanzo la llamada a la función de interprete de comandos....
Pero claro... hay que hacerlo fuera del handler, para que no se me meta en modo recursivo....

asi que la idea a sido la siguiente.
En la función de interprete de comandos, le he puesto un flagBit para controlar si estoy o no en ella.
Al entrar, lo pongo a 1 y al salir del interprete, lo pongo a 0.
Bueno, pues si recivo datos de la usart estando en esta función, da igual, porque cogemos los datos, los metemos en el buffer, y seguimos con el proceso de la función, que a su vez, va limpiando según interpreta.

pero la idea, es que si no estoy en la función interprete, al entrar en el handler, llenar el buffer, comparar el tamaño, y si es mayor que 2, y el flagbit del interprete esté a 0 entonces esto significa, que tengo datos a interpretar y que no los estoy interpretando, asi que saltamos a la función interprete de comandos....

aqui es donde está mi pequeña duda....
Como hago, para llamar a la función interprete de comandos, fuera del handler, pero de un modo directo????

No se si me he explicado.... Espero se entienda la idea principal de mi exposición....
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 21 de Abril de 2004, 16:48:00
amo a ve" que m"e peddio, peddio de noencotra"me.

Por lo que dices perece que el analisis de lo recibido lo haces en la interrupcion asi como el verificar si tienes datos en el buffer. Yo sinceramente y a no ser que el programa me lo exigiera, la comprobacion del estado del buffer y su analisis lo haria fuera de la interrupcion. Yo compruebo el estado del buffer en el bucle principal, y si veo que tengo suficientes datos como para analizar, entonces salto a una rutina en la que analizo lo recibido y tomo decisiones en funcion de esto. De esta manera tengo siempre al chip en background, por la interrupción, recibiendo datos y poniendolos en el buffer.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 21 de Abril de 2004, 20:22:00
Realmente!!! Me he explicado mal....

Lo que hago, es exactamente lo que dices....
almaceno datos en el buffer por medio de la interrupción, y en el programa principal, los interpreto, pero mi duda, está en si al programa principal, le dará tiempo a leer un comando grande, como pueden ser 100 caracteres, e ir vaciando el buffer al mismo tiempo, para no saturarlo... trabajando dentro del bucle del programa principal...

la idea, es gestionar unicamente el llenado y el tamaño del buffer en la interrupción, y si el buffer cumple con caracteres suficientes, dejar lo que hace el programa principal e ir a la función de interprete de comandos... y luego volver a trabajar en el programa principal....

algo asi como hacer un
if lenBuffer > 5 then call command_com
en determinadas partes del programa principal
de este modo, puede funcionar, pero la idea, es que la llamada, fuese inteligente, y no dependiese de comprovaciones constantes...

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 27 de Abril de 2004, 14:48:00
Creo que tu error esta por aqui:
while (bufchar <> 34) or (cont < 10)

Yo lo escribiria asi, por el tema del orden de asignaciones y precedencias:

while ((bufchar <> 34) or (cont < 10))

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Abril de 2004, 15:30:00
El error, está en el parentesis para definir la doble comparación....

Mira que lo he pensado, y me he venido al trabajo con la duda, sin probarlo....

Me meto a hacer cosas complicadas, y cometo fallos en las cosas mas simples!!!

Tnks MGL

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Abril de 2004, 15:41:00
y para colmo, tengo el mismo error en la siguiente función que he creado....

una vez que con la anterior función leo los datos del buffer,
lo que hago, es comparar la cadena con una lista de comandos creada en la eeprom del pic....
Y plash!!!!
con el mismo error... en vez de comparar la matriz de datos de 25 caracteres....
me recorre toda la memoria....

Creo que va siendo hora de tomarme unas pequeñas vacaciones!!!!

Ahora la pregunta del millón......
Estoy utilizando un 16f876...
y creo que es posible que llegue a las 2000 Words, sin tener completado el programa....
Y creo que dentro de las 16f8xx.. No hay ninguna con mas memoria...



Hay alguna pic con la misma disposición de puertos, con mas memoria????

Creo que me va a tocar depurar mas el programa....
CADA VEZ SE HACE MAS GRANDE!!!!
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Abril de 2004, 15:45:00
Voy a tener que cambiarme el NICK a
DrQUESTIONS!!!

Cuantas llamadas a funciones mediante call/gosub, pueden ser anidadas???
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 27 de Abril de 2004, 17:36:00
El 16F876 tiene 8KWords de programa, solo debes paginarlas correctamente o dejar que lo haga el PBP....
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MGLSOFT en 27 de Abril de 2004, 17:38:00
Call/Gosub en ASM puedes anidar hasta ocho ese es el maximo nivel de pila del ensamblador, pero ojo, si estas mezclando asm y basic usa solo 4 niveles, que es el maximo del PBP...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Abril de 2004, 18:46:00
Gracias MGL
Con saber que puedo anidar 4 llamadas a funciones desde PBP, me sirve.
De momento, no necesito anidar mas de 3

Sobre el tema del tamaño del pic...
El problema, me lo da el microcode studio.
Cuando le doy a compilar... ahora me dice que estoy utilizando 1560 Words...
y en cuanto me paso de las 2000, me dice, que no se puede compilar... O algo asi, creo recordar. sabes donde puede estar el problema???
Porque con 2000 me quedo corto, pero con 8000 me sobraría espacio considerablemente.

Ahora surge la duda, de si es problema del microcode studio, o un problema mio de entendimiento...
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 27 de Abril de 2004, 21:35:00
gosub getbuf ":
while (bufchar <> 34) "leemos buffer hasta encontrar las primeras "
 gosub getbuf ""
wend
cont = 0
gosub getbuf "capturamos el primer caracter del ID
   while ((bufchar <> 34) or (cont < 12)) "leemos el buffer hasta encontrar las siguientes " o que el contador sea 11
      write cont , bufchar
        gosub getbuf
      cont = cont + 1
   wend

Asi no me funciona!!!
while ((bufchar <> 34) or (cont < 12))
Si embargo si solo le pongo la comparación por codigo 34, si funciona
while (bufchar <> 34)

será que en PBP, no está permitida la doble comparación en el while???
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Sispic en 28 de Abril de 2004, 00:19:00
Anda Abago , buscate algun 18f252 / 452 . que ya hemos superado el año 2.000.
Tendras mas memoria , mas words , mas velocidad , se ababaron las pajinaciones y ...mas...mass. +++++++++++++

Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 29 de Abril de 2004, 22:42:00
Gracias sispic
Ya me he informado un poquito...

Ahora!!!
PREGUNTA!!!
--------------------------------
tmp = 0
inicio:
        high PORTB.7              
        pause 10                  
        low PORTB.7
        pause 25                  
        gosub capturaterminal
goto inicio      


capturaterminal:

while (INDEX_IN <> INDEX_OUT)
high portb.1
 gosub getbuf
 write tmp, bufchar
 tmp = tmp + 1
low portb.1
wend
return
-----------------------------------------------
Ahora, teniendo en cuenta la base del programa que colgó Marques, para gestionar la usart en ASM...
tengo un problema...
trabajando con el hiperterminal...
empiezo a escribir el ABCDARIO....
saco el pic del circuito, Lo leo y en la eeprom tengo un bonito listado del abecedario... FUNCIONA!!!!!

ahora mi sorpresa.... conecto un modem
llamo desde mi movil, a la linea en la que está conectado el modem
detecto que lee algún dato, al ver parpadear el led de portb.1
sabo el pic del circuito, lo leo, y sorpresa... me ha leido el comando ring...
este comando, va acompañado del parrafón del identificador de llamada...
para amargar la existencia a mi circuito... he dejado el buffer a 10 caracteres... Entonces al entrar una llamada al modem, consigo leer parte de los datos, en grupos de 10 elementos, pero parece que el pic, no tiene fuerza, para pillar al buffer y limpiarlo, según vamos procesando el módulo principal... Y mira que es sencillo...


Alguna idea???


Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 01 de Mayo de 2004, 05:58:00
Escrito originalmente por Abago

El problema, me lo da el microcode studio.
Cuando le doy a compilar... ahora me dice que estoy utilizando 1560 Words...
y en cuanto me paso de las 2000, me dice, que no se puede compilar... O algo asi, creo recordar. sabes donde puede estar el problema???
Porque con 2000 me quedo corto, pero con 8000 me sobraría espacio considerablemente.

Ahora surge la duda, de si es problema del microcode studio, o un problema mio de entendimiento...


Creo que te refieres a un mensaje que te indica que has sobrpasado las 2048 palabra, pero no es un error sino simplemente una indicacion. El programa te compilara correctamente.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 01 de Mayo de 2004, 09:49:00
Gracias por tu aclaración marques....
Bueno, realmente, debería darte las gracias por al menos un 60% del proyecto... Que fue el código de gestión de USART en asm...
Gracias a vuestras aclaraciones, y comentarios, parece que la cosa empieza a funcionar....
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 02 de Mayo de 2004, 06:52:00
Escrito originalmente por Abago
Gracias por tu aclaración marques....
Bueno, realmente, debería darte las gracias por al menos un 60% del proyecto... Que fue el código de gestión de USART en asm...
Gracias a vuestras aclaraciones, y comentarios, parece que la cosa empieza a funcionar....



Las gracias no me las des a mi sino a MPLABS que no solo han creado en compilador de Basic sino que ademas en su web tienen una cantidad de informacion muy interesante.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: todopic en 02 de Mayo de 2004, 13:07:00
MPLAB  and MELABS --->MPLABS


Norberto
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: manu2097 en 04 de Mayo de 2004, 15:10:00
Hola, siento las molestias, pero acabo de retomar el tema de intentar utilizar la usart con interrupciones mediante picbasic y cuando pruebo este programa en el pic se queda bloqueado cuando le entra un carácter por el serie, creo que es por culpa de la interrupción. No llega a encender el led que está en el portb.6 que es la primera instrucción que hay en la rutina cuando salta la interrupción del buffer de recepción lleno.  Después de encender el led quiero que vuelva a enviar por el serie el carácter que le ha llegado pero lo dicho, el pic se queda bloqueado.

"programa simple para saber si consigo que funcione la USART con interrupción.

define OSC 20
include "bs2defs.bas"
DEFINE LOADER_USED 1
ADCON1=6

"inicializamos la USART
        TRISC = %10111111       " Set TX (PortC.6) to out, rest in
        SPBRG = 64              " establece el baud rate a 4800 asíncrono con velocidad baja
        RCSTA = %10010000       " activamos el puerto serie y la recepción continua
        TXSTA = %00100000       " transmisión habilitada


INTCON = %11000000      " activamos las interrupciones y las de periféricos
ON INTERRUPT GoTo serie      " Declare interrupt handler routine
PIE1.5 = 1            " activamos la interrupción de recepción de la USART  

char var byte

loop:
    high portb.7
    pause 100
    low portb.7
    pause 100
goto loop

enable

serie:
    high portb.6
    hserin [char]
    hserout [char]
    if PIR1.5=1 then serie
resume

disable

end
     
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: manu2097 en 05 de Mayo de 2004, 03:15:00
perdonad, ya he encontrado el error, se me ha ido la chapa y he puesto  enable  y luego disable, y no es así primero disable y luego enable, por eso cuando se activa la interrupcion se queda bloqueado por que no puede entrar a la rutina de interrupción.

Ahora el problema que tengo es que cuando mando muchos caracteres se me bloquea supongo que será por el tema de saturación del buffer
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: MarquesSalsero en 05 de Mayo de 2004, 03:46:00
Jo, otra vez que se demuestra que los teclados y yo estamos peleados.

No queria decir MPLABS sino MELABS.

Algun dia aprendere a escribir con lago mas de dos dedos y a no confundir las letras ( lo que es un gran problema al programar).
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 05 de Mayo de 2004, 12:22:00
manu, hechale un vistazo al código que dejé colgado hace varios post.
Creo que te puede ser de utilidad, para mejorar el funcionamiento de la usart.
Y sobre todo, te recomiendo que te leas los link que dejó nuestro amigo marques en la primera página del post.
Tienes un ejemplo en asm, que es como lo estoy tratando yo...
Y otro en PBP.
Estos ejemplos hacen lo que aparentemente necesitas, con la salvedad de que no encienden el led.

Un saludo, y espero que aprendas tantas cosas como yo he aprendido, gracias a nuestros amigos Marques, sispic y MGL...
Si me dejo alguno, que se de por aludido...

Para cualquier duda, ya sabes donde estamos.
Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 07 de Junio de 2004, 23:06:00
Retomando la conversación.....

http://www.melabs.com/resources/samples/x1/pbp/serbufAx.bas

Viendo el código que se maneja en el ejemplo del anterior link....
Mi idea para no hacer demasiado complicado la depuración es....
Omitir el display, y sacar los datos por TX... hacia el hiperterminal...
Una vez hecho eso...
Necesito habilitar la interrupción por rb0, y crear una rutina que cuente segundos por medio del timer...
y que saque el valor decimal del contador por TX cada 10 segundos...
mientras tanto, que administre los datos que entran al buffer... y sacarlos por TX en tiempo real....

Ale MGL, retomamos la conversación por aqui....
Y si alguen consigue modificar el código que posteo marques, para que funcione con la detección de int por timer... Que lo comente...





Título: RE: HSERIN & HSEROUT - Todo un dilema...
Publicado por: Abago en 10 de Agosto de 2004, 10:19:00
la solución a tu problema, está en utilizar el código que puso marques al principio del post...

yo empecé con problemas similares a los que planteas... y la solución fué crear un buffer fifo, que almacene los datos que llegan a la usart... con esto conseguimos ampliar el buffer de 2 bytes de la usart, a los bytes que te sean necesarios....
luego en el modulo de interrupciones, solo tienes que pasar los datos del buffer de la usart, al fifo... para interpretarlos luego en tu programa principal...