Hexbot med PIC18F2480

Målet med denne oppgaven var å få satt opp Hexbot og kommunikasjon over UART med SSC32U motorkontroller kortet.

Deler

  • SSC32U motorkontrollerkort.
  • PIC18F2480 mikrokontroller
  • PICKIT 3 (For programmering)
  • 4,7K ohm motstand
  • 100 ohm motstand
  • Strømforsyning 5V

 

Bilder

Denne bildekrusellen krever javaskript.

Video

Krets programmering

Programming_PIC18F2480 - Page 1

Krets kommunikasjon med SSC32U

UART_PIC18F2480 - Page 1

Kode

Hele koden kan lastes ned fra github her.

// Konfigurasjon settes til å bruke intern oscillering med 8Mhz frekvens.
pragma config OSC = IRCIO7
void ConfigureOscillator(void)
{
 OSCTUNEbits.PLLEN = 0b0; // Slår av frekvens multiplikatoren, 
                          // siden vi ikke trenger høye frekvenser.
 OSCTUNEbits.TUN = 0b00000; // Ingen tilpassning nødvendig.
 OSCCONbits.IRCF = 0b101; // Setter intern frekvens til 2Mhz.
}
// Dette er kommandoene vi kjører til servoene.
const unsigned char* SERVO0 = "#0P1500T3000\r";
const unsigned char* SERVO1 = "#1P1900T3000\r";
const unsigned char* SERVO2 = "#2P1800T3000\r";
const unsigned char* SERVO4 = "#4P1400T3000\r";
const unsigned char* SERVO5 = "#5P1600T3000\r";
const unsigned char* SERVO6 = "#6P1700T3000\r";
const unsigned char* SERVO8 = "#8P1000T3000\r";
const unsigned char* SERVO9 = "#9P1600T3000\r";
const unsigned char* SERVO10 = "#10P1800T3000\r";
const unsigned char* SERVO16 = "#16P1400T3000\r";
const unsigned char* SERVO17 = "#17P1200T3000\r";
const unsigned char* SERVO18 = "#18P1500T3000\r";
const unsigned char* SERVO20 = "#20P2000T3000\r";
const unsigned char* SERVO21 = "#21P1300T3000\r";
const unsigned char* SERVO22 = "#22P1000T3000\r";
const unsigned char* SERVO24 = "#24P1900T3000\r";
const unsigned char* SERVO25 = "#25P1400T3000\r";
const unsigned char* SERVO26 = "#26P1000T3000\r";
// Definerer frekvensen vi kjører med til 2Mhz.
#define _XTAL_FREQ 2000000
// Sender informasjon til servoene.
  UART_Write_String(SERVO0);
  UART_Write_String(SERVO1);
  UART_Write_String(SERVO2);
  UART_Write_String(SERVO4);
  UART_Write_String(SERVO5);
  UART_Write_String(SERVO6); 
  UART_Write_String(SERVO8);
  UART_Write_String(SERVO9);
  UART_Write_String(SERVO10);
  UART_Write_String(SERVO16);
  UART_Write_String(SERVO17);
  UART_Write_String(SERVO18);
  UART_Write_String(SERVO20);
  UART_Write_String(SERVO21);
  UART_Write_String(SERVO22);
  UART_Write_String(SERVO24);
  UART_Write_String(SERVO25);
  UART_Write_String(SERVO26);
char UART_Init() { 
  // Setter baud hastigheten så nært 9600 som mulig.
  BAUDCONbits.BRG16 = 0b1;
  TXSTAbits.BRGH = 0b1; 
  SPBRG = 51;
  SPBRGH = 0;
  // Slår på UART kommunikasjon
  TXSTAbits.SYNC = 0b0; 
  RCSTAbits.SPEN = 0b1;
  TXSTAbits.TXEN = 0b1;
 
  // Setter TX som utgang.
  TRISCbits.TRISC6 = 0b0;
  // Setter RX som inngang.
  TRISCbits.TRISC7 = 0b1; 
 
  // Denne skal endres senere, men brukes for å være sikker på at alt er 
  / konfigurert korrekt.
  __delay_ms(1000);
 }
// Skriver hvert tegn i strengen.
void UART_Write_String(const unsigned char* str) {
 int arrayLength = strlen(str);
 for (unsigned int i = 0; i<arrayLength; i++) { 
   char a = str[i];
   if (a != '\0') {
     UART_Write(a);
   }
 }
}
// Skriver registeret så snart status registeret sier det er klart.
void UART_Write(char data){
 while(!TRMT);
 TXREG = data;
}