Reset en Picsimulator Ide

Estimados colegas,

estoy realizando un programa en picsimulator ide todo anda de maravillas el proyecto consiste en manejar varios servo motores a distancia para lo cual estoy utilizando el UART integrado de los PICs que son los 16F876A el problema surge cuando le envio varios comandos se bloquea el receptor y deja de responder lo reseteo y problema resuelto estaba pensando en hacer un reset automatico del programa cada 1 segundo si alguien me pudiera orientar como realizar esto se lo agradeceria.:confused::confused::confused:

saludos(y)
 
El problema surge cuando le envió varios comandos, se bloquea el receptor y deja de responder, lo reseteo y problema resuelto.
Estaba pensando en hacer un reset automático del programa cada 1 segundo.
Si alguien me pudiera orientar cómo realizar esto, se lo agradecería.
¿Y si usas el Watch Dog Timer?
 
¿Y si usas el Watch Dog Timer?

Gracias por responder, no he usado nunca el watch dog.
¿Si pudieras explicarme en que consiste y algún ejemplo?

Mi código es el siguiente:

transmisor:
Código:
Define CONF_WORD = 3f72h
Define CLOCK_FREQUENCY = 20
Define ADC_CLOCK = 3
Define ADC_SAMPLEUS = 50
TRISA = %11111111
TRISB = %11111111
TRISC = %11111111
AllDigital
ADCON0 = %10000000  'fosc/32 para 20Mhz
ADCON1 = %10000000  'sin voltaje de referencia justificado a la derecha
Dim an0 As Byte  'tiempos para micro servo
Dim an1 As Byte  'tiempo para micro servo
Dim an2 As Byte  'tiempo servo normal
Dim an3 As Byte
Hseropen 19200
loop:
Adcin 0, an0
Adcin 1, an1
Adcin 2, an2
Adcin 3, an3


If an0 > 150 Then
Hserout 11
WaitMs 40
Endif

If an0 < 100 Then
Hserout 12
WaitMs 40
Endif

If an1 > 150 Then
Hserout 13
WaitMs 40
Endif

If an1 < 100 Then
Hserout 14
WaitMs 40
Endif

If an2 > 150 Then
Hserout 15
WaitMs 40
Endif

If an2 < 100 Then
Hserout 16
WaitMs 40
Endif

If an3 > 150 Then
Hserout 17
WaitMs 40
Endif

If an3 < 100 Then
Hserout 18
WaitMs 40
Endif

If PORTC.0 = 1 Then
Hserout 19
WaitMs 40
Endif

If PORTC.1 = 1 Then
Hserout 20
WaitMs 40
Endif

If PORTC.2 = 1 Then
Hserout 21
WaitMs 40
Endif

If PORTC.3 = 1 Then
Hserout 22
WaitMs 40
Endif

'If PORTB.0 = 1 Then
'Hserout 23
'WaitMs 40
'Endif

'If PORTB.1 = 1 Then
'Hserout 22
'WaitMs 40
'Endif

'If PORTB.2 = 1 Then
'Hserout 22
'WaitMs 40
'Endif

'If PORTB.3 = 1 Then
'Hserout 22
'WaitMs 40
'Endif

Goto loop

End

Receptor:
Código:
Define CONF_WORD = 3f72h
Define CLOCK_FREQUENCY = 20
TRISA = %00000000
TRISB = %00000000
TRISC = %00000000
AllDigital
Hseropen 19200
Dim i As Byte
Dim x As Byte
loop:

Hserin i
'Hserget i

Select Case i
    Case 11
            PORTB.0 = 1
            WaitUs 2300
            PORTB.0 = 0  'motor ojos horizontal
            WaitUs 1700
    Case 12
            PORTB.0 = 1
            WaitUs 1000
            PORTB.0 = 0  'motor ojos horizontal
            WaitUs 3000
    Case 13
            PORTB.1 = 1
            WaitUs 2300
            PORTB.1 = 0  'motor ojos vertical
            WaitUs 1700
    Case 14
            PORTB.1 = 1
            WaitUs 1000
            PORTB.1 = 0  'motor ojos vertical
            WaitUs 3000
    Case 15
            PORTB.2 = 1
            WaitUs 2000
            PORTB.2 = 0  'motor cabeza horizontal
            WaitUs 2000
    Case 16
            PORTB.2 = 1
            WaitUs 800
            PORTB.2 = 0  'motor cabeza horizontal
            WaitUs 3100
    Case 17
            PORTB.3 = 1  'motor cabeza vertical
            WaitUs 2000
            PORTB.3 = 0
            WaitUs 2000
    Case 18
            PORTB.3 = 1  'motor cabeza vertical
            WaitUs 800
            PORTB.3 = 0
            WaitUs 3100
    Case 19
            Goto loop2  'ojos abiertos
    Case 20
            Goto loop3  'ojos cerrados
    Case 21
            Goto loop4  'boca abierta
    Case 22
            Goto loop5  'alas abiertas
    Case 23
            Goto loop6  'abrir y cerrar alas
    EndSelect

Goto loop

loop2:
For x = 0 To 70 Step 1
            PORTB.4 = 1  'parpados abrir cerrar
            WaitUs 2600
            PORTB.4 = 0
            WaitUs 2400
Next x

For x = 0 To 70 Step 1
            PORTB.4 = 1  'parpados
            WaitUs 1650
            PORTB.4 = 0  'motor parpados 90°
            WaitUs 2450
Next x
Goto loop

loop3:
    For x = 0 To 70 Step 1
            PORTB.4 = 1
            WaitUs 850  'motor parpados 0°
            PORTB.4 = 0
            WaitUs 4150
    Next x

    For x = 0 To 70 Step 1
            PORTB.4 = 1  'parpados
            WaitUs 1650
            PORTB.4 = 0  'motor parpados 90°
            WaitUs 2450
    Next x
Goto loop

loop4:
    For x = 0 To 70 Step 1
            PORTB.5 = 1
            WaitUs 850  'abrir boca°
            PORTB.5 = 0
            WaitUs 4150
    Next x

    For x = 0 To 70 Step 1
            PORTB.5 = 1
            WaitUs 1650
            PORTB.5 = 0  'cerrar boca°
            WaitUs 2350
    Next x
Goto loop

loop5:
    For x = 0 To 250 Step 1
        PORTB.6 = 1  'motor alas abiertas
        WaitUs 2000
        PORTB.6 = 0
        WaitUs 3000
    Next x
loop6:
    For x = 0 To 250 Step 1
        PORTB.6 = 1  'motor alas cerradas
        WaitUs 900
        PORTB.6 = 0
        WaitUs 4200
    Next x
Goto loop
End
 
Última edición por un moderador:
Gracias por responder, no he usado nunca el watch dog.
¿Si pudieras explicarme en que consiste y algún ejemplo?
El Watchdog Timer es un temporizador que provoca un reset cuando se desborda.
Esto ayuda principalmente a que el programa salga de un cuelgue por alguna razón.
Se activa en la palabra de configuración y se configura el el registro OPTION_REG. (Bit 3 = PSA)
Por defecto tiene el máximo valor = 1:128 (Bits 2<>0 = PS2:pS0)

Entonces si usas una frecuencia de 20MHz.
Desborde del WDT a 8 Bits:
20MHz. / 4 = 5000000
5000000 / 128 = 39062.5
255 / 39062.5 = 0.006528
El desborde ocurrirá cada 6.528mS.

Una vez activo, es necesario resetearlo durante ciertas partes del programa para que no se desborde y provoque un reset.
Me parece que en PICSimulator IDE se hace de esta forma:
Código:
[COLOR=MediumTurquoise][B]ASM:        clrwdt[/B][/COLOR]
Entonces debes colocar esta instrucción antes y después de entrar al bucle donde pienses que se podrá trabar el programa.

Es importante que verifiques durante tiempo de ejecución o debug, en que partes deberás limpiar el Watchdog Timer, ya que si se deja correr, el programa se estará reseteando continuamente.

Para agregarlo en la palabra de configuración, deberás usar esta:
Código:
[B][COLOR=Blue]Define CONF_WORD[/COLOR] = 3f76h[/B]
 
El Watchdog Timer es un temporizador que provoca un reset cuando se desborda.
Esto ayuda principalmente a que el programa salga de un cuelgue por alguna razón.
Se activa en la palabra de configuración y se configura el el registro OPTION_REG. (Bit 3 = PSA)
Por defecto tiene el máximo valor = 1:128 (Bits 2<>0 = PS2:pS0)

Entonces si usas una frecuencia de 20MHz.
Desborde del WDT a 8 Bits:
20MHz. / 4 = 5000000
5000000 / 128 = 39062.5
255 / 39062.5 = 0.006528
El desborde ocurrirá cada 6.528mS.

Una vez activo, es necesario resetearlo durante ciertas partes del programa para que no se desborde y provoque un reset.
Me parece que en PICSimulator IDE se hace de esta forma:
Código:
[COLOR=MediumTurquoise][B]ASM:        clrwdt[/B][/COLOR]
Entonces debes colocar esta instrucción antes y después de entrar al bucle donde pienses que se podrá trabar el programa.

Es importante que verifiques durante tiempo de ejecución o debug, en que partes deberás limpiar el Watchdog Timer, ya que si se deja correr, el programa se estará reseteando continuamente.

Para agregarlo en la palabra de configuración, deberás usar esta:
Código:
[B][COLOR=Blue]Define CONF_WORD[/COLOR] = 3f76h[/B]

muchisimas gracias voy a programar el chip a ver si con esto soluciono el problema del freeze (y)
 
Atrás
Arriba