2026
2025
2024
2023
2022
2021
2020
全4件 (4件中 1-4件目)
1
PSoC のシリアル通信は双方向のUARTモジュールと受信のRX8と送信のTX8がある、どちらを使ったらいいんだろー、とりあえず送信受信ができればよいのでUARTを使うかな受信は取りこぼしがないように割り込み受信ができるようにUART setupと最後に全体の割り込み許可をする //UART setup UART_1_CmdReset(); //Initialize receiver/cmd buf. UART_1_IntCntl(UART_1_ENABLE_RX_INT); //Enable RX interrupts UART_1_Start(UART_1_PARITY_NONE); //Enable UART //CPU ALL Interrupt Enable M8C_EnableGInt; //CPU ALL Interrupt Enableハイパーターミナルで実験をする。 受信した内容をUART_1_bReadRxDataで読んだ、オッ読めたと思ったら受信完了のビットが1のままだから永久に読んでしまう UART_1_bReadRxDataは使えないと思った。そのほかの読み込み関数 UART_1_cGetChar を使うと時々受信ができていない、関数UART_1_cReadChar は受信していないかのように受信した内容を表示しない、UART_1_iReadChar はUART_1_bReadRxDataと症状が同じだ、受信関数は全部使えない?、受信割り込みを許可しないで使うとどうなるのかな?、 //UART_1_IntCntl(UART_1_ENABLE_RX_INT); //Enable RX interrupts にした。UART_1_bReadRxDataで読んでみたら受信完了のビットもゼロとなって正常に表示できた。UART_1_cGetCharはどうなんだろう、オッツこれも正常に動作している。UART_1_cReadCharもUART_1_iReadCharも正常に表示できた。なーんだ読み込み関数UART_1_bReadRxData、UART_1_cGetChar、UART_1_cReadChar、UART_1_iReadCharは受信割り込みを許可して使えないのか~まとめ(1) 以下の関数は受信割り込みの許可をしないで使用することができる bRxData = UART_1_bReadRxData(); //OK bRxData = UART_1_cReadChar(); //OK bRxData = UART_1_iReadChar(); //OK bRxData = UART_1_cGetChar(); //OKまとめ(2) 以下の3種類は割り込み許可で使用できるUART_1_bCmdLength 、UART_1_szGetParam 、UART_1_CmdResetまとめ(3) バイナリー方式のプロトコルで通信する場合は上記の関数は使えないので受信割り込みを自作する必要があるのかな? あ~つかれるな~
2006年11月30日
コメント(2)

PSoC基板のUART(RS-232C)の送信と受信の実験をしたストロベリー・リナックス社の基板の写真です。UART Module の配線図です。受信入力はP0-0 送信出力はP0-1で行いましたがポートの制約はありません。グローバルリソースの内容です。通信速度を38400bpsに設定しました。bps=24MHz/6/13/8の設定ですPSoCの通信速度の倍数は8倍です、計算結果は384615になり誤差は1.6%となります。1.6%の誤差範囲は通信には問題ないようです。UARTのモジュールのパラメターの内容です。 command terminator = 13の内容はCR(0Dh)で受信コマンドを処理しているようです。テキストコードのプロトコルで使用すれば便利かもしれません。以下がプログラムです参考にして下さい。//----------------------------------------------------------------------------// C main line//----------------------------------------------------------------------------#include <m8c.h> // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Moduleschar *send_buf; //RS232Cvoid main(){ init(); //IO Initialize send_test(); //send test recv_send(); //Loop ari}void init(void) //IO Initialize{ //UART setup UART_1_CmdReset(); //Initialize receiver/cmd buf. UART_1_IntCntl(UART_1_ENABLE_RX_INT); //Enable RX interrupts UART_1_Start(UART_1_PARITY_NONE); //Enable UART //CPU ALL Interrupt Enable M8C_EnableGInt; //CPU ALL Interrupt Enable}void send_test(void) //send test{ unsigned int c; char data[50]="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; UART_1_CPutString("\r\nPSoC UART RS-232C program \r\n"); while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ) ); send_buf = &data[0]; for(c=0; c<26; c++){ UART_1_SendData( *(send_buf + c) ); while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ) ); } UART_1_PutCRLF();}void recv_send(void){ char *recvd; //recv send test (0Dh command) while(1) { if (UART_1_bCmdCheck()){ //Wait for command if(recvd = UART_1_szGetParam()){; //get command UART_1_SendData( *(recvd) ); while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ) ); UART_1_PutCRLF(); } UART_1_CmdReset(); //Reset command buffer } }}初めの2行目が send_test(); で表示しています、数字の1-0までがパイパーターミナルを使用しパソコンから送信してそれを受信した内容です。注意として一つの送信内容とエンターが必要になります。たとえば” 1 ”を送る場合” 1 ”とエンターキー(0Dh)となります。RSー232C通信プロトコルはテキスト以外にバイナリー方式がありますので今回の受信プログラムはバイナリー方式には使用できません。テキスト形式ではUART_1_bCmdCheck()関数は使用できます、そしてその内容はCR(0Dh)を受け付けたときTRUEになるようです。送信のプログラムはそれほど時間がかからなかったのですが受信がまったくできなく、いろいろ実験をして受信することができました。UART_1_bCmdCheck()関数はCR(0Dh)を受信しないとTRUEにならない事が重要なことでした。PSoCは不思議なCPUですが魅力あるCPUですね。日本語でモジュールのパラメータの説明と関数の説明書が欲しいですね。
2006年11月26日
コメント(0)

RSー232Cを使用した送信・受信のテストにハイパーターミナルを使用しますと便利です。注意としてポートの設定のフロー制御を” なし ”にして下さい、その他の設定では受信とその表示はできますがキーボードの送信ができません。ハイパーターミナルの場所はアクセサリの通信の中にあります。キーボードの信号はアスキーコードで出力されます。エンターキーは10進で13、16進でDhです。CR(carriage return)改行のコードですね。
2006年11月26日
コメント(0)

ストロベリーリナックス社のサイプレスPSoC(CY8C27443-PXI)を使用したマイコンボードキットです。LCD表示とタイマーを使用しタイマー1で青色LEDを点灯した画面です。制御にはタイマーは必要不可欠ですがPSoC CPUのタイマーは使えないと思っていましたが試行錯誤の結果、KIさんのホームページでタイマーは使用できることがわかりました。LCDはすんなり表示でき表示画面は参考資料のままです。 Timer16のParametersをこのようにし、Periodを3276(32.768KHz/10)で100msecとします。 boot.asmの ljmp _Timer16_1_ISRをljmp _int_timer16_1に変更しますorg 24h ;PSoC Block DBB01 Interrupt Vector //ljmp _Timer16_1_ISR ljmp _int_timer16_1 reti タイマーとLCDのプログラムです #include <m8c.h> // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules#pragma interrupt_handler int_timer16_1 //ここが必要unsigned int timer_1;unsigned int timer_2;unsigned int timer_3;void int_timer16_1(){ //PRT0DR ^= 0x0F; //点滅テスト用 if(timer_1 != 0){ // timer_1--; } if(timer_2 != 0){ // timer_2--; } if(timer_3 != 0){ // timer_3--; }}void main(){ // Insert your main routine code here. //port0 all out mode(001) //PRT0DM0 = 0xff; // //PRT0DM1 = 0x00; // //PRT0DM2 = 0x00; // //port1 all out mode(001) PRT1DM0 = 0xff; // PRT1DM1 = 0x00; // PRT1DM2 = 0x00; // Timer16_1_EnableInt(); //割り込みマスク1 Enable M8C_EnableGInt; //CPU 全体の割り込み許可 Timer16_1_Start(); //これがないとタイマーは機能しませんでした(詳細不明)lcd_disp(); //LCD表示Loop1: timer_1=10;Loop2: if(timer_1 == 0){ PRT1DR = 0x01; } else{ goto Loop2; } timer_2=10;Loop3: if(timer_2 == 0){ PRT1DR = 0x02; } else{ goto Loop3; } timer_3=10;Loop4: if(timer_3 == 0){ PRT1DR = 0x04; } else{ goto Loop4; } goto Loop1;}void lcd_disp(){ char str[ ] = "User Module"; // Define "RAM" based string LCD_1_Start(); // Initialize LCD hardware LCD_1_Position(0,4); // Position cursor @ row 0, col 4 LCD_1_PrCString("PsoC LCD"); // Print a constant "ROM" string LCD_1_Position(1,2); // Position cursor @ row 1, col 2 LCD_1_PrString(str); // Print "RAM" based string.}
2006年11月13日
コメント(0)
全4件 (4件中 1-4件目)
1


