Presentation is loading. Please wait.

Presentation is loading. Please wait.

Lecture 6 UARTs and applying PPS

Similar presentations


Presentation on theme: "Lecture 6 UARTs and applying PPS"— Presentation transcript:

1 Lecture 6 UARTs and applying PPS
EEE527 Embedded Systems Lecture 6 UARTs and applying PPS "Adapted from the text “Programming 32-bit Microcontrollers in C –Exploring the PIC32 , © 2008.” Lucio di Jasio Ian McCrum Room 5B18, Tel: voice mail on 6th ring Web site:

2 Simplified UART block diagram
figure 19-1 (DS61143)

3 Baud Rate setting In our case this translates to the following expression: U2BREG = (25,000,000 / 4 / 115,200) -1 = 53.25 To decide how to best round out the result, use the reverse formula to calculate the actual baud-rate and determine the percentage error: Error = ((Fpb / 4 / (U2BREG + 1)) – baud rate) / baud rate % With a value of 53 -> 115,740 Baud with an error of just 0.47%, With a value of 54 -> 113,636 baud, 1.82% error, Both are within the acceptable tolerance range for a standard RS232 port (+/- 2%) . We can therefore define the constant BRATE as: #define BRATE // 115,200 Bd (BREGH=1)

4 Use Excel to Calculate values
See the File EEE527_PIC32MX_BAUD_RATE_GENERATOR.xlsx SYS_CLK PB divisor PBCLK Baudrate UxBRG Actual Baudrate Error =PBCLK/(4*baud) -1' Round Down for Rounded down Round up for Rounded up =PBCLK/(4*(UxBRG+1))' Number Formula e.g C8=A8/B8 E8=C8/(4*D8) - 1 =roundown(E8,0) G8=C8/((4*(F8+1)) (G8-D8)/D8 =roundup(E8,0) J8=C8/(4*(I8+1)) 2 115200 53 0.47% 54 -1.82% 38400 161 162 -0.61% 19200 324 0.16% 325 -0.31% 9600 650 0.01% 651 -0.15% 1200 5207 5208 -0.02%

5 UxMODE register register 18-1 (DS61168E)

6 Important BITs of UxMODE
ON (bit 15) 1 is enabled, UARTx pins controlled by UEN<1:0> and UTXEN SIDL (bit 13) only relevant in idle mode IREN (bit 12) 0 = IrDA is disabled RTSMD (bit 11) 1 = /UxRTS is in Simplex mode UEN (bits 9-8) 00 = Use UxTX/RX, /UxCTS ,/UxRTS/BCLK just used by PORTx WAKE (bit 7) only relevant in sleep mode LPBACK (bit 6) 0 = loopback disabled ABAUD (bit 5 ) 0 = Auto-Baud rate detection is disabled or completed. RXINV (bit 4) 0 = UxRX idle state is a ‘1’ ( sent in RS232 as -12V!) BRGH (bit 3) 1 = High-speed mode – 4x baud clock enabled. {0= x16} PDSEL (bits2-1) 00 = 8 bit data, no parity {01=8E, 10=8O (odd), 11=9N } STSEL (bit 0) 0 = 1 stop bit {1 = 2 stop bits} ux0 1u00 x = 0x8888

7 UxSTA register register 18-2 (DS61168E)

8 Important BITs of UxSTA
ADM_EN (bit 24) 0 = no automatic address detect ADDR<7:0> (bits 23-16) only matter when bit above is set UTXISEL<1:0> (bits15-14) 01 = raise interrupt when all chars transmitted UTXINV (bit 13) 0 = UxTX idle state is ‘1’ (if not in IrDA mode) URXEN (bit 12) 1 = UARTx receiver is enabled UTXBRK (bit 11) 0 = send no break {1=send start, 12 ‘0’ and stop} UTXEN (bit 10) 1 = UARTx transmitter is enabled UTXBF (bit 9) 1 = Transmit buffer is full {0 = room for at least 1 char} TRMT (bit 8) 0 = Transmit Shift Register is not empty, tx in progress URXISEL<1:0> (bit 7-6) 00 = Int flag is asserted while rx buffer not empty ADDEN (bit 5) 0 = Address detect mode disabled RIDLE (bit 4) 0 = Data is being received {1=receiver is idle} PERR (bit 3) 1 = Parity error detected for current character FERR (bit 2) 1 = Framing error detected for current character OERR (bit 1) 1 = Receiver buffer overrun. Can only be cleared in s/w URXDA (bit 0) 1 = Receive buffer data available, at least one char. e.g. U2STA = 0x1400;

9 Further restraints – the DP32 schematic
NB, link only One of these 3V3 REG Pin 1 DC IN J6 ICSP to PICKIT3 Programmer JP7 MCLR 3V3 0V 13 28 8 19 27 1 PGD PGC 23 VUSB VDD VSS VSS 4 AVSS MCLR RB0/PGD LED 3 LEDs all via 4k7 to base of transistors ‘1’ lights LED 20 AVDD 5 VCAP RB1/PGC LED 2 PIC32MX250F128B 28 PIN DIL PACKAGE 6 RB2 LED 1 7 RB3 LED 0 15 VBUS MINI –USB For power & bootloading JP3 22 D-/RB11 10k series Resistors and 10k pullups, Switches to ground USB – or use PPS to set them to UART1 11 JP2 21 RB4 BTN2 D+/RB10 JP1 16 14 RB7 BTN3 RB5/USBID (for USB OTG) 10k Variable resistor 3v3 to 0v, feed to slider via 1k 9 To 8MHz XTAL Via 680R and With 30pF caps RA2/OSC1 10 26 VR1 RA3/OSC2 RB15(AN9) JP6 JP5 24 Supplies temperature as Voltage, MCP9701A Sensor, 3 pin TO92 RB13(AN11) IC3 (SDA1)RB9 (SCL1)RB8 (SCK1)RB14 (SD0)RA4 (SDI)RA1 (CS)RA0 Diagram of DP32 board, see full schematic for details! 2k2 2k2 18 17 25 12 3 2 10k I2C – or use PPS to set them to UART2 SPI – or use PPS to set them to UART1 using PPS you can wire U1RX to RA2,RA4,RB2 ,or RB13. U1TX to RA0,RB3,RB4,RB7 or RB15 U2RX to RA1,RB1,RB5,RB8,RB11 and U2TX to RA3,RB0,RB9,RB10 or RB14 (lose USB or I2C?)

10 In the DP32 it is simpler to use UART2 – it shares pins with the I2C pins going to JP4 & 5
Use UART2 and PPS -> U2TX/RPB9 U2RX/RPB8 NB Remove jumpers JP4 & 5 And do not insert IC2C, the 8 pin chip

11 You need to program which pins go where – look up Peripheral Pin Select (PPS) in the datasheet. Also the PPS LOCK and UNLOCK sequences.

12 (on the PC run PUTTY or PICKIT2 v2.6.1 (NOT PICKIT3 s/w!)
Next 4 slides give working code; create a project called UART_1 and either wire RB8 and RB9 to a USB TTL 3.3V Usart, or a PICKIT2 or to another DP32 - but wire RB8_board1 to RB9_board2 And RB9_board2 to RB8_board2 (on the PC run PUTTY or PICKIT2 v2.6.1 (NOT PICKIT3 s/w!)

13 Code to demo serial i/o Modified from

14 NB remove JP4 and JP5 (rotate 180 degrees)
Modified from

15 Modified from http://umassamherstm5

16 Modified from http://umassamherstm5

17 Exercises Send data every second to another DP32 and display it there. (The sending board can be called DP32_1 and the receiver DP32_2) Send data only when a pushbutton on DP32_1 is pressed. Send data only when the receiving end says it is ready. (hint wire another wire from a spare i/o line from Dp32_2 to DP32_1. Use LEDs to show various things

18 Timer delays These can use an interrupt – see notes for a 1 second ISR using a flag variable that main polls. A simple delay is a “blocking” wait. E.g #define DELAY // assuming 40Mhz clock // In main near start T1CON = 0x8030; // prescale 256:1, 40Mhz=25nSec and 25/256=> 6.4usec Then for a delay use in your code the following two lines (or put in a function) TMR1=0;PR1=0xFFFF; // Note the gives a slight inaccuracy. while(TMR1 < DELAY){;}// wait here for * 6.4uSecs // you arrive here after a quarter second…(reasonably accurate…)

19 This code is explained at
You can also use the plib library (this code needs modified for the DP32! Do not use as is  PPSUnLock;                        // Allow PIN Mapping        PPSOutput(4, RPB10, U2TX);   // MAP Tx to PB10       PPSInput (2, U2RX, RPB11);   // MAP Rx to PB11  PPSLock;                        // Prevent Accidental Mapping    // Configure UART2    UARTConfigure(UART2, UART_ENABLE_PINS_TX_RX_ONLY);     UARTSetLineControl(UART2 ,UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1);     UARTSetDataRate(UART2, GetPeripheralClock(), BaudRate);      UARTEnable(UART2 ,UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));    This code is explained at

20 Print a message Function using plib
void Serial_print(char *buffer) {     while(*buffer != (char)0)     {       while(!UARTTransmitterIsReady(UART2));        UARTSendDataByte(UART2, *buffer++);     }     while(!UARTTransmissionHasCompleted(UART2));     UARTSendDataByte(UART2, '\r');     UARTSendDataByte(UART2, '\n');  }  This code is explained at

21 Sending and Receiving Data using handshake lines – CTS and RTS (manually)
int putU2( int c) { while ( CTS); // wait for !CTS, clear to send while ( U2STAbits.UTXBF); // wait while Tx buffer full U2TXREG = c; return c; } // putU2 char getU2( void) RTS = 0; // assert Request To Send !RTS while ( !U2STAbits.URXDA); // wait for a new char to arrive RTS = 1; return U2RXREG; // read char from receive buffer }// getU2 Could be worth adding the lines, just before the return c; while( !U2STAbits.TRMT);

22 Serial terminal programs on the PC
Hyperterminal – pre windows 7 in all versions RealTerm - most excellent, doesn’t work W8 Putty – usually used for network login but can use serial ports, use this in block 6 lab PCs MPIDE has a good serial monitor Use USB to serial convertors if the PC has no serial ports PICKit 2 can do USB to Serial conversion (but not yet working on the PICKit 3) Select 3.3V before plugging in. You can buy USB to Serial convertors, either full RS232 or just TTL UART. Be careful you do not damage the board! You want 3.3Volts maximum Also several I have used output on pins labelled RCV and input on TX – I had to use a scope to check!

23 HyperTerminal Setup (windows XP only)

24 RealTerm runs on XP and windows 7 (but not 8)

25 PUTTY can perform serial terminal functions
Use the Device manager to check the COM port of the USB-TTL adaptor Ensure the Speed is correct When programming the PIC32 and with the UART output connected to Putty many random characters are sent from the PIC to PUTTY. If the handshaking is left at the default XON/XOFF then PUTTY may receive a XOFF (control-S) from the PIC and you have to quit and restart PUTTY after every programming Alternatively select the correct handshaking protocol. Such as clicking on the Serial menu option and selecting “NONE” or “HARDWARE RTS/CTS”

26 PICKit2 comes with UART Software – NB NOT the PICKit3 yet, (Oct 2k14)
Wire up the PICKit2 as PICKit Pin 1 - No Connection PICKit Pin 2 - 3V3 PICKit Pin 3 - GND PICKit Pin 4 – DP32 Pin 7 (Tx) RB14 PICKit Pin 5 - DP32 Pin 10 (Rx) RA1 PICKit Pin 6 - No Connection Start the PICKit 2 application and select Tools-->UART Tool

27 The PICKit2 has other uses;
You can also use the Logic Analyzer Mode. Click 'Exit UART Tool' and start the Logic Tool Select 'Analyser' if it is not on by default. Set the Sample rate to 100 Khz and the Trigger to Ch1 \ (falling edge) Click Capture and, When your code sends 'Hello World!' you should see…

28 Tips and Tricks To re-direct the output stream of the standard C library (stdio.h) functions such as printf() to a UART: Define the function: _mon_putc() Note that a “weak” definition is already provided in the library to send the default output stream (stdout) to UART2 (convenient for all Explorer16 users). Similarly define: _mon_getc() A default “weak” version is already provided in the library as well, connecting UART2 receiver to the input stream (stdin). Weak means that the compiler won’t complain when you define a new function with the same name, it will simply replace it with the new one you provide. NOTE You are responsible for the UART initialization! Before the first call to any stdio function (printf()…) make sure the UART2 is enabled and the baud rate is set correctly.

29 Code for serial i/o, allowing printf & puts
By adding a function called _mon_putc() the linker will use it for calls to printf() and puts()

30

31 Once you define _mon_putc() any call to printf or puts will just work

32 I couldn’t get it working for _mon_getc() – I expected gets to work… instead use code below

33 Device Drivers It is good practice to partition big systems into smaller sub-systems Each sub-system should do one function, easy to describe (easy to test!) The interaction between these “modules” should be minimised, clear and simple. For input-output devices this is straightforward (usually) We can call these i/o modules “Device Drivers” (these become VERY important when we use embedded Operating Systems)

34 Using multiple files in C
If working on a large project, you can split it into several sections – you need only recompile one part if you only change that part. The linker bundles together all the object files and any library files that are needed. The “make” program can automate this IDEs use the concept of “projects” to bundle related files together and ease building a complete executable. In the project navigator, ensure your .c files are listed under sources and your .h files under the header file section.

35 What belongs in a header file?
A good “google topic” as opinions vary, but only when very complex programs are involved. in-a-header-file file/ what-shouldnt-be-in-a-header-file 0in%20a%20header%20file.pdf where Michael Barr refers to his book on “Embedded C Coding Standards”

36 .h files DO create one .h file for each module of a system apart from main.c. Include it first in the .c file before the .c #includes anything else. DO use “guards” to avoid preprocessing a .h more than once #ifndef headername_h #define headername_h … rest of .h goes here #endif DO include all function prototypes required to use the module. You can “hide” private functions by declaring them static. DO NOT add anything that creates code (usually) SOME say never have variables shared between modules – use functions to access another module’s variables. Such data hiding and abstraction is good practice – see C++ for better examples. Declare global variables as extern in the .h, then declare and initialise them in the .c extern uint8_t varx ; // extern means memory&content is allocated elsewhere uint8_t varx=42; // inside the .c Hence memory gets allocated here Every header should include every other header needed to allow compilation of itself but the .c should include whatever other headers that are needed. This is needed where a stuct declaration needs to know information from another .h file. In general we will NOT have to #include other .h files within our .h files

37 Our Embedded System Create ADC.h and ADC.c – initialiseADC() and readADC(). Create UART.h and .c with initialiseUART(), and all other UART functions. timer.h & .c initialiseTIMERS() SPI.h&.c (week 6) network.h&.c (we will create a UART or IIC system later) interrupts.h&.c to initialise interrupts and all ISRs (this is a marginal design choice as you could put ISRs in main or with each associated peripheral) You might (often) have a single setup.h&c to setup all hardware. The method above eases porting code to a new system

38 Exercises Write code that prints ADC values to serial port 2. Print one value per line. Sample 100 values from the ADC into a buffer and then output this to the PC when a button has been pushed. Configure UART1 using PPS and pins RB13 and RA0. Print from one UART to another. (hint: make sure you only output one character, then wait for it to be received before outputting the next) Create UART, ADC and timer device libraries, (uart.c, uart.h, adc.c, adc.h, timer.c and timer.h)


Download ppt "Lecture 6 UARTs and applying PPS"

Similar presentations


Ads by Google