Translate

2018年7月5日 星期四

Arduino UNO R3 使用自建C函式庫

參考資料:https://arduino.stackexchange.com/questions/946/how-to-call-c-functions-from-arduino-sketch

UART的使用可以參考http://tomyam-yang.blogspot.com/2017/06/arduino-timer-as-counter.html


要在arduino主程式使用c函式庫,需要把函式庫放在arduino/libraries資料夾下。


並在主程式使用extern "C"{} include 函式


我在libraries底下建一個資料夾放我的.c與.h檔,分別是io.h、iom328p.h、serial.c、serial.h


io.h與iom328p.h是內建的,是定義arduino uno r3的參數,但當你使用自建c函式庫驗證會找不到,所以就把它放進來同一個資料夾內。


底下的程式是自建uart程式,bitrate:9600。

主要副程式

void uart9600_setup(); //初始設定

void serial_put(char *string); //輸出字串

char serial_get(void);//取的字元

void serial_putchar(char string);//輸出字元

主程式:


extern "C"{
#include <serial.h>
}
char rechchar;
char message[]="Hello World";
void setup() {
  // put your setup code here, to run once:
  uart9600_setup();
  serial_put(message);
}

void loop() {
    rechchar=serial_get();
}
serial.c

#include <iom328p.h>
#include <io.h>
void serial_put(char *string)
{
   while(*string)
   {
      while(!(UCSR0A & 0b00100000))
      {  }
      UDR0=*string++;
   }
}
void serial_putchar(char string)
{

      while(!(UCSR0A & 0b00100000))
      {  }
      UDR0=string;
}
char serial_get()
{
  char recchar;
  while(!(UCSR0A & 0b10000000))
  {

  }
  recchar=UDR0;
  //UDR0=*recchar;
  serial_putchar(recchar);
  return recchar;
}
void uart9600_setup()
{
   //unsigned int baud_setting=103;
   UBRR0H=(unsigned char)0;
   UBRR0L=(unsigned char)103;
   UCSR0B=0B00011000;//啟動接收中斷、啟動傳送接收
   UCSR0C=0B00000110;
}
ISR(USART_RX_vect)
{
  char ReceivedChar;
  ReceivedChar=UDR0;
  UDR0=ReceivedChar;
}
serial.h


void uart9600_setup();

void serial_put(char *string);

char serial_get(void);

void serial_putchar(char string);


















沒有留言:

張貼留言