170 likes | 293 Views
This course, offered at the Scuola Superiore Sant'Anna in Pisa, explores the implementation of real-time systems using the dsPic33 microcontroller and FLEX evaluation boards. Participants will engage in foundational concepts such as finite state machine (FSM) implementation in C, hands-on demonstrations of hardware, and a case study involving an elevator controller simulation. The course emphasizes practical skills in programming the FLEX board, including firmware flashing techniques and peripheral mapping. Join us to enhance your understanding of embedded systems and their applications.
E N D
Corso 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
Course Outline (1/2) • Second day (24th) • FSM implementation in C (slides by prof. Di Natale) • A case study • Real Hardware demonstration
Outline • Introduction to the FLEX board • A FSM instantiation on the FLEX • Visit the web site: http://feanor.sssup.it/~pagano/personalWEB/courses.htm
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
add-on boards breadboard 1 - 2.54mm pattern 2 - 2.54mm alternate pattern (RJ45 / RS232 connectors) 3 - 1.27mm pattern (SMD components) 4 - 5.08mm pattern (clamps)
add-on boards 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 • Our FLEX board should run a specific program (firmware); • We need a compiler to translate from C to machine code; • We need a linker command file that allows the test code to be targeted to the dsPIC33; • We need a tool to transfer the firmware from the PC to the MCU flash memory. MPLAB_C30 gld script Microchip ICD2
COFF file structure http://delorie.com/djgpp/doc/coff/
Peripheral Mapping • Expansion Board PIN I/O: • Leds -> PortD (output) • But’s -> PortG (input) • LCD -> PortA (output)
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.
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 configure ports • Configuring a port for INPUT: void initButtons (void) { TRISGbits.TRISG6 = 1; TRISGbits.TRISG7 = 1; TRISGbits.TRISG8 = 1; TRISGbits.TRISG9 = 1; } 16 pels of the LCD 4 Buttons
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; } } 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; } }
the end Questions ?
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; } HOWTO initialize and transit init signal generation transition