From dea79ec2d4c1166f0599379a62ff862a2e590fba Mon Sep 17 00:00:00 2001 From: schodet Date: Sat, 8 May 2004 12:10:57 +0000 Subject: Add: Routine de debug sur INT0. Fix: Bug de stabilité du au port série. --- 2004/n/asserv/src/main.c | 22 +++++++++++++++++- 2004/n/asserv/src/serial.c | 58 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 61 insertions(+), 19 deletions(-) (limited to '2004') diff --git a/2004/n/asserv/src/main.c b/2004/n/asserv/src/main.c index 2a1f54e..d3c90f4 100644 --- a/2004/n/asserv/src/main.c +++ b/2004/n/asserv/src/main.c @@ -76,7 +76,7 @@ Libre: a b c d e #fuses H4,WDT,WDT128,PUT,NOBROWNOUT,NOLVP #use delay(clock=40000000) #use rs232(baud=115200,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8) -#priority RDA,TBE,TIMER2 +#priority EXT,RDA,TBE,TIMER2 #include "motor.c" #include "serial.c" @@ -121,6 +121,7 @@ irq_init (void) enable_interrupts (INT_RDA); disable_interrupts (INT_TBE); enable_interrupts (GLOBAL); + enable_interrupts (INT_EXT); } void @@ -134,3 +135,22 @@ main (void) serial_send_rezet (); motor_main (); } + +#int_EXT +debug_isr () +{ + int tosl, tosh, tosu; +#asm + movf 0xffd,w + movwf tosl + movf 0xffe,w + movwf tosh + movf 0xfff,w + movf tosu +#endasm + putc ('!'); + putc (tosl); + putc (tosh); + putc (tosu); + putc (CRLF); +} diff --git a/2004/n/asserv/src/serial.c b/2004/n/asserv/src/serial.c index 784eb24..826539d 100644 --- a/2004/n/asserv/src/serial.c +++ b/2004/n/asserv/src/serial.c @@ -68,8 +68,8 @@ serial_init (void) serial_recv () { char c; - if (serial_recv_full) return; c = getc (); + if (serial_recv_full) return; if (c == '\n' || c == '\r') { /* Fin de commande. */ @@ -108,25 +108,27 @@ serial_send () /* On ne fait pas le test, normalement ne doit pas arriver. * assert (serial_send_buf_n < SERIAL_SEND_BUF_LEN); */ } - else + else if (serial_unreliable_send_full) { - if (serial_unreliable_send_full) + /* Envoie le caractère non-fiable. */ + c = serial_unreliable_send_buf[serial_unreliable_send_buf_n++]; + /* Si fin de tampon, on le libère. */ + if (c == EOB) { - /* Envoie le caractère non-fiable. */ - c = serial_unreliable_send_buf[serial_unreliable_send_buf_n++]; - /* Si fin de tampon, on le libère. */ - if (c == EOB) - { - serial_unreliable_send_buf_n = 0; - serial_unreliable_send_full = 0; - disable_interrupts (INT_TBE); - } - else - putc (c); - /* On ne fait pas le test, normalement ne doit pas arriver. - * assert (serial_unreliable_send_buf_n < - * SERIAL_UNRELIABLE_SEND_BUF_LEN); */ + serial_unreliable_send_buf_n = 0; + serial_unreliable_send_full = 0; + disable_interrupts (INT_TBE); } + else + putc (c); + /* On ne fait pas le test, normalement ne doit pas arriver. + * assert (serial_unreliable_send_buf_n < + * SERIAL_UNRELIABLE_SEND_BUF_LEN); */ + } + else + { + /* Ne devrait pas arriver, mais soyons prudent. */ + disable_interrupts (INT_TBE); } } @@ -169,6 +171,23 @@ serial_send_rezet (void) { serial_send_char ('!'); serial_send_char ('z'); + switch (restart_cause ()) + { + case WDT_TIMEOUT: + serial_send_char ('w'); + break; + case MCLR_FROM_SLEEP: + serial_send_char ('m'); + break; + case BROWNOUT_RESTART: + serial_send_char ('b'); + break; + case NORMAL_POWER_UP: + break; + default: + serial_send_char ('?'); + break; + } serial_send_char (CRLF); } @@ -194,7 +213,8 @@ serial_send_ok (void) /* Envoie un rapport d'un moteur. */ void -serial_send_motor_stat (char side, unsigned int vacc, unsigned long &e, unsigned long &pwm) +serial_send_motor_stat (char side, unsigned int vacc, unsigned long &e, + unsigned long &pwm) { serial_unreliable_send_char ('!'); serial_unreliable_send_char ('M'); @@ -240,6 +260,7 @@ serial_send_char (char c) /* Si fin de ligne, on envois. */ if (c == CRLF) { + disable_interrupts (INT_TBE); serial_send_full = 1; serial_send_buf_n = 0; enable_interrupts (INT_TBE); @@ -258,6 +279,7 @@ serial_unreliable_send_char (char c) /* Si fin de buffer, on envois. */ if (c == EOB) { + disable_interrupts (INT_TBE); serial_unreliable_send_full = 1; serial_unreliable_send_buf_n = 0; enable_interrupts (INT_TBE); -- cgit v1.2.3