From 3bd75fa0e5b695ffb46ded75f3023f694f1f0b7b Mon Sep 17 00:00:00 2001 From: schodet Date: Sun, 16 May 2004 13:58:44 +0000 Subject: Ajout GPIO. --- 2004/n/asserv/src/main.c | 61 +++++++++++++++++++++++++++++----------------- 2004/n/asserv/src/motor.c | 48 +++++++++++++++++++++++++++++++++--- 2004/n/asserv/src/motor.h | 9 +++---- 2004/n/asserv/src/serial.c | 10 ++++++++ 2004/n/asserv/src/serial.h | 7 +++++- 5 files changed, 102 insertions(+), 33 deletions(-) (limited to '2004/n/asserv') diff --git a/2004/n/asserv/src/main.c b/2004/n/asserv/src/main.c index d3c90f4..42b0be6 100644 --- a/2004/n/asserv/src/main.c +++ b/2004/n/asserv/src/main.c @@ -27,25 +27,25 @@ /* Pattes 40 b7 : sens compteur gauche -39 b6 : libre -38 b5 : libre +39 b6 : libre -> +38 b5 : libre -> 37 b4 : sens compteur droit -36 b3 : libre -35 b2 : libre -34 b1 : libre -33 b0 : libre +36 b3 : libre -> +35 b2 : libre -> +34 b1 : libre -> +33 b0 : debug 32 Vdd 31 Vss -30 d7 : libre -29 d6 : libre -28 d5 : libre -27 d4 : libre +30 d7 : libre <- +29 d6 : libre <- +28 d5 : libre <- +27 d4 : libre <- 26 c7 : rcv 25 c6 : xmit 24 c5 : libre 23 c4 : libre -22 d3 : libre -21 d2 : libre +22 d3 : libre <- +21 d2 : libre <- 20 d1 : sens moteur gauche 19 d0 : sens moteur droit @@ -53,23 +53,27 @@ 17 c2 : pwm motor gauche 16 c1 : pwm motor droit 15 c0 : compteur droit -14 osc2 +14 a6, osc2 13 osc1 12 Vss 11 Vdd 10 e2 : libre -9 e1 : libre -8 e0 : libre +9 e1 : libre (lcd e) +8 e0 : libre (lcd rs) 7 a5 : libre 6 a4 : compteur gauche -5 a3 : libre -4 a2 : libre -3 a1 : libre -2 a0 : libre +5 a3 : libre (lcd d7) +4 a2 : libre (lcd d6) +3 a1 : libre (lcd d5) +2 a0 : libre (lcd d4) 1 /MCLR, Vpp -Libre: a b c d e - 0123-5 0123-56- ---345-- --234567 012 +Libre: a b c d e + ....-5- ....-..- ---345-- --...... ..2 + ooooiii ioooiooi iooiiioi ooiiiiii ooi + + - : occupé par la carte d'asservissement. + . : occupé par les bonus (debug, gpio, lcd). */ /* Configuration générale. */ @@ -77,6 +81,10 @@ Libre: a b c d e #use delay(clock=40000000) #use rs232(baud=115200,xmit=PIN_C6,parity=N,rcv=PIN_C7,bits=8) #priority EXT,RDA,TBE,TIMER2 +#use fast_io(A) +#use fast_io(B) +#use fast_io(D) +#use fast_io(E) #include "motor.c" #include "serial.c" @@ -85,6 +93,15 @@ Libre: a b c d e void main_init (void) { + /* Comfiguration des GPIO. */ + output_a (0x00); + set_tris_a (0xf0); + output_b (0x00); + set_tris_b (0x91); + //set_tris_c (0xb9); + set_tris_d (0xfc); + output_e (0x00); + set_tris_e (0x04); /* Configuration de la liaison série. */ setup_psp (PSP_DISABLED); /* Configuration de l'interface SPI : non utilisée. */ @@ -121,7 +138,7 @@ irq_init (void) enable_interrupts (INT_RDA); disable_interrupts (INT_TBE); enable_interrupts (GLOBAL); - enable_interrupts (INT_EXT); + disable_interrupts (INT_EXT); } void diff --git a/2004/n/asserv/src/motor.c b/2004/n/asserv/src/motor.c index 242ff74..aab34cf 100644 --- a/2004/n/asserv/src/motor.c +++ b/2004/n/asserv/src/motor.c @@ -50,6 +50,10 @@ unsigned int motor_stat_delay; /* Delay between stats. */ unsigned int motor_stat_delay_cpt; /* Delay counter. */ short motor_cpt; /* Report motors counters. */ +/* Entrées. */ +unsigned int motor_gpi_delay; /* Delais entre deux envois. */ +unsigned int motor_gpi_delay_cpt; /* Compteur. */ + /* Moteurs. */ signed int motor_g_vdes, motor_g_vacc; /* Vitesse désirée, actuelle. */ signed int motor_d_vdes, motor_d_vacc; @@ -83,6 +87,8 @@ motor_init (void) motor_stat_delay = 0; motor_stat_delay_cpt = 0; motor_cpt = 0; + motor_gpi_delay = 0; + motor_gpi_delay_cpt = 0; motor_g_vdes = 0; motor_g_vacc = 0; motor_d_vdes = 0; motor_d_vacc = 0; motor_g_cpt_av = 0; motor_g_cpt_ar = 0; @@ -389,11 +395,19 @@ motor_main (void) } } /* Accélère. */ - if (!--motor_a_cpt) + if (motor_a) + { + if (!--motor_a_cpt) + { + motor_update_left_speed (); + motor_update_right_speed (); + motor_a_cpt = motor_a; + } + } + else { - motor_update_left_speed (); - motor_update_right_speed (); - motor_a_cpt = motor_a; + motor_g_vacc = motor_g_vdes; + motor_d_vacc = motor_d_vdes; } } /* Le reste. */ @@ -413,6 +427,15 @@ motor_main (void) serial_send_motor_cpt (motor_g_cpt, motor_d_cpt); serial_unreliable_send_eob (); } + /* GPI. */ + if (motor_gpi_delay) + { + if (!--motor_gpi_delay_cpt) + { + serial_send_gpi (input_d ()); + motor_gpi_delay_cpt = motor_gpi_delay; + } + } } motor_pid_int++; } @@ -422,6 +445,7 @@ motor_main (void) short motor_parse (void) { + int temp; switch (serial_recv_com ()) { case 'v': @@ -472,6 +496,22 @@ motor_parse (void) motor_toggle_asservi (); serial_send_ok (); return 1; + case 'h': + serial_recv_int (motor_gpi_delay); + motor_gpi_delay_cpt = motor_gpi_delay; + serial_send_ok (); + return 1; + case 'k': + serial_recv_int (temp); + output_b (temp); + serial_send_ok (); + return 1; + case 'D': + serial_recv_int (temp); + if (temp == 0x42) + enable_interrupts (INT_EXT); + serial_send_ok (); + return 1; default: return 0; } diff --git a/2004/n/asserv/src/motor.h b/2004/n/asserv/src/motor.h index d19bc4f..ac94c39 100644 --- a/2004/n/asserv/src/motor.h +++ b/2004/n/asserv/src/motor.h @@ -71,12 +71,9 @@ motor_g_pwm (signed long &pwm); void motor_d_pwm (signed long &pwm); -/* Interruptions de comptage moteur. */ -#int_EXT -EXT_isr(); - -#int_EXT1 -EXT1_isr(); +/* Met à jour les compteurs. */ +inline void +motor_update_cpt (void); /* Interruption de PID. */ #int_TIMER2 diff --git a/2004/n/asserv/src/serial.c b/2004/n/asserv/src/serial.c index 826539d..06b00c8 100644 --- a/2004/n/asserv/src/serial.c +++ b/2004/n/asserv/src/serial.c @@ -248,6 +248,16 @@ serial_send_motor_ttl (void) serial_send_char (CRLF); } +/* Envois la valeur des entrées gpi. */ +void +serial_send_gpi (int gpi) +{ + serial_send_char ('!'); + serial_send_char ('H'); + serial_send_int (gpi); + serial_send_char (CRLF); +} + /* Envoie un caractère. */ void serial_send_char (char c) diff --git a/2004/n/asserv/src/serial.h b/2004/n/asserv/src/serial.h index 12fb564..99131c3 100644 --- a/2004/n/asserv/src/serial.h +++ b/2004/n/asserv/src/serial.h @@ -79,7 +79,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); /* Envois les compteurs moteurs. */ void @@ -89,6 +90,10 @@ serial_send_motor_cpt (signed long &g, signed long &d); void serial_send_motor_ttl (void); +/* Envois la valeur des entrées gpi. */ +void +serial_send_gpi (int gpi); + /* Envoie un caractère. */ void serial_send_char (char c); -- cgit v1.2.3