The dsPic33 and FLEX board Paolo Pagano
RETIS Laboratory, Scuola Superiore Sant'Anna, Pisa, Italy
p.pagano@sssup.itCorso di Sistemi in Tempo RealeLaurea in Ingegneria dell‘Automazione a.a. 2008-2009
The dsPic33 and FLEX board Paolo Pagano
RETIS Laboratory, Scuola Superiore Sant'Anna, Pisa, Italy
p.pagano@sssup.it
Corso di Sistemi in Tempo RealeLaurea in Ingegneria dell‘Automazione a.a. 2008-2009
Course Outline (1/2)
Second day (24th)
FSM implementation in C (slides by prof. Di Natale)
A case study
Real Hardware demonstration
Outline
http://feanor.sssup.it/~pagano/personalWEB/courses.htm Introduction to the FLEX board
A FSM instantiation on the FLEX
Visit the web site:
FLEX
embedded boards idea:
cheap, small, easy-to-use evaluation boards
Typical applications:
industrial sensing and control
small robots
wireless sensor networks
demo boards for university labs
multibus 1 - Serial port 2
(RS232 / RS422 /
RS485 / TP-UART)
2 - Serial port 1
(RS232 / RS422 /
RS485)
3 - CAN port 1
4 - CAN port 2
5 - I2C port
6 - SPI port
7 - 10Mbit Ethernet
8 - RJ45 Ethernet
Our test device
It is an extended basic flex board;
We connected the dsPic33 core to:
Set of buttons (input);
Set of leds (output);
LCD display (status display).
We have in mind to simulate an elevator controller:
its implementation starts from FSM modeling;
the model is validated by OTS tools (Uppaal);
the code generation is done by hand.
How to program our device
MPLAB_C30 gld script Microchip ICD2
COFF file structure
http://delorie.com/djgpp/doc/coff/
Peripheral Mapping
MCU I/O
A port is a set of analog/digital enabled pins.
A port can be configured to catch analog or digital inputs. Digital signals can have a duration (like those generated by pushing buttons) or can be “levels” (latch mode).
of course finite signals must be caught while high.
How to configure ports
Configuring a port for INPUT:
void initButtons (void)
{
TRISGbits.TRISG6 = 1;
TRISGbits.TRISG7 = 1;
TRISGbits.TRISG8 = 1;
TRISGbits.TRISG9 = 1;
}
4 Buttons 16 pels of the LCD dsPic has 7 ports defined in the included header:
#include "p33FJ256MC710.h" Configuring a port for OUTPUT
void initLeds (void)
{
TRISDbits.TRISD0 = 0;
TRISDbits.TRISD1 = 0;
TRISDbits.TRISD2 = 0;
TRISDbits.TRISD3 = 0;
TRISDbits.TRISD4 = 0;
TRISDbits.TRISD5 = 0;
TRISDbits.TRISD6 = 0;
TRISDbits.TRISD7 = 0;
TRISDbits.TRISD8 = 0;
TRISDbits.TRISD9 = 0;
TRISDbits.TRISD10 = 0;
TRISDbits.TRISD11 = 0;
TRISDbits.TRISD12 = 0;
TRISDbits.TRISD13 = 0;
TRISDbits.TRISD14 = 0;
TRISDbits.TRISD15 = 0;
}:
How to read/write ports
Reading INPUT:
int getButton ( int j ){
switch (j){
case 0:
return !PORTGbits.RG6;
case 1:
return !PORTGbits.RG7;
case 2:
return !PORTGbits.RG8;
case 3:
return !PORTGbits.RG9;
}
}
Writing OUTPUT:
void setLed ( int led, int on_off ){
switch (led){
case 0:
LATDbits.LATD0 = on_off;
break;
case 1:
LATDbits.LATD1 = on_off;
break;
case 2:
LATDbits.LATD2 = on_off;
break;
case 3:
LATDbits.LATD3 = on_off;
break;
}
}
the end
Questions ?
HOWTO initialize and transit
init transition signal generation static enum State {
IDLE, S0, S1, S2, S3
};
static enum Signal {
ABSENT, GO_TO_S0, GO_TO_S1, GO_TO_S2, GO_TO_S3
};
void FSMInit(FSM *me){
me->state_ = IDLE;
}
void FSMTran_(FSM *me, unsigned int dest)
{
me->state_ = dest;
} enum Signal FSMGetSignals(FSM *me){
if (b0)
return GO_TO_S0;
else if (b1)
return GO_TO_S1;
else if (b2)
return GO_TO_S2;
else if (b3)
return GO_TO_S3;
return ABSENT;
}
Comments