PsocでACIAエミュレーターを製作する
PsocでACIA(Asynchronous Communications Interface Adapter)を作成する。
まず、入力したシリアル通信の信号をパラレルにするところから始める。
プログラムと実験の回路図は以下の通り。
#include <stdio.h>
#include <stdlib.h>
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void wait(long int time){
while(time--);
}
void LEDOut(int i,int j){
if(i == 7){
LED_P0_7_Switch(j);
}
if(i == 6){
LED_P0_6_Switch(j);
}
if(i == 5){
LED_P0_5_Switch(j);
}
if(i == 4){
LED_P0_4_Switch(j);
}
if(i == 3){
LED_P0_3_Switch(j);
}
if(i == 2){
LED_P0_2_Switch(j);
}
if(i == 1){
LED_P0_1_Switch(j);
}
if(i == 0){
LED_P0_0_Switch(j);
}
}
void charOUT(char* msg){
int cnt;
for(cnt=0;cnt<=7;cnt++){
if(*(msg+cnt)=='1'){
LEDOut(cnt,0);
UART_1_CPutString("S");
UART_1_CPutString("\r\n");
}
}
wait(150000);
for(cnt=0;cnt<=7;cnt++){
LEDOut(cnt,1);
}
}
void main(void){
char* strPtr; // Parameter pointer
char* UART_1_szGetParam(void);
UART_1_CmdReset(); // Initialize receiver/cmd buffer
UART_1_IntCntl(UART_1_ENABLE_RX_INT); // Enable RX interrupts
Counter8_1_WritePeriod(155); // Set up baud rate generator
Counter8_1_WriteCompareValue(77);
Counter8_1_Start(); // Turn on baud rate generator
UART_1_Start(UART_1_PARITY_NONE); // Enable UART
M8C_EnableGInt ; // Turn on interrupts
UART_1_CPutString("\r\n PSoC UART test program. \r\n");
while(1) {
if(UART_1_bCmdCheck()) { // Wait for command
if(strPtr = UART_1_szGetParam()) { // More than delimiter?
UART_1_CPutString("Found valid command\r\nCommand =>");
UART_1_PutString(strPtr); // Print out command
UART_1_CPutString("<\r\n");
charOUT(strPtr);
}
UART_1_CmdReset(); // Reset command buffer
}
}
}
説明:
wait(int);
ループを利用して目で見やすいようにプログラムの実行を中断させています。
LEDOut(int i, int j);
ポート出力を1行で行えるようにした関数です。
参考:
https://www.sgnet.co.jp/technology/c/7-5/
ポインタ型とは、変数そのものではなく変数が格納されたアドレスを指すものであり、途中の「charOUT()」関数にもあるように、ポインタ型と整数で加算すると、次の文字を指定することができる。
実際の動画