Exemple #1
0
void rs232_read_line(char buffer[64])
{
	unsigned int index = 0;
	char c;
	
	// Initialiser le tampon
	for (index = 0; index < 64;index++)
		buffer[index] = '\0';
	
	index = 0;
	
	// Lire le texte
	do {
		// Lire un caractère
		while (!DataRdyUSART());
		c = ReadUSART();
		buffer[index] = c;
		index++;
		
		// Afficher les caractères entrés
		while (BusyUSART());
		WriteUSART(c);
	} while (c != '\r' && index < 64);
	
	// Eviter de réécrire par dessus le texte saisi
	while (BusyUSART());
	WriteUSART('\n');
	
	// Remove '\r'
	buffer[index-1] = '\0';
}	
Exemple #2
0
void SEND_TX_STOP()
{

    WriteUSART(EndTransmission);
    while (BusyUSART());
    WriteUSART(CR);
    while (BusyUSART());

}
Exemple #3
0
void PrintInt(unsigned int c) {
    WriteUSART(((c / 10000) % 10) + '0');
    while(BusyUSART());
    WriteUSART(((c / 1000) % 10) + '0');
    while(BusyUSART());
    WriteUSART(((c / 100) % 10) + '0');
    while(BusyUSART());
    WriteUSART(((c / 10) % 10) + '0');
    while(BusyUSART());
    WriteUSART((c % 10) + '0');
    while(BusyUSART());
}
void timer0_int_handler() {
    // Encoder count for motor 0.
    timer0Counter++;
    // Reset the timer
    WriteTimer0(0xCF);

    DEBUG_ON(TMR0_DBG);
    DEBUG_OFF(TMR0_DBG);

    if (ticks_flag) {
        // Reverse counter to prevent it from going a set distance.
        ticks0Counter++;
        // Going thru right hand turn
        if (ticks0Counter >= maxTickZero && postRight == 1) {
            postRight = 2;
            WriteUSART(0x00);
            // Turn right 90
            motorBuffer[0] = 0x01;
            motorBuffer[1] = 0x03;
            motorBuffer[2] = 0x04;
            motorBuffer[3] = 0x01;
            motorBuffer[4] = 0x0C;
            motorBuffer[5] = 0x09;

            ToMainHigh_sendmsg(MOTORLEN, MSGT_I2C_DATA, (void *) motorBuffer);
        } else if (ticks0Counter >= maxTickZero && postRight == 2) {
            // Move forward after right turn
            postRight = 0;

            motorBuffer[0] = 0x01;
            motorBuffer[1] = 0x03;
            motorBuffer[2] = 0x01;
            motorBuffer[3] = 0x01;
            motorBuffer[4] = 0x00;
            motorBuffer[5] = 0x00;

            ToMainHigh_sendmsg(MOTORLEN, MSGT_I2C_DATA, (void *) motorBuffer);
        } else if (ticks0Counter >= maxTickZero && postAlignFlag) {
            postAlignFlag = 0;
            motorBuffer[0] = 0x01;
            motorBuffer[1] = 0x03;
            motorBuffer[2] = 0x01;
            motorBuffer[3] = 0x01;
            motorBuffer[4] = 0x00;
            motorBuffer[5] = 0x00;

            ToMainHigh_sendmsg(MOTORLEN, MSGT_I2C_DATA, (void *) motorBuffer);
        } else if (ticks0Counter >= maxTickZero) {
            //Stops wheels after set number of ticks
            WriteUSART(0x00);
        }
    }
}
Exemple #5
0
void usartLoopback() {
  unsigned char data;
  while(!DataRdyUSART());
    data = ReadUSART();
  while(BusyUSART());
    WriteUSART(data);
}
Exemple #6
0
// Master Mode
void master(void){

  while(1){
    WriteUSART(27);
    putrsUSART (ClrScr);
    putrsUSART (Menu1);

    while(!DataRdyUSART());  //wait for data
    key = ReadUSART();      //read data
    putcUSART(key);

    switch (key) {
    case '1':
      {
        WriteUSART(27);
        putrsUSART (ClrScr);
        putrsUSART (Menu1_1);
        while(!DataRdyUSART());  //wait for data
        key = ReadUSART();      //read data
        break;
      }
    case '2':
      {
        trackmode();
        break;
      }
    case '3':
      {
        WriteUSART(27);
        putrsUSART (ClrScr);
        putrsUSART (Menu1_3);
        manmode();
        break;
      }
	case '4':
	  {
		blink();
	  }
    default:
      {
        putrsUSART (BadKey);
        break;
      }
    }
  }
}
Exemple #7
0
//Slave Mode
void slave(void){
  while(1){
    WriteUSART(27);
    putrsUSART (ClrScr);
    putrsUSART (Menu1_4);
    manmode();
  }
  return;
}
Exemple #8
0
void HeartBeat(void)
{
    ACT_LED_01 = 0;
    Delay1KTCYx(100);
    ACT_LED_01 = 1;
    Delay1KTCYx(100);

    WriteUSART('#'); // :
    while (BusyUSART());
}
Exemple #9
0
static void uartRxHandler (void)
{
    unsigned char c;

    /* Get the character received from the USART */
    c = ReadUSART();
    /* Put the character received from the USART */
    WriteUSART(c);

    /* Clear the interrupt flag */
    PIR1bits.RCIF = 0;
}
Exemple #10
0
void imprimir() {
    while(BusyUSART());
    WriteUSART(35);
    while(BusyUSART());
    WriteUSART(88);
    while(BusyUSART());
    itoa(buf, acc_x, 10);
    putsUSART(&buf);
    //putintUSART(&acc_x);
    while(BusyUSART());
    WriteUSART(43);
    while(BusyUSART());
    WriteUSART(89);
    while(BusyUSART());
    //putintUSART(&acc_y);
    itoa(buf, acc_y, 10);
    putsUSART(&buf);
    while(BusyUSART());
    WriteUSART(43);
    while(BusyUSART());
    WriteUSART(90);
    while(BusyUSART());
    //putintUSART(&acc_z);
    itoa(buf, acc_z, 10);
    putsUSART(&buf);
    while(BusyUSART());
    WriteUSART(43);
    while(BusyUSART());
    WriteUSART(33);
    //itoa(buf, temperature, 10);
    //  putsUSART(&buf);
    //  putsUSART(&mid);
    //putsUSART(&start);
    //itoa(buf, acc_x, 10);
    //putintUSART(&acc_x);
    //putsUSART(&mid);
    //itoa(buf, acc_y, 10);
    //putsUSART(&buf);
    //putsUSART(&mid);
    //itoa(buf, acc_z, 10);
    //putsUSART(&buf);
    //putsUSART(&mid);
    //putsUSART(&end);
    //putsUSART(&enter);

}
Exemple #11
0
void SEND_TX_RESPONSE()
{
    SEND_TX_START();
    //WriteUSART(0x27); // '
    //while (BusyUSART());
    //WriteUSART('@'); // UNIQUE RESPONSE SYMBOL
    WriteUSART(COMMAND_DATA[1]);
    WriteUSART(COMMAND_DATA[2]);


    //while (BusyUSART());
    //WriteUSART(0x27); // '
    while (BusyUSART());
    WriteUSART(0x3A); // :
    //while (BusyUSART());
    //WriteUSART(0x27); // '
    while (BusyUSART());
    SEND_TX_DATA();

    while (BusyUSART());
    //WriteUSART(0x27); // '
    //while (BusyUSART());
    SEND_TX_STOP();
}
Exemple #12
0
void Read_string(unsigned char *buffer, unsigned char len)      /* Reads a string data from UART of having specific length*/
  {
  char i;
  unsigned char data;
      Write(0x0D);
      Write('\n');
  for(i=0;i<len;i++)
    {
    while(!DataRdyUSART());                                          /* Wait for data to be received                           */
    data = getcUSART();                                              /* Get a character from the USART                         */
    *buffer = data;                                                  /* save data in a string                                  */
    WriteUSART(data);
    while(BusyUSART());
    buffer++;                                                        /* Increment the string pointer                           */
    }
  }
Exemple #13
0
void firstSendUSART()
{
    uint8_t ggg = 0x02;
    TxBuffer[0x00] = 1;
    TxBuffer[0x01] = 0x10;
    while(ggg < 0x10)
    {
        ggg++;
        TxBuffer[ggg] = ggg;
    }
    TxBuffer[0x11] = 0xFF;
    WriteUSART(0x12);
    ggg = 0x00;
    while(ggg < 0x20)
    {
        TxBuffer[ggg] = 0;
        ggg++;
    }
}
Exemple #14
0
void uart_send_int_handler() {
    //LATBbits.LATB7 = 0;
    // Make sure we still have data to send
    if(uc_ptr->sendSize > 0) {
#ifdef __USE18F46J50
        Write1USART(uc_ptr->sendBuffer[uc_ptr->sendCurrent]);
#else
        WriteUSART(uc_ptr->sendBuffer[uc_ptr->sendCurrent]);
#endif
        


        // Flag interrupt for next byte
        PIE1bits.TXIE = 1;

        // Increment/decrement size and index
        uc_ptr->sendCurrent++;
        uc_ptr->sendSize--;
    }
}
Exemple #15
0
void Read_str_(unsigned char *buffer)                                /* Reads a string data from UART of having specific length*/
  {
  char i;
  unsigned char data;
  for(i=0;data!=0x0D;i++)
    {
    while(!DataRdyUSART());                                           /* Wait for data to be received                           */
    data = ReadUSART();
    if(data!=0x0D)                                                    /* Get a character from the USART                         */
    *buffer = data;                                                   /* save data in a string                                  */
    WriteUSART(data);
    while(BusyUSART());
    buffer++;                                                         /* Increment the string pointer                           */
    }
  while(i!=16)
  {
  *buffer = ' ';
  buffer++;
  i++;
  }
  }
void main(void) {
    char msg[1];
    int value;

    initSquareWear();
    latC7 = 0;
    openUSART();
    putrsUSART("Type a single digit number:\r\n");
    while(1) {
        getsUSART(msg, 1);
        if(msg[0]>='0' && msg[0]<='9') {
            value = msg[0]-'0';
            if (value<10) {
                putrsUSART("On for ");
                WriteUSART(msg[0]);
                putrsUSART(" seconds.\r\n");
                latC7 = 1;
                delaySeconds(value);
                latC7 = 0;
            }
        }
    }
}
Exemple #17
0
void uart_recv_int_handler() {
#ifdef __USE18F26J50
    if (DataRdy1USART()) {
        uc_ptr->buffer[uc_ptr->buflen] = Read1USART();
#else
#ifdef __USE18F46J50
    if (DataRdy1USART()) {
        uc_ptr->buffer[uc_ptr->buflen] = Read1USART();
#else
    if (DataRdyUSART()) {
        buffer_temp[buf_len] = ReadUSART();
#endif
#endif
        uc_ptr->buflen++;
        buf_len++;
        parseUART();

        // check if a message should be sent
    }
#ifdef __USE18F26J50
    if (USART1_Status.OVERRUN_ERROR == 1) {
#else
#ifdef __USE18F46J50
    if (USART1_Status.OVERRUN_ERROR == 1) {
#else
    if (USART_Status.OVERRUN_ERROR == 1) {
#endif
#endif
        // we've overrun the USART and must reset
        // send an error message for this
        RCSTAbits.CREN = 0;
        RCSTAbits.CREN = 1;
        ToMainHigh_sendmsg(0, MSGT_OVERRUN, (void *) 0);

    }
}

void init_uart_recv(uart_comm *uc) {
    uc_ptr = uc;
    uc_ptr->buflen = 0;
    buf_len = 0;
    command_length = 0;
    command_count = 0;
    State = GET_MSGID;
}

void parseUART()
{
    unsigned char x = uc_ptr->buflen;
   // uart_write(1, &x);
    switch(State)
    {
        case(GET_MSGID):
        {
            command_length = buffer_temp[buf_len -1] & 0xF;
            command_length = command_length;
            if(command_length != 0)
            {
                State = GET_COMMAND;
            }
            else
            {
                State = CHECKSUM;
            }
            break;
        }
        case(GET_COMMAND):
        {
            if(command_count+1 < command_length)
            {
                command_count++;
            }
            else
            {
                State = CHECKSUM;
            }
            break;
        }
        case(CHECKSUM):
        {
            ToMainLow_sendmsg(buf_len ,MSGT_PARSE, &buffer_temp[0]);
            uc_ptr->buflen = 0;
            buf_len = 0;
            State = GET_MSGID;
            command_count = 0;
            command_length = 0;
            break;
        }
    }
}


void uart_write(unsigned char length, unsigned char *msg){

    unsigned char i = 0;
    for(i = 0; i < length; i++){

    #ifdef __USE18F26J50
        while(Busy1USART());
        Write1USART(msg[i]);
    #else
    #ifdef __USE18F46J50
        while(Busy1USART());
        Write1USART(msg[i]);
    #else
        while(BusyUSART());
        WriteUSART(msg[i]);
    #endif
    #endif
    }
}
Exemple #18
0
void SEND_TX_START(void)
{
    WriteUSART(StartTransmission);
    while (BusyUSART());
}
Exemple #19
0
void Write(char data)
{
    WriteUSART(data);                                           /* Write a byte through USART module                    */
    while(BusyUSART());                                         /* Wait until the write complete                        */  
}
Exemple #20
0
/******************************************************************************************
*    COMMAND FUNCTIONS        *
******************************************************************************************/
void ProcessCommand(void)
{
    if (HEART_B == '1')
        ACT_LED_01 = 0; //Turn it ON (inverted open drain)
    if (COMMAND_DATA[0] == 'R')// READ COMMAND --------------------------------------------
    {


        if (COMMAND_DATA[1] == '*')// READ ALL REGISTERS
        {

            Read_Analog_Inputs(); // READ ANALOG PERIPHERIALS****
            Read_Digital_Inputs(); // READ DIGITAL INPUT PERIPHERIALS**
            Read_Digital_Outputs(); // READ DIGITAL OUTPUT PERIPHERIALS**

            SEND_TX_START();    // START TRANSMISSION
            SEND_ANALOG_DATA();
            WriteUSART(0x2C);
            while (BusyUSART()); // Send a  ,
            SEND_DIGITAL_INPUT_DATA();
            WriteUSART(0x2C);
            while (BusyUSART()); // Send a  ,
            SEND_DIGITAL_OUTPUT_DATA();
            SEND_TX_STOP(); // End all transmissions

        }

        if (COMMAND_DATA[1] == 'C')// READ REGISTER LIST
        {
            if (COMMAND_DATA[2] == '0')// READ INFO REGISTER 0  MODEL
            {
                for (unsigned char n=0; n <= 7; n++ ) //Reset Buffer
                    TRANSMITT_DATA[n] = EEPROM_READ(n); // COPY BUFFER TO COMMAND DATA for further processing
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '1')// READ INFO REGISTER 1  FIRMWARE
            {
                unsigned char d=0x08;
                for (unsigned char n=0; n <= 7; n++ ) //Reset Buffer
                    TRANSMITT_DATA[n] = EEPROM_READ(d),d++; // COPY BUFFER TO COMMAND DATA for further processing
                    
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '2')// READ INFO REGISTER 2  ADDRESS
            {
                TRANSMITT_DATA[0] = EEPROM_READ(0x10); // AdDDRES 1
                TRANSMITT_DATA[1] = EEPROM_READ(0x11); // AdDDRES 1
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '3')// READ INFO REGISTER 3  DEVICE SERIAL NUMBER
            {
                TRANSMITT_DATA[0] = SERIAL[0];
                TRANSMITT_DATA[1] = SERIAL[1];
                TRANSMITT_DATA[2] = SERIAL[2];
                TRANSMITT_DATA[3] = SERIAL[3];
                TRANSMITT_DATA[4] = SERIAL[4];
                TRANSMITT_DATA[5] = SERIAL[5];
                TRANSMITT_DATA[6] = SERIAL[6];
                TRANSMITT_DATA[7] = SERIAL[7];
                SEND_TX_RESPONSE(); // Send list character

            }
            else if (COMMAND_DATA[2] == '4')// READ INFO REGISTER 4  LIST DEVICE
            {
                TRANSMITT_DATA[0] = '@', SEND_TX_RESPONSE(); // Send list character
            }
        }


        else if (COMMAND_DATA[1] == 'A')// READ ANALOG INPUTS ADC
        {
            Read_Analog_Inputs(); // READ ANALOG PERIPHERIALS****
              

            if (COMMAND_DATA[2] == '*') // READ ALL ANALOG DATA AND SEND IT
                SEND_TX_START() , SEND_ANALOG_DATA(), SEND_TX_STOP();
            else if (COMMAND_DATA[2] == '0')// READ ANALOG REGISTER 1
                itoa( TRANSMITT_DATA, ADCValue[0],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '1')// READ ANALOG REGISTER 2
                itoa( TRANSMITT_DATA, ADCValue[1],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '2')// READ ANALOG REGISTER 3
                itoa( TRANSMITT_DATA, ADCValue[2],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '3')// READ ANALOG REGISTER 4
                itoa( TRANSMITT_DATA, ADCValue[3],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '4')// READ ANALOG REGISTER 5
                itoa( TRANSMITT_DATA, ADCValue[4],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024


        }

        else if (COMMAND_DATA[1] == 'I')// READ DIGITAL INPUTS
        {
            Read_Digital_Inputs(); // READ DIGITAL PERIPHERIALS**

            if (COMMAND_DATA[2] == '*') // READ ALL DIGITAL INPUTS AND SEND IT
                SEND_TX_START() , SEND_DIGITAL_INPUT_DATA(), SEND_TX_STOP();
            else if (COMMAND_DATA[2] == '0')// READ DIGITAL INPUT REGISTER 1
                TRANSMITT_DATA[0] = INPUTValue[0], SEND_TX_RESPONSE();
            else if (COMMAND_DATA[2] == '1')// READ DIGITAL INPUT REGISTER 2
                TRANSMITT_DATA[0] = INPUTValue[1], SEND_TX_RESPONSE();
            else if (COMMAND_DATA[2] == '2')// READ DIGITAL INPUT REGISTER 3
                TRANSMITT_DATA[0] = INPUTValue[2], SEND_TX_RESPONSE();

        }

        else if (COMMAND_DATA[1] == 'O')// READ DIGITAL OUTPUTS
        {
            
            Read_Digital_Outputs(); // READ DIGITAL PERIPHERIALS**

            if (COMMAND_DATA[2] == '*') // READ ALL DIGITAL INPUTS AND SEND IT            
                SEND_TX_START() , SEND_DIGITAL_OUTPUT_DATA(), SEND_TX_STOP();

            else if (COMMAND_DATA[2] == '0')// READ DIGITAL OUTPUTS REGISTER 1
            {
                if (OUT_00)
                    TRANSMITT_DATA[0] = '1';
                else
                    TRANSMITT_DATA[0] = '0';
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '1')// READ DIGITAL OUTPUTS REGISTER 2
            {
                if (OUT_01)
                    TRANSMITT_DATA[0] = '1';
                else
                    TRANSMITT_DATA[0] = '0';
                SEND_TX_RESPONSE();
            }


        }

    }




    else if (COMMAND_DATA[0] == 'W')// WRITE COMMAND ----------------------------------------
    {
        if (COMMAND_DATA[1] == 'O')// WRITE DIGITAL OUTPUT
        {
            if (COMMAND_DATA[2] == '0')// WRITE OUTPUT REGISTER 1
            {
                if (COMMAND_DATA[3] == '1')
                    OUT_00 = 1;
                else
                    OUT_00 = 0;
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();
            }   
           else if (COMMAND_DATA[2] == '1')// WRITE OUTPUT REGISTER 2
           {
                if (COMMAND_DATA[3] == '1')
                    OUT_01 = 1;
                else
                    OUT_01 = 0;
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();
           }    

        }
        if (COMMAND_DATA[1] == 'C')// WRITE CONFIGURATION
        {
            if (COMMAND_DATA[2] == '2')// WRITE CONFIGURATION REGISTER 2
            {

                EEPROM_WRITE(0x10, COMMAND_DATA[3]);
                Delay10TCYx(30);
                EEPROM_WRITE(0x11, COMMAND_DATA[4]);
                Delay10TCYx(30);
                Add_HI = COMMAND_DATA[3];
                Add_LO = COMMAND_DATA[4];
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();

            }
        }
        

    }
    
    ACT_LED_01 = 1; //Turn it OFF (inverted open drain)
    return;
}
Exemple #21
0
void interrupt Interrupcao(void){

    char buffer[4];
    /* a string buffer ira guardar um numero decimal (0 a 32) traduzido pela
     * funcao itoa, onde ira transformar o numero inteiro em string com apontador
     * o tamanho poderia ser 3, mas o inteiro vai ate 3 posicoes + null
     *
     * the buffer string variable will hold a decimal number (0 to 32) that was
     * converted by the itoa function, changing a integer number into a string
     * pointer
     * its size could be only 3, but the interger goes up to 3 positions + null end
     */


    // LED_VERMELHO = ~LED_VERMELHO;
    // muda o status do LED_VERMELHO quando a MCU entrar em interrupcao
    // changes the LED_VERMELHO when the MCU interrupts

    // BUZZ=1; Delay100TCYx(10); BUZZ=0;
    // toca o buzzer para cada interrupcao
    // plays the buzzer for each interrupt

    if (RCIF)   // se existe interrupcao aguardando...
                // teoricamente este RCIF nao precisaria de verificacao
                // pois se a rotina de Interrupcao ja foi chamada, entao
                // nem seria necessario verifica-la
                // mas os LED1 e LED_VERMELHO servem justamente para comprovar
                // que o RCIF sempre ira existir, quando mudam juntos (leds)

                // Theoretically this RCIF "if" check should never be necessary
                // but just to confirm the RCIF, the two leds (LED1 and
                // LED_VERMELHO) will always change together.
        {

        RCIE = 0;   // desabilita interrupts de RX para tratar a entrada
                    // disables RX interrupts to treat input

        LED1 = ~LED1;
        // muda o status do primeiro LED
        // inverts the LED1 status

        chRX = ReadUSART();
        // le caractere da Serial / read a character from Serial

        if ( chRX>31 && chRX<127 && !BOTAO)
            // filtra apenas os caracteres texto comuns
            // just filter the common readable text characters
        {

            // Se o Echo Serial esta ativo, entao imprima o caractere na Serial
            // If Serial Echo is on, then send the character to Serial Port
            if (SerialEcho)
                {
                    while (BusyUSART()); // espera nao ocupado / waits non busy
                    WriteUSART(chRX);    // envia caractere na Porta Serial
                                         // sends the character in Serial Port
                }

            // Se o LcdDisplay esta ativo, entao imprima o caractere
            // If Lcd Display is enabled, print the character in LCD
            if (LcdDisplay)
            {
                while (BusyXLCD());
                WriteDataXLCD(chRX);

                contadorDisplay++;      // contador de caracteres para tabular
                                        // LCD character tabulation count
                if (contadorDisplay==16)    // se chegar ao final da primeira linha
                                            // if reaches the end of first line
                {
                    SetDDRamAddr(0x40); // comando para pular para segunda linha
                                        // command for going to second line
                    if (SerialEcho)
                    {
                        while (BusyUSART());
                        putrsUSART("\r\n"); // imprime RETURN e NEWLINE (inicio)
                                            // prints Carriage RETURN and Newline
                    }

                }

                if (contadorDisplay==32)    // se chegar ao final da segunda linha
                                            // if reaches the end of second line
                {
                    SetDDRamAddr(0x00);     // pula novamente para primeira linha
                                            // go again to first line
                    contadorDisplay=0;  // ja na primeira linha, limpa contador
                                        // in first line, clear the char counter
                    if (SerialEcho)
                    {
                        while (BusyUSART());
                        putrsUSART("\r\n"); // imprime RETURN e NEWLINE (inicio)
                                            // prints Carriage RETURN and Newline
                    }
                }

            }



        }
        else            // filtra todos demais Controls e Caracteres Especiais
                        // this is the state of non-text characters being filtered

        if (BOTAO)  // se o BOTAO de debug estiver pressionado, nao filtra controle
                    //if pushBOTTON is pressed, do not filter control characters
        {
                    while (BusyUSART());
                    WriteUSART(chRX);
        }
        else
        switch (chRX)
        {
            case 0x05 :      // Caractere ^E
                SerialEcho=!SerialEcho;
                while(BusyUSART());
                putrsUSART("\r\n[ECHO ");
                if (SerialEcho) putrsUSART("ON]"); else putrsUSART("OFF]");
                break;
                /*
                 * Control-E:
                 * Rotina para ligar e desligar o ECHO na porta serial
                 * Routine to turn on and off the ECHO in serial port
                 */

            case 0x10 :      // Caractere ^P
                LcdDisplay=!LcdDisplay;
                while(BusyUSART());
                putrsUSART("\r\n[LCD ");
                if (LcdDisplay) putrsUSART("ON]"); else putrsUSART("OFF]");
                break;
                /*
                 * Contro-P:
                 * Rotina para ligar e desligar a amostragem de Caractere no LCD
                 * Routine to turn on and off the display of characters in LCD
                 */

            case 0x0C :     // Caractere ^L (FormFeed)
                putrsUSART("\r\n[LCD CLS]");
                while(BusyXLCD());
                WriteCmdXLCD(0x01); // Comando para limpar o LCD
                contadorDisplay=0;
                break;
                /*
                 * Control-L: (LimpaTela / FormFeed)
                 * Rotina para Limpar a Tela
                 * Routine to CLear Screen (CLS)
                 */

            case 0x13 :     // Caractere ^S
                putrsUSART("\r\n[Status Lcd:");
                if (LcdDisplay) putrsUSART("On"); else putrsUSART("Off");
                putrsUSART(" Echo:");
                if (SerialEcho) putrsUSART("On"); else putrsUSART("Off");
                putrsUSART(" charLCD:");
                
                itoa ( buffer, contadorDisplay, 10);
                // itoa necessita da biblioteca <stdlib.h>
                // itoa needs the include stdlib.h
                putrsUSART( buffer );
                putrsUSART("]\r\n");
                /*
                 * Control-S:
                 * Mostra o Status do Echo, do LCD, e da quantidade de caracteres
                 * no LCD
                 * Shows the Status of Echo, LCD and characteres number in LCD
                 */
                
                break;

            default:
               
                ;
        }

        




        // two Peripheral Interrupt Request (Flag) registers (PIR1 and PIR2)
        // RCIF: EUSART Receive Interrupt Flag bit

        //PIR1bits.RCIF = 0; // PIR1 no registro RCIF
        RCIE = 1; // Re-Habilita a Interrupcao de Recepcao
                  // Re-Enable RX Interrupts

        RCIF = 0; // PIR1 no registro RCIF
        // limpa o registrador de interrupcao, e sai da interrupcao
        // clear the interrupt register, and quits it

        }
}
Exemple #22
0
void PrintStatus(unsigned int *iServos, unsigned int *iOutput,
        unsigned char *cIds, unsigned char cId, unsigned int iInput) {
    
    static int c = 4;
    
    unsigned char sMod[] =      "Mod: ";
    unsigned char sId[] =       "  Id: ";
    unsigned char sInput[] =    ", Input: ";
    unsigned char sCurrent[] =  "   Current: ";
    unsigned char sNew[] =      "   New:     ";
    unsigned char sSorted[] =   "   Sorted:  ";
    
    unsigned char sSeparator[] = ", ";
    unsigned char sNewline[] = "\r\n";
    
    //Overall Values
    putsUSART((char *) sMod);
    WriteUSART((c % 10) + '0'); //This just shows activity
    putsUSART((char *) sId);
    PrintInt(cId);
    putsUSART((char *) sInput);
    PrintInt(iInput);
    putsUSART((char *) sNewline);
    
    //Current values
    putsUSART((char *) sCurrent);
    
    for(int i = 0; i < MAX_SERVOS; i++) {
        if(i) {
            putsUSART((char *) sSeparator);   
        }
        PrintInt(iServos[i]);
    }
    putsUSART((char *) sNewline);
    
    //New values
    putsUSART((char *) sNew);
    
    for(int i = 0; i < MAX_SERVOS; i++) {
        if(i) {
            putsUSART((char *) sSeparator);   
        }
        PrintInt(iOutput[i]);
    }
    putsUSART((char *) sNewline);
    
    //Sort order
    putsUSART((char *) sSorted);
    
    for(int i = 0; i < MAX_SERVOS; i++) {
        if(i) {
            putsUSART((char *) sSeparator);   
        }
        PrintInt(cIds[i]);
    }
    putsUSART((char *) sNewline);


    putsUSART((char *) sNewline);
    
    c++;
}
Exemple #23
0
void main(void) {
    char c;
    signed char length;
    unsigned char msgtype;
    unsigned char last_reg_recvd;
    uart_comm uc;
    i2c_comm ic;
    unsigned char msgbuffer[MSGLEN + 1];
    unsigned char i;
    uart_thread_struct uthread_data; // info for uart_lthread
    timer1_thread_struct t1thread_data; // info for timer1_lthread
    timer0_thread_struct t0thread_data; // info for timer0_lthread

#ifdef __USE18F2680
    OSCCON = 0xFC; // see datasheet
    // We have enough room below the Max Freq to enable the PLL for this chip
    OSCTUNEbits.PLLEN = 1; // 4x the clock speed in the previous line
#else
#ifdef __USE18F45J10
    OSCCON = 0x82; // see datasheeet
    OSCTUNEbits.PLLEN = 1; // Makes the clock exceed the PIC's rated speed if the PLL is on
#else
#ifdef __USE18F26J50
    OSCCON = 0xE0; // see datasheeet
    OSCTUNEbits.PLLEN = 1;
#else
#ifdef __USE18F46J50
    OSCCON = 0xE0; //see datasheet
    OSCTUNEbits.PLLEN = 1;
#else
    Something is messed up.
    The PIC selected is not supported or the preprocessor directives are wrong.
#endif
#endif
#endif
#endif

    // initialize my uart recv handling code
    init_uart_recv(&uc);

    // initialize the i2c code
    init_i2c(&ic);

    // init the timer1 lthread
    init_timer1_lthread(&t1thread_data);

    // initialize message queues before enabling any interrupts
    init_queues();

#ifndef __USE18F26J50
    // set direction for PORTB to output
    LATB = 0x0;
    TRISB = 0x07;

    PORTA = 0x0;
    LATA = 0x0;
    TRISA = 0x0F;
//
//    PORTE = 0x0;
//    LATE = 0x0;
//    TRISE = 0x0F;
//
//    PSPMODE = 0x0;
#endif

    // how to set up PORTA for input (for the V4 board with the PIC2680)
    /*
            PORTA = 0x0;	// clear the port
            LATA = 0x0;		// clear the output latch
            ADCON1 = 0x0F;	// turn off the A2D function on these pins
            // Only for 40-pin version of this chip
            CMCON = 0x07;	// turn the comparator off
            TRISA = 0x0F;	// set RA3-RA0 to inputs
     */

    // initialize Timers
    OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_64);

#ifdef __USE18F26J50
    // MTJ added second argument for OpenTimer1()
    OpenTimer1(TIMER_INT_ON & T1_SOURCE_FOSC_4 & T1_PS_1_8 & T1_16BIT_RW & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF,0x0);
#else
#ifdef __USE18F46J50
    OpenTimer1(TIMER_INT_ON & T1_SOURCE_FOSC_4 & T1_PS_1_8 & T1_16BIT_RW & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF,0x0);
#else
    OpenTimer1(TIMER_INT_ON & T1_8BIT_RW & T1_PS_1_1 & T1_SOURCE_INT & T1_OSC1EN_OFF & T1_SYNC_EXT_OFF);
#endif
#endif

    // Decide on the priority of the enabled peripheral interrupts
    // 0 is low, 1 is high

    // ADC interrupt
    IPR1bits.ADIP = 0;
    PIE1bits.ADIE = 1;
    // Timer1 interrupt
    IPR1bits.TMR1IP = 0;
    // USART RX interrupt
    IPR1bits.RCIP = 0;
    // I2C interrupt
    IPR1bits.SSPIP = 1;

    // configure the hardware i2c device as a slave (0x9E -> 0x4F) or (0x9A -> 0x4D)
#if 1
    // Note that the temperature sensor Address bits (A0, A1, A2) are also the
    // least significant bits of LATB -- take care when changing them
    // They *are* changed in the timer interrupt handlers if those timers are
    //   enabled.  They are just there to make the lights blink and can be
    //   disabled.
    i2c_configure_slave(0x9E);
#else
    // If I want to test the temperature sensor from the ARM, I just make
    // sure this PIC does not have the same address and configure the
    // temperature sensor address bits and then just stay in an infinite loop
    i2c_configure_slave(0x9A);
#ifdef __USE18F2680
    LATBbits.LATB1 = 1;
    LATBbits.LATB0 = 1;
    LATBbits.LATB2 = 1;
#endif
    for (;;);
#endif

    // must specifically enable the I2C interrupts
    PIE1bits.SSPIE = 1;

    // configure the hardware USART device
#ifdef __USE18F26J50
    Open1USART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
               USART_CONT_RX & USART_BRGH_LOW, 0x19);
#else
#ifdef __USE18F46J50
    Open1USART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
               USART_CONT_RX & USART_BRGH_LOW, 0x19);
#else/*
    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
        USART_CONT_RX & USART_BRGH_LOW, 0x19);
    TRISCbits.RC6 = 1; //TX pin set as output
    TRISCbits.RC7 = 1; //RX pin set as input
    WriteUSART(0x00);
    WriteUSART(0x01);
    WriteUSART(0x02);
    WriteUSART(0x03);*/
#endif
#endif

    OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
              USART_CONT_RX & USART_BRGH_LOW, 38);
    TRISCbits.RC6 = 0; //TX pin set as output
    TRISCbits.RC7 = 1; //RX pin set as input
    //char data = 0x05;
    //WriteUSART(data);
    //while(BusyUSART());
    //WriteUSART(data);
    //WriteUSART(0x05);
    //WriteUSART(0x05);
    //putsUSART(0x00);
//    while(BusyUSART());
//    putsUSART(0x05);
//    while(BusyUSART());
//    putsUSART(0x05);
//    while(BusyUSART());
//    putsUSART(0x05);
    // Peripheral interrupts can have their priority set to high or low
    // enable high-priority interrupts and low-priority interrupts
    enable_interrupts();

    /* Junk to force an I2C interrupt in the simulator (if you wanted to)
    PIR1bits.SSPIF = 1;
    _asm
    goto 0x08
    _endasm;
     */

    // printf() is available, but is not advisable.  It goes to the UART pin
    // on the PIC and then you must hook something up to that to view it.
    // It is also slow and is blocking, so it will perturb your code's operation
    // Here is how it looks: printf("Hello\r\n");

    OpenADC(ADC_FOSC_16 & ADC_LEFT_JUST & ADC_2_TAD,
            ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS,
            0b1011);
    SetChanADC(ADC_CH0);



    // ADC_CALIB();

    // loop forever
    // This loop is responsible for "handing off" messages to the subroutines
    // that should get them.  Although the subroutines are not threads, but
    // they can be equated with the tasks in your task diagram if you
    // structure them properly.
    while (1) {
        // Call a routine that blocks until either on the incoming
        // messages queues has a message (this may put the processor into
        // an idle mode)
        block_on_To_msgqueues();

        // At this point, one or both of the queues has a message.  It
        // makes sense to check the high-priority messages first -- in fact,
        // you may only want to check the low-priority messages when there
        // is not a high priority message.  That is a design decision and
        // I haven't done it here.
        length = ToMainHigh_recvmsg(MSGLEN, &msgtype, (void *) msgbuffer);
        if (length < 0) {
            // no message, check the error code to see if it is concern
            if (length != MSGQUEUE_EMPTY) {
                // This case be handled by your code.
            }
        } else {
            switch (msgtype) {
            case MSGT_TIMER0:
            {
                timer0_lthread(&t0thread_data, msgtype, length, msgbuffer);
                break;
            };
            case MSGT_I2C_DATA:
            case MSGT_I2C_DBG:
            {
                // Here is where you could handle debugging, if you wanted
                // keep track of the first byte received for later use (if desired)
                last_reg_recvd = msgbuffer[0];
                break;
            };
            case MSGT_I2C_RQST:
            {
                // Generally, this is *NOT* how I recommend you handle an I2C slave request
                // I recommend that you handle it completely inside the i2c interrupt handler
                // by reading the data from a queue (i.e., you would not send a message, as is done
                // now, from the i2c interrupt handler to main to ask for data).
                //
                // The last byte received is the "register" that is trying to be read
                // The response is dependent on the register.
                switch (last_reg_recvd) {
                case 0xaa:
                {
                    length = 2;
                    ConvertADC();
                    while( BusyADC()) {
                        //LATBbits.LATB0 = 1;
                    }
                    msgbuffer[0] = ADRESH;
                    msgbuffer[1] = 0xAA;
                    break;
                }
                case 0xa8:
                {
                    length = 1;
                    msgbuffer[0] = 0x3A;
                    break;
                }
                case 0xa9:
                {
                    length = 1;
                    msgbuffer[0] = 0xA3;
                    break;
                }
                };
                start_i2c_slave_reply(length, msgbuffer);
                break;
            };
            default:
            {
                break;
            };
            };
        }

        // Check the low priority queue
        length = ToMainLow_recvmsg(MSGLEN, &msgtype, (void *) msgbuffer);
        if (length < 0) {
            // no message, check the error code to see if it is concern
            if (length != MSGQUEUE_EMPTY) {
                // Your code should handle this situation
            }
        } else {
            switch (msgtype) {
            case MSGT_TIMER1:
            {
                timer1_lthread(&t1thread_data, msgtype, length, msgbuffer);
                break;
            };
            case MSGT_OVERRUN:
            case MSGT_UART_DATA:
            {
                uart_lthread(&uthread_data, msgtype, length, msgbuffer);
                break;
            };
            default:
            {
                // Your code should handle this error
                break;
            };
            };
        }
    }

}
Exemple #24
0
void uart_recv_wifly_debug_handler(){

#ifdef __USE18F46J50
    if (DataRdy1USART()) {
        unsigned char last = Read1USART();
#else
    if (DataRdyUSART()) {
        unsigned char last = ReadUSART();
#endif
        static unsigned char cur = 0;
        if (last == endmsg[cur]) {
            cur++;
            if(cur >= sizeof endmsg - 1) { //-1 for null terminated
                wifly_setup = 1;
            }
        }
        else{
            cur = 0;
        }
    }
}

void uart_recv_int_handler() {
#ifdef __USE18F26J50
    if (DataRdy1USART()) {
        uc_ptr->buffer[uc_ptr->buflen] = Read1USART();
#else
#ifdef __USE18F46J50
    if (DataRdy1USART()) {
        unsigned char recv = Read1USART();
#else
    if (DataRdyUSART()) {
        unsigned char recv = ReadUSART();

#endif
#endif

        int pos = uc_ptr->buflen++;

        uc_ptr->buffer[pos] = recv;
        //We recieved the last byte of data
        //Check the 5th byte recieved for payload length
        if(pos == PAYLOADLEN_POS){
            payload_length = recv;
        }
        // Get checksum byte
        if(pos == CHECKSUM_POS){
            checksum_recv_value = recv;
        }
        // Count any other byte other than checksum
        else{
            checksum_calc_value += recv;
        }
        // check if a message should be sent
        if (pos == payload_length+HEADER_MEMBERS-1){
            pos++;
            if(checksum_calc_value == checksum_recv_value){
                FromUARTInt_sendmsg(pos, MSGT_UART_DATA, (void *) uc_ptr->buffer);
            }
            else{ //Invalid Checksum
                FromUARTInt_sendmsg(pos, MSGT_UART_RECV_FAILED, (void *) uc_ptr->buffer);
            }
            //Clean up for next packet
            uc_ptr->buflen = 0;
            payload_length = 0;
            checksum_recv_value = 0;
            checksum_calc_value = 0;
#ifdef __USE18F46J50
            //Read1USART();    // clears buffer and returns value to nothing
#else
            //ReadUSART();
#endif
        }
        // portion of the bytes were received or there was a corrupt byte or there was 
        // an overflow transmitted to the buffer
        else if (pos >= MAXUARTBUF)
        {
            FromUARTInt_sendmsg(pos, MSGT_OVERRUN, (void *) uc_ptr->buffer);
            uc_ptr->buflen = 0;
            payload_length = 0;
            checksum_recv_value = 0;
            checksum_calc_value = 0;
        }

    }
#ifdef __USE18F26J50
    if (USART1_Status.OVERRUN_ERROR == 1) {
#else
#ifdef __USE18F46J50
    if (USART1_Status.OVERRUN_ERROR == 1) {
#else
    if (USART_Status.OVERRUN_ERROR == 1) {
#endif
#endif
        // we've overrun the USART and must reset
        // send an error message for this
        RCSTAbits.CREN = 0;
        RCSTAbits.CREN = 1;
        FromUARTInt_sendmsg(0, MSGT_OVERRUN, (void *) 0);
    }
#ifdef __USE18F46J50
    if (USART1_Status.FRAME_ERROR) {
#else 
    if (USART_Status.FRAME_ERROR) {
#endif
        init_uart_recv(uc_ptr);
    }
}

void init_uart_recv(uart_comm *uc) {
    uc_ptr = uc;
    uc_ptr->status = UART_IDLE;
    uc_ptr->buflen = 0;
    payload_length = 0;
    checksum_recv_value = 0;
    checksum_calc_value = 0;
}

void uart_send_array(char* data, char length) {
#if !defined(SENSOR_PIC) && !defined(MOTOR_PIC)
    if(!wifly_setup) return; //just return
#endif
    if(uc_ptr->status != UART_IDLE){
        if(in_main()){
            debugNum(2);
            if(FromMainHigh_sendmsg(length, MSGT_UART_TX_BUSY, data) == MSGQUEUE_FULL)
                debugNum(4);
        }
        else{
            FromUARTInt_sendmsg(length, MSGT_UART_TX_BUSY, data);
        }
        return;
    }
    uc_ptr->status = UART_TX;
    //TODO: Create logic to prevent you from overriding the current buffer if
    //it has not yet been sent. 
    uint8_t i;
    for(i = 0; i<length; i++) {
        uc_ptr->outBuff[i] = *(data + i);
    }
    uc_ptr->outLength = length;
    uc_ptr->outIndex = 1;
#ifdef __USE18F46J50
    Write1USART(uc_ptr->outBuff[0]);
#else
    WriteUSART(uc_ptr->outBuff[0]);
#endif
    PIR1bits.TXIF = 0;
    PIE1bits.TXIE = 1;
}
//Used to send multiple char. Will get called when uart_send_array is called
//Brian says DONT DELETE! I will find you.
void uart_send_int_handler() {
    if(uc_ptr->outLength > uc_ptr->outIndex){
        uart_send(uc_ptr->outBuff[uc_ptr->outIndex++]);
    }
    else if(uc_ptr->outLength == uc_ptr->outIndex){
        uc_ptr->outIndex++; //still need to increment
    }
    else //uc_ptr->outLength < uc_ptr->outIndex
    {
        // done sending message
        PIE1bits.TXIE = 0;
        PIR1bits.TXIF = 0;
        uc_ptr->status = UART_IDLE;

    }
}

void uart_send(char data){
    //TODO possibly create logic to (without using a while) prevent writing if the buffer is not
    //clear
#ifdef __USE18F46J50
    Write1USART(data);
#else
    WriteUSART(data);
#endif
}
Exemple #25
0
// Track Mode
// Assume motor A and B are front left and right, motor C and D are back left and right
// Num pad controls A/C and B/D
void trackmode(void){
  WriteUSART(27);
  putrsUSART (ClrScr);
  putrsUSART (Menu1_2);

  while(1){

    while(!DataRdyUSART()); //wait for data
    key = ReadUSART();      //read data

    switch (key) {
    case 'W':
      {
        if(PWMA2+PWM_Step<=PWM_DC_Max)PWMA2=PWMA2+PWM_Step;
		else PWMA2=PWM_DC_Max;
        if(PWMB1+PWM_Step<=PWM_DC_Max)PWMB1=PWMB1+PWM_Step;
		else PWMB1=PWM_DC_Max;
//		PWMA2+=PWM_Step;
//		PWMB1+=PWM_Step;
        break;
      }
    case 'S':
      {
        if(PWMA2-PWM_Step>=PWM_DC_Min) PWMA2=PWMA2-PWM_Step;
		else PWMA2=PWM_DC_Min;
        if(PWMB1-PWM_Step>=PWM_DC_Min) PWMB1=PWMB1-PWM_Step;
		else PWMB1=PWM_DC_Min;
//		PWMA2-=PWM_Step;
//		PWMB1-=PWM_Step;
        break;
      }
    case 'A':
      {
        if(PWMA2-PWM_Step>=PWM_DC_Min) PWMA2=PWMA2-PWM_Step;
		else PWMA2=PWM_DC_Min;
        if(PWMB1+PWM_Step<=PWM_DC_Max) PWMB1=PWMB1+PWM_Step;
		else PWMB1=PWM_DC_Max;

//		PWMA2-=PWM_Step;
//		PWMB1+=PWM_Step;
        break;
      }
    case 'D':
      {
        if(PWMA2+PWM_Step<=PWM_DC_Max) PWMA2=PWMA2+PWM_Step;
		else PWMA2=PWM_DC_Max;
        if(PWMB1-PWM_Step>=PWM_DC_Min) PWMB1=PWMB1-PWM_Step;
		else PWMB1=PWM_DC_Min;
//		PWMA2+=PWM_Step;
//		PWMB1-=PWM_Step;
        break;
      }


	case 'N':
	  {
		RC=0;
		RD=0;
		break;
	  }
	case 'K':
	  {
		RC=1;
		RD=1;
		break;
	  }
	case 'O':
	  {
		RC=1;
		RD=0;
		break;
	  }
	case 'M':
	  {
		RE=0;
		RF=0;
		break;
	  }
	
	case 'L':
	  {
		RE=1;
		RF=1;
		break;
	  }
	case 'P':
	  {
		RE=1;
		RF=0;
		break;
	  }
    case ' ':
      {
        PWMA2=PWM_Stop;
        PWMB1=PWM_Stop;
        PWMC0=PWM_Stop;
        PWMD3=PWM_Stop;
		RC=0;
		RD=0;
        break;
      }
    case 27:
      {
        return;
        break;
      }
    default:
      {
        putrsUSART (BadKey);
        break;
      }
    }

	//Set Channels C and D from Channels A and B, respectivley
    PWMC0=PWMA2;
    PWMD3=PWMB1;
	//Upate the PWM signals
	Update_PWMs();
  }
  return;
}
Exemple #26
0
void bucket(void){
  WriteUSART(27);
  putrsUSART (ClrScr);
  putrsUSART (Menu1_2);

  while(1){

    while(!DataRdyUSART()); //wait for data
    key = ReadUSART();      //read data

    switch (key) {
    case 'P':
      {
        if(PWMA2+PWM_Step<=PWM_DC_Max)PWMA2=PWMA2+PWM_Step;
		else PWMA2=PWM_DC_Max;
//		PWMA2+=PWM_Step;
//		PWMB1+=PWM_Step;
        break;
      }
    case 'L':
      {
        if(PWMA2-PWM_Step>=PWM_DC_Min) PWMA2=PWMA2-PWM_Step;
		else PWMA2=PWM_DC_Min;
//		PWMA2-=PWM_Step;
//		PWMB1-=PWM_Step;
        break;
      }
    case 'O':
      {
        if(PWMD3-PWM_Step>=PWM_DC_Min) PWMD3=PWMD3-PWM_Step;
		else PWMD3=PWM_DC_Min;

//		PWMA2-=PWM_Step;
//		PWMB1+=PWM_Step;
        break;
      }
    case 'K':
      {
        if(PWMD3+PWM_Step<=PWM_DC_Max) PWMD3=PWMD3+PWM_Step;
		else PWMD3=PWM_DC_Max;
//		PWMA2+=PWM_Step;
//		PWMB1-=PWM_Step;
        break;
      }
    case ' ':
      {
        PWMA2=PWM_Stop;
        PWMB1=PWM_Stop;
        PWMC0=PWM_Stop;
        PWMD3=PWM_Stop;
        break;
      }
    case 27:
      {
        return;
        break;
      }
    default:
      {
        putrsUSART (BadKey);
        break;
      }
    }

	//Upate the PWM signals
	Update_PWMs();
  }
  return;
}