Encoder with UART0

Dependencies:   USBDevice mbed

Files at this revision

API Documentation at this revision

Comitter:
maxaa1998
Date:
Wed Nov 16 22:46:11 2022 +0000
Commit message:
Encoder with UART0

Changed in this revision

USBDevice.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 90116cd08554 USBDevice.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBDevice.lib	Wed Nov 16 22:46:11 2022 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/USBDevice/#53949e6131f6
diff -r 000000000000 -r 90116cd08554 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Nov 16 22:46:11 2022 +0000
@@ -0,0 +1,112 @@
+#include "mbed.h"
+#include "USBSerial.h"
+Ticker tick;                                                                //
+
+AnalogIn linear_position(A0);                                               //sets an analog input to receive the linear position
+AnalogIn linear_velocity(A1);                                               //sets an analog input to receive the linear velocity
+
+USBSerial u_s_b;
+//Serial pc(USBTX, USBRX);                                                    //enable usb serial communication
+//Serial encoder(PTE0, PTE1);
+DigitalOut red(LED_RED);                                                    //set the red LED as red
+DigitalOut green(LED_GREEN);                                                //set the green LED as green
+DigitalOut blue(LED_BLUE);                                                  //set the blue LED as blue
+DigitalOut ms(PTD1);                                                        //set the transceiver mode selection (0=receiver mode and 1=transmiter mode) 
+
+volatile uint8_t received1, received2, address = 0x54;                      //angle components variables
+volatile uint16_t angle = 0;                                                //encoder angle
+
+void isr()                                                                  //interrupution routine
+{/*
+    u_s_b.printf("0x%04X",linear_position.read_u16());                         //send linear position, obs: 6 chars needed
+    u_s_b.printf("0x%04X",linear_velocity.read_u16());                         //send linear velocity
+    u_s_b.printf("0x%04X",angle);                                              //send angle
+    u_s_b.printf("OMEGA ");                                                    //send angular velocity 
+*/}
+
+int main()                                                                  //main function
+{
+    
+    //PC serial communication
+//    pc.baud(115200);                                                        //set baud rate
+    //encoder.baud(115200);
+//    tick.attach(&isr, 1);                                                   //setup ticker to call isr every 0.1s seconds
+    
+
+    //Encoder serial communication
+    SIM->SCGC5 |= 0x00000200;                                               //enable PORTA clock
+    PORTA->PCR[1] |= 0x00000200;                                            //PTA0 as ALT2 (UART0) 
+    PORTA->PCR[2] |= 0x00000200;                                            //PTA1 as ALT2 (UART0) 
+    SIM->SOPT2 |= 0x04000000;                                              //select MCGFLLCLK as the UART0 clock source (24M by default)
+    SIM->SOPT5 &= 0x00000000;                                              //select UART0 TX pin as UART0 TX source and UART0 RX pin as UART0 RX source
+    SIM->SCGC4 |= 0x00000400;                                               //enable UART0 clock
+
+    
+    //baud rate divider setting:
+    //BAUD = Bus_Clock/((OSR+1) x BR) = 24M/ ((3+1) x 3) = 2M
+    
+    UART0->BDH = 0x00;                                                      //set the highest bits of the baud rate divider
+    UART0->BDL = 0x06;                                                      //set the lowest bits of the baud rate divider
+    UART0->C4  = 0x03;                                                      //sets the Over Sampling Ratio (OSR) - MUST BE SET BEFORE C2
+    UART0->C5  = 0x00;                                                      //sets both edges sampling - MUST BE SET BEFORE C2 AND IF OSR>7
+    UART0->C1  = 0x00;                                                      //sets a 8N1 configuration
+    UART0->C2  = 0x0C;                                                      //enables Tx and Rx/ Interrupts disabled
+
+    red = 1;                                                                //turn off the red LED
+    green = 1;                                                              //turn off the green LED
+    blue = 1;                                                               //turn off the blue LED
+    while (true)                                                            //infinite loop
+    {
+            
+        if (((UART0->S1&0xC0)>>6)==0x03)                                    //if the ucontroller transmiter buffer is free
+        {
+            ms = 1;                                                         //put the transceiver in the transmiter mode
+            UART0->D = 0x54;                                                //send the encoder's address
+            while(!(((UART0->S1&0xC0)>>6)==0x03));                          //wait 'til the message has been completely sent
+            ms = 0;                                                         //put the transceiver in the receiver mode
+        }
+        
+        red = 1;
+        //wait_us(1);
+        //while(!(((UART0->S1&0x20)>>5)==0x01));
+        
+        if(((UART0->S1&0x20)>>5)==0x01)                                         //if the ucontroller receiver buffer is full
+            {
+                received1 = UART0->D;      
+                if (((UART0->S1&0x08)>>3)==0x01)                                            //if an overflow happened
+                    {
+                        received2 = 0x63;
+                        UART0->S1=1;                                            
+                    }
+                    else
+                        received2 = 0x64;                                 //stores the first Byte in the received1 variable
+                //                      //- NÃO SAI DO LOOP -wait 'til the next has been received
+                //if(((UART0->S1&0x20)>>5)==0x01)
+                //wait_us(6);
+                //if(((UART0->S1&0x20)>>5)==0x01)
+                //    received2 = UART0->D;
+                //else if (((UART0->S1&0x08)>>3)==0x01)                                            //if an overflow happened
+                //    {
+                //        received2 = 0x63;
+                //        UART0->S1=1;                                            
+                //    }
+                //    else
+                //        received2 = 0x64;
+                //received2 = UART0->D;
+                                                       //stores the second Byte in the received2 variable
+                    
+                angle = ((((received2)&0x3F)<<8)|(received1));          //assembly the angle using the components
+            } 
+            
+        if (((UART0->S1&0x08)>>3)==0x01)                                            //if an overflow happened
+        {
+            UART0->S1=1;                                            
+        }
+        
+        u_s_b.printf("0x%04X",linear_position.read_u16());                         //send linear position, obs: 6 chars needed
+        u_s_b.printf("0x%04X",linear_velocity.read_u16());                         //send linear velocity
+        u_s_b.printf("0x%04X",angle);                                              //send angle
+        u_s_b.printf("OMEGA ");                                                    //send angular velocity 
+    }
+}
+//TO DO: verificar se ocorr overflow do buffer
diff -r 000000000000 -r 90116cd08554 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Nov 16 22:46:11 2022 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file