Autor Tema: HSERIN & HSEROUT - Todo un dilema...  (Leído 25334 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Sispic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1700
    • winpic800
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #30 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í


Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #31 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado sebastianvera

  • PIC10
  • *
  • Mensajes: 37
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #32 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!

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #33 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

Desconectado manu2097

  • PIC10
  • *
  • Mensajes: 17
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #34 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.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #35 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.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #36 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #37 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.

Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #38 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #39 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??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #40 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!!!

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #41 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....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #42 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...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #43 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%

Desconectado Abago

  • PIC24F
  • *****
  • Mensajes: 792
RE: HSERIN & HSEROUT - Todo un dilema...
« Respuesta #44 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...