PIC:PIC 通信(1)232C

2008-07-09 :  PIC・マイコン
                                                   日記@BlogRanking

PIC同士の接続については、1、2、3線シリアル・インターフェースが解りやすい。

このうちの、2線式2種類(RS232C、I2C)の接続例図を示す。

ピン名称については、RS232Cでは、Tx、Rx であり、I2Cでは、SCL、SDA である。
3線式のSPIでは、SCK、SDI、SDO で、1線では、DQ と呼ぶ。もちろん、もう1線 基準電位の GND を忘れてはいけない。

ちなみに、PS/2では、CL、DT で、USBでは、D+、D- である。
これらは、GND とさらに +5V ラインも必要だから4線式?

で、通信プログラムの、サンプルコーディングを示す。

RS232C通信のコーディング例 3つ(mikro BASIC、Great Cow BASIC、Swordfish BASIC)
対向はPCでもPICでも同じである。

(段付けのために、先頭に2B空白がある)
---------------- <mikro BASIC> ----- 16F/18F ----------
dim received_byte as byte ' Declare variable

Usart_Init(115200) ' Initialize USART module

if Usart_Data_Ready = 1 then ' If data is received
 received_byte = Usart_Read ' Read received data
end if

Usart_Write(received_byte) ' Send data via USART
' ----------


Forum → Contributors → Hardware USART Library と辿って得られた「usart.h」を流用している。
---------------- <Great Cow BASIC> ---- 16F -----------
dim received_byte ' Declare variable

initusart ' Initialize USART module 19200bps

received_byte=HserIn ' Read received data

HserTX(received_byte) ' Send data via USART
' ----------


(段付けのために、先頭に2B空白がある)
---------------- <Swordfish BASIC> -- 18F -------------
Include "USART.bas" ' Declare module
Include "ISRRX.bas"

Dim received_byte As Byte ' Declare variable

SetBaudrate(br115200) ' Initialize USART module

If ISRRX.DataAvailable Then ' If data is received
 received_byte=USART.ReadByte() ' Read received data
End If

USART.WriteByte(received_byte) ' Send data via USART
' ----------

コンパイラ付属のサンプルそのままかも。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PC:PIC 接続[シリアル編]

2008-07-08 :  PIC・マイコン
                                                   日記@BlogRanking
PCとPICをシリアル(RS232C)で接続するには、
このようなUSB・シリアル変換ケーブルを使うと、このようなRS232CインターフェースICが必要である。

世の中には、こういったRS-232C - TTLレベルの簡易変換方法もあるが。
<紙>は、UP12 USB-PDC Converterを使っている。
PDCコネクタを分解して、3線(Tx、Rx、GND)をブレッドボードに挿している。

そこで、Active BASICフォーラムにある、RS232C 通信用プログラムを参考に、
<紙>流のサブプログラム(インクルードファイル:RS232Cdecl.sbp)を作った。詳細は、後記。

上記からDLした、RS232Ctest.lzh に入っている、RS232Ctest.sbp を使う。
RS232Cdecl.sbp では、シリアルポートをオープンする関数 CommOpen を定義した。

CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
 Ppari As Long, Pstop As Long ) As HANDLE
'    Pcomm:"COM2"のようにポート名を指定する。
'    Pbaud:9600,19200,115200 等々、速度を指定する。
'    Psize:7 か 8 で、データ長(ビット数)を指定する。
'    Ppari:1 か 0 で、パリティの有無を指定する。
'    Pstop:1 か 2 で、ストップビット長を指定する。
'    戻り値は、COMポートのハンドルである。

これを用いたシリアル通信を行う、サンプルプログラムを示す。
PCのシリアルポート(Dサブ9ピン)でも、上記UP12でも同じように使える。
(エラー処理は省略する)
'------------------- < Active BASIC > -----------------
#include "RS232Ctest.sbp"
#include "RS232Cdecl.sbp"
#prompt
'
Dim hComm As HANDLE 'COMポートハンドル
Dim a$ As String, buf[20] As Byte, k As Long
'
hComm=CommOpen("COM2",115200,8,0,1) ' オープンCOMポート
'            COMポート名,Baud,Bits,Pari,Stop
'
buf[0]=&H41 : buf[1]=&H42 : buf[2]=0 : k=2 ' "AB"の2文字を送出する例。
WriteFile(hComm,buf,k,VarPtr(k),ByVal 0)
'
ReadFile(hComm, buf,20,VarPtr(k), ByVal 0) ' 受信文字列をプリントする例。
buf[k]=0 : Print "受信文字列=";MakeStr(buf)
'
CloseHandle(hComm) ' クローズ COMポート
End
' --------------------------------- プログラム終了。

<紙>はこのようなプログラムでPICと接続している。

RS232Cdecl.sbp のソースを示す。(段付けのために、先頭に2B空白がある)
'-------------------------------- < RS232Cdecl.sbp > -------------------
Function CommOpen( Pcomm As String, Pbaud As Long, Psize As Long,
  Ppari As Long, Pstop As Long ) As HANDLE 'シリアルポートをオープンする
Dim comname[10] As Byte, MsgD As *Byte
Dim a$ As String, hComm As HANDLE

comname[0]=0 : lstrcpy(comname,StrPtr(Pcomm)) '使用するポート
'ポートのオープン
hComm = CreateFile(comname, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0,
 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hComm = -1 Then
 MsgD=lstrcat(comname,"が使えません") 'ポートオープン失敗時
 MsgD[16]=0 : a$=MakeStr(MsgD) : Print a$
 Input "OK";a$
 End '強制終了
End If
CommOpen=hComm

'シリアル通信の設定
GetCommState(hComm, stDCB)
 stDCB.BaudRate = Pbaud '転送速度の指定(9600/115200,・・・)
 stDCB.ByteSize = Psize 'ビット長の指定(8/7)
 stDCB.fBitFields = &H1311 'バイナリモードON,Xon/Xoff制御ON,RTS強制起動,DTR強制起動
 stDCB.Parity = Ppari 'パリティの設定(0:パリティなし / 1:あり)
 stDCB.StopBits = Pstop - 1 'ストップビット数を指定(1/2 ビット)
 stDCB.XonChar = &H11
 stDCB.XoffChar = &H13
 stDCB.XonLim = 2048
 stDCB.XoffLim = 512
SetCommState(hComm, stDCB) '必要な部分だけ書き換える

'タイムアウトの設定
GetCommTimeouts(hComm,timeOut)
 timeOut.ReadIntervalTimeout = 10 '文字の読み込み待ち時間(10ms)
 timeOut.ReadTotalTimeoutMultiplier = 10 '読込の1文字あたりの時間(10ms)
 timeOut.ReadTotalTimeoutConstant = 2000 '読込の定数時間(2000ms)
 timeOut.WriteTotalTimeoutMultiplier = 0 '書込の1文字あたりの時間(0:タイムアウトしない)
 timeOut.WriteTotalTimeoutConstant = 0 '書込の定数時間(0:タイムアウトしない)
SetCommTimeouts(hComm, timeOut) 'タイムアウトの設定

End Function
'---------------------------------

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PC:PIC 接続[パラレル編](2)

2008-07-07 :  PIC・マイコン
                                                日記@BlogRanking
PCからPICにデータを送信する方法として、パラレル通信がある。
処理速度の違いを吸収して、確実に通信する場合、ハンドシェィク通信を行う。

ハンドシェィクとは、握手であり、確実に送達を確認し合うことである。
処理の手順を要約すると、以下のようになる。

送出側(PC)
1.ビジーOFFを待つ。
2.データをセットする。
3.ストローブをONにする。
4.ビジーONになったら、ストローブをOFFにする。
以上で、1単位データ(8ビット=1バイト)を送出する。

受取側(PIC)
1.ストローブONを待つ。
2.ビジーをONにする。
3.データを取り込む。
4.ストローブOFFを待って、ビジーをOFFにする。
以上で、1単位データを受取る。

PCのパラレルポートでは、ストローブはピン#1、ビジーはピン#11、
データはピン#2~9(8ビット)を使う。
(初期値は、ストローブ/ビジーともOFFにする。)

Active BASICによるPC側の1バイト送出、サンプルプログラムを示す。

(エラー処理は省略する)
(段付けのために、先頭に2B空白がある)
'------------------- < Active BASIC > -----------------
' 直接I/O 制御関数群(InpB、OutB)宣言
Declare Function InpB Lib "VBIOSCM_DLL.DLL" Alias "_InpB@4" (ByVal Port As Integer) As Integer
Declare Sub OutB Lib "VBIOSCM_DLL.DLL" Alias "_OutB@8" (ByVal Port As Integer, ByVal dat As Integer)
' 直接I/O 制御 開始/終了処理(IOSCM_Start、IOSCM_Stop)宣言
Declare Function IOSCM_Start Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Start@0" () As Integer
Declare Function IOSCM_Stop Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Stop@0" () As Integer
#prompt
'
Dim addr As Integer
'
IOSCM_Start() ' IOSCM 開始処理をコール
addr=&H378 ' プリンタポート、環境にあわせて変更
'
OutB(addr+2,0) ' データポートを出力モードに設定
'
Out_Byte( Asc("A") ) ' ハンドシェィクによる1バイト送出
'
IOSCM_Stop() ' IOSCM 終了処理をコール
End ' プログラム終了。
'---------------- 1バイト送出サブルーチン
Sub Out_Byte ( data As Byte )
 While ( InpB(addr+1) and &H80 ) = 1
 Wend ' BUSY OFF を待つ
 OutB(addr,data) ' データをセットする
 OutB(addr+2,1) ' STROBE を ON にする
 While ( InpB(addr+1) and &H80 ) = 0
 Wend ' BUSY ON になったら
 OutB(addr+2,0) ' STROBE を OFF にする
End Sub
' -------------- プログラム終り
合計10ピンも使うので、40ピンPICでないと使えないかも。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PC:PIC 接続[パラレル編](1)

2008-07-06 :  PIC・マイコン
                                                   日記@BlogRanking
PCのパラレルポート(プリンタポート)を、ActiveBASIC (Ver.4)を用いて直接操作して、
PICと通信する方法をまとめる。

まず、プリンタポートの仕様は、AT互換機パラレルプリンターポートにある。
また、フリー百科事典『ウィキペディア(Wikipedia)』では、パラレルポートといった記述がある。
PCで利用することを考えると、これが分かりやすい。

ですが、Windows XP では、直接操作が許されていないので、IOSCM.SYSを使う。
実際に使うのはその内の、次の2ヶのみである。(メインプログラムと同じ場所に置いておく)
ioscm.sys、vbioscm_DLL.dll

メインプログラムでは、DLL の使用宣言をし、開始処理を呼び、IOを行う。

(段付けのために、先頭に2B空白がある)
'------------------- < Active BASIC > -----------------
' 直接I/O 制御関数群(InpB、OutB)宣言
Declare Function InpB Lib "VBIOSCM_DLL.DLL" Alias "_InpB@4" (ByVal Port As Integer) As Integer
Declare Sub OutB Lib "VBIOSCM_DLL.DLL" Alias "_OutB@8" (ByVal Port As Integer, ByVal dat As Integer)
' 直接I/O 制御 開始/終了処理(IOSCM_Start、IOSCM_Stop)宣言
Declare Function IOSCM_Start Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Start@0" () As Integer
Declare Function IOSCM_Stop Lib "VBIOSCM_DLL.DLL" Alias "_IOSCM_Stop@0" () As Integer

Dim addr As Integer, ret As Integer ' 変数定義

ret=IOSCM_Start() ' IOSCM 開始処理をコール
If ret And 1 Then ' エラーの時は直接I/O制御不可のため終了
 Print "IOSCM Init Error!!"
 End
End If ' 以後は直接I/O 制御が可能になる
'
addr=&H378 ' プリンタポート、環境にあわせて変更
'
OutB(addr+2,&H0B) ' データポートを出力モードに設定する。コントロールポートは全てLowに。
OutB(addr,0) ' データポートを全てLowにする。

以下、
 OutB(addr,xxx) ' データポートへ xxx を出力する。
 xxx=InpB(addr+1) ' ステータスポートから入力する。
等で使える。

最後は、
*owari ' 終了
ret=IOSCM_Stop() ' IOSCM 終了処理をコール
End
となる。

なお、データポートを入力モードにするには、
OutB(addr+2,&H2B) ' 入力モードに設定する。コントロールポートは全てLowに。
である。


例えば、ピン#2(データポートの0ビット)をPICに繋いで、スイッチの代わりに使う。
OutB(addr+2,&H0B) ' データポートを出力モードに設定する。
OutB(addr,0) ' スイッチオフ。
OutB(addr,1) ' スイッチオン。
となる。

ついでに、PC上での時間待ちは Sleep(xx) 命令を使う。
xx は ミリ秒単位であるが、実際には15mS 単位に切り上げられる。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(15)割込

2008-07-05 :  PIC・マイコン
                                              日記@BlogRanking
前回載せた、0.5秒毎のLED点滅プログラムを、
10mS 毎の TMR0 割込による方式に変えてみました。

なお、20MHz発信器では正確に10mSはだせません。9.984mS になります。
以下、SDCC を除く4言語分を載せます。

(段付けのために、先頭に2B空白がある)
(コメントの日本語がエラーに成るものがあるかもしれない)
(config 定義は正しくないかもしれない)

---------------- <mikro BASIC> ------------------------
' chip(16F873A)、clock(20MHz)、config は IDE で設定する。
program test
dim i as byte
sub procedure interrupt
 if INTCON.T0IF = 1 then ' TMR0 interrupt
  ClearBit(INTCON,T0IF) ' Claer T0IF
  TMR0 = 61 ' Next 10mS
  inc(i)
 end if
end sub
'-------------------
main:
 OPTION_REG = 0x87 ' Assign prescaler to TMR0 1:256
 TMR0 = 61 ' (256-61)=195 0.2us*195*256=9.984ms
 INTCON = %10100000 ' Enable TMRO interrupt
 TRISC.0 = 0 ' output
 PORTC.0 = 1 ' on
 i = 0
 while true
  if i > 49 then
   PORTC.0 = 1 - PORTC.0 ' toggle
   i = 0
  end if
 wend
end.


---------------- <Great Cow BASIC> --------------------
#chip 16F873A, 20 ' MHz
#option bootloader
#config HS_OSC, WDT_OFF
Dim i, xx As Byte ' As Byte は省略可。この文自体が省略可。
OPTION_REG = 0x87 ' Assign prescaler to TMR0 1:256
TMR0 = 61 ' (256-61)=195 0.2us*195*256=9.984ms
set INTCON.TMR0IE on ' Enable TMRO interrupt
set INTCON.GIE on
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
i = 0
do
 if i > 49 then
  xx = PORTC.0 ' toggle
  PORTC.0 = 1 - xx '
  i = 0
 end if
loop
'-------------------
sub Interrupt
 If INTCON.TMR0IF on then ' TMR0 Interrupt occurred
  set INTCON.TMR0IF off ' Clear the interrupt
  TMR0 = 61 ' Reset for Next 10mS
  i = i + 1
 End If
End sub


---------------- <Swordfish BASIC> --------------------
Device = 18F2550
Clock = 24 ' MHz
Config
 PLLDIV=5, CPUDIV=OSC3_PLL4, FOSC=HSPLL_HS, WDT=OFF
Dim TMR0ON As T0CON.7,
 T08BIT As T0CON.6,
 T0CS As T0CON.5,
 T0SE As T0CON.4,
 PSA As T0CON.3,
 TMR0IE As INTCON.5,
 TMR0IF As INTCON.2,
 TMR0 As TMR0L
Dim i As Byte
Interrupt TMR0_Interrupt()
 If TMR0IF = 1 Then // Check if a TMR0 Interrupt occurred
  TMR0IF = 0 // Clear the interrupt
  TMR0 = 22 // Next 10mS
  Inc(i)
 EndIf
End Interrupt
'----------------------
TMR0ON = 0 // Disable TMR0
T08BIT = 1 // Ensure TMR0 is working in 8 Bit mode
T0CS = 0 // Ensure TMR increments from internal clock
T0SE = 0 // Only used if external source is selected
PSA = 0 // Ensure the Clock source uses the Prescaler
T0CON.0 = 1 // Set the Prescaler bits
T0CON.1 = 1 // 1:256
T0CON.2 = 1 // (256-22)=234, 234*1/6*256=9.984mS
TMR0 = 22 // Set the TMR0 register
TMR0IE = 1 // Enable TMR0 Interrupts
Enable(TMR0_Interrupt) // Enable the TMR0 Interrupt Handler
TMR0ON = 1 // Enable TMR0 to increment
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
i = 0
While true
 If i > 49 then
  Toggle(PORTC.0) ' toggle
  i = 0
 Endif
Wend


---------------- <C18> -----------------------------
#include <p18cxxx.h> // PIC18F2550
#pragma config PLLDIV = 5
/*  その他 20MHz -> 24MHz */
#pragma interrupt ISR // 割込み宣言(優先順位使わない)
#pragma code ISR = 0x08 // 割込みベクタへのjmp命令セット
void Jump_ISR(void){
_asm goto ISR _endasm
}
#define LED0 PORTCbits.RC0 // LED 定義
#pragma udata
unsigned char i;
#pragma code
void main(){
 T0CON = 0b01000111;
   // TMR0ON = 0; ' Disable TMR0
   // T08BIT = 1; ' TMR0 is working in 8 Bit mode
   // T0CS = 0;  ' TMR increments from internal clock
   // T0SE = 0;  ' Only used external source
   // PSA = 0;   ' Ensure the Clock source uses the Prescaler
   // .2 = 1;   ' Prescaler bits
   // .1 = 1;   ' 1:256
   // .0 = 1;   ' (256-22)=234, 234*1/6*256=9.984mS
 TMR0L = 22; // Set the TMR0 register
 INTCONbits.TMR0IE = 1; // Enable TMR0 Interrupts
 T0CONbits.TMR0ON = 1;
 INTCONbits.GIE = 1;
 TRISCbits.TRISC0=0; // output
 LED0 = 1; // on
 i = 0
 while (1){
  if ( i > 49 ){
   if ( LED0 ) LED0=0; else LED0=1;
   i = 0;
  }
 }
}
//----------------------
void ISR(void){ // 割り込み関数
 if(INTCONbits.T0IF){ // タイマ0割り込み?
  INTCONbits.T0IF=0; // タイマ0割り込みフラグを0にする
  TMR0L = 22; // Re-Set the TMR0 register
  i ++ ;
 }
}
できるだけ、各言語の特徴を出したつもりです。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(14)言語比較

2008-07-04 :  PIC・マイコン
                                                 日記@BlogRanking
これまでに使ってみた言語について、独断と偏見によるまとめを行います。

1.対象PIC、 2.有償/無償、 3.標準LIb、 4.寸評 でまとめる。
最後に入門用プログラム「0.5秒毎のLED点滅」ソースを示す。(順不同)

mikro BASIC
1.16F、18F 両用。
2.有償。Demo 版は 2kW まで。(18F では、3.5kB 位で引っ掛かった。)
3.標準Lib 多い。Forum にも数多くある。
4.オブジェクトサイズは大きい。特に LCD Lib。
 入門者向けには、適していると思う。16F でも 18F でも。
 サブルーチンの前方参照は不可。

Great Cow BASIC
1.16F、18F 両用。
2.フリーソフト。open source
3.標準Lib 少々あり。Forum にもある。
4.バグが多い。割込のサポートが弱い。データ型は2Bまで。
 宣言なしで変数が使えるのは、デバッグに時間が掛かる。
 熟知していれば、16F 用フリーBASIC としては良いと思う。
 18F では、使えないかも。
 サブルーチンの前方参照は可能。

Swordfish BASIC
1.18F 専用。
2.有償。SE(Special Edition) 版は、RAM 256B 以下が制限。
3.標準Lib 多い。Forum にも数多くある。
4.オブジェクトサイズは最適だと思う。
 USBは使えないが、18F 用ならほぼフリーで使える。
 サブルーチンの前方参照は不可。

SDCC
1.16F、18F 両用。(18F では、リンカでエラーとなった後使っていない)
2.フリーソフト。open source
3.標準Lib なし。ネットで探す。
4.オブジェクトサイズは特に大きい。特に BANKSEL が多すぎる。
 16F 用のC言語なら、mikroC demo 版で良いのではないか?
 (<紙>は使っていないが。)
 サブルーチンの前方参照にはプロトタイプ定義が必要。

C18
1.18F 専用。
2.有償。60 日間はフリー。以降は最適化なしになるだけ。
3.標準Lib 多い。Forum にも数多くある。
4.標準Lib は使いづらい。オブジェクトサイズは大きい。
 USBも含め、ほぼフリーで使える。さすが本家本元。
 サブルーチンの前方参照にはプロトタイプ定義が必要。

<紙>的には、
 16F --> mikro BASIC   & Great Cow BASIC
 18F --> Swordfish BASIC & C18     かな。

以下に、ソースを列挙する。
(段付けのために、先頭に2B空白がある)
(コメントの日本語がエラーに成るものがあるかもしれない)
(config 定義は正しくないかもしれない)

---------------- <mikro BASIC> ------------------------
' chip(16F877A)、clock(20MHz)、config は IDE で設定する。
program LED_Blink
main:
 TRISC.0 = 0 ' output
 PORTC.0 = 1 ' on
 while true
  PORTC.0 = 1 - PORTC.0 ' toggle
  delay_ms(500)
 wend
end.

---------------- <Great Cow BASIC> --------------------
#chip 16F877A, 20 ' MHz
#option bootloader
#config HS_OSC, WDT_OFF
Dim xx As Byte ' As Byte は省略可。この文自体が省略可。
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
do
 xx = PORTC.0 ' toggle
 PORTC.0 = 1 - xx '
 wait 50 10ms
loop

---------------- <Swordfish BASIC> --------------------
Device = 18F2550
Clock = 24 ' MHz
Config
  PLLDIV=5, CPUDIV=OSC3_PLL4, FOSC=HSPLL_HS, WDT=OFF
TRISC.0 = 0 ' output
PORTC.0 = 1 ' on
While true
 Toggle(PORTC.0) ' toggle
 DelayMS(500)
Wend

---------------- <SDCC> -------------------------------
#include <sdcc-lib.h>
#include <pic16f877a.h>
int at 0x2007 __config = _HS_OSC & _PWRTE_ON;
int ms, mcnt;
TRISC.0 = 0; // output
PORTC.0 = 1; // on
void main() {
 while (1) {
  PORTC ^= (1<<0); // toggle
  ms = 500;
  while ( ms -- )
   for ( mcnt = 0; 330 > mcnt; mcnt ++ );
 }       // 330 が正しく 1mS かどうかは怪しい
}

---------------- <C18> -----------------------------
#include <p18cxxx.h> // PIC18F2550
#pragma config PLLDIV = 5
/*
    その他 20MHz -> 24MHz
*/
#include <delays.h>
#define LED0 PORTCbits.RC0 // LED 定義
#pragma code
void main(){
 TRISCbits.TRISC0=0; // output
 LED0 = 1; // on
 while (1){
  if ( LED0 ) LED0=0; else LED0=1;
  Delay10KTCYx(150); /* Delay 250mS */
  Delay10KTCYx(150);
 }
}

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(13) GCBC

2008-07-03 :  PIC・マイコン
                                                日記@BlogRanking
 PIC16F をステて、PIC18F 一本でと思いながらも、まだ未練がある。
そんなときに、フリーのGreat Cow BASICに手を出してしまった。
 open-source で、PIC16F、PIC18F 両用である。
標準ライブラリはまあまあで、Forum にも若干ある。

だが、結論から言うと、欠点が多いBASIC 言語である。
1.バグが少なくない。
 <紙>が見つけた、重大なものの2件を後で示す。
2.変数は、殆どバイト型のみ。(ワード型も使えるが)
 宣言文で「As Byte」は省略可。
3.原始BASICのように、変数宣言しなくても使える。
 逆に言えば、デバッグ効率が落ちる。
4.割込処理が弱い。つまり、USBデバイスは作れない。

良いところは、
1.オブジェクトサイズが十分に小さい。
2.tiny bootloader に対応したオブジェクトを生成できる。
 (「#option bootloader」が追加されている。)
3.参照されるサブルーチンを後で記述できる。(前方参照可能)
 mikroBASIC や Swordfish BASIC は後方参照のみ可能。
 C言語では、プロトタイプが必要。
4.アセンブラを使うよりは、格段に生産性を高められる。


それで、chip をまた取り替えた。今度は、PIC16F873Aにグレードダウン。
と言っても、18F2550 を外して 16F873A を挿しただけですが。

で、これまでのうち9本を移植してみた。
バグに悩まされて、Swordfish の時とは逆に、1~2日に1本のペースだった。
バグを承知ならば、PIC16F 用には十分使えるかも。
(PIC18F は試していない。Swordfish BASIC がある。)


発見した重大なバグ2件は、「Forum」→「Compiler Problems」と辿って、
「BANKSEL is incorrect」
「IntOff is incorrect」
を見て下さい。(下手な英語ですが)

BANKSEL の件は、SDCCとは逆に最適化しようとしているようだが、
複雑(?)なif 文などの場合に生成が漏れてしまうようである。
if 文はなるべく単純化することで回避した。

IntOff/IntOn については、ついにコンパイラそのものを直してしまった。
FreeBASIC で書かれているので、FreeBASIC コンパイラをDLし、
Great Cow BASIC コンパイラソースを解読した。
これで、割込処理は安心して使えそうである。


最後に、オブジェクトが小さい一例を載せる。
<紙>の結果(概数)
------------------------------- ROM used -- 主な原因
16F877A + mikroBASIC(標準 LCD lib)1,700 Word  "LCD lib"
16F877A + mikroBASIC(自作 LCD lib)1,200 Word
16F877A + SDCC    (自作 LCD lib)1,800 Word  "BANKSEL"
18F2550 + Swordfish  (標準 LCD lib)(2,220Byte)
16F873A + Great Cow (標準 LCD lib)1,140 Word

これは、「Forum」→「Open Discussion」に載せている。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(12) SFBC

2008-07-03 :  PIC・マイコン
                                                   日記@BlogRanking
Swordfish BASIC compiler を見つけた。
PIC18F 専用(PIC16F 版の予定はないとのこと)であるが、こんな記述がある。

 The Special Edition (SE) version of Swordfish is a free, fully functional
and non expiring version of the compiler.
 It includes everything you get with the commercial version, including the full list of supported microcontrollers and library source code.
 The compiler is only constrained in terms of the amount of RAM available during compilation.

つまり、データサイズの制限以外は完全フリーで使える。
さらに、オブジェクトサイズが比較対象に比べて格段に小さいと宣伝している。
これは、試してみたい。PIC16F はステてもいいかも。

で、ブレッドボード上、16F877A をはずして、18F2550 に取り替えた。

tiny bootloader は、以前のUSBデバイスのテストの時に書き込んである。

標準のLibが多いし、Forum にも幾つか有る。
それで、既存プログラムを毎日、1~2本ずつ移植してみた。
ADC、USART(<-->PC)、PWM、I2C(master)-RTC、CCP(赤外線リモコン)、割込みなど、計13本。

確かに、オブジェクトサイズは小さいと感じた。


一方で、mikroBASIC でのI2Cスレーブのサンプルソースを見つけたので、
PIC18F2550(master) <---> PIC16F88(slave) の通信実験も行った。
I2Cスレーブは、割込方式とポーリング方式の2種類を。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(11) tinybld

2008-07-02 :  PIC・マイコン
                                                日記@BlogRanking
TinyBootloaderを、mikroBASICを使った PIC16F 用プログラムに
適用する場合について、整理しておきます。
 今日現在は、「tinybld197 May,2008」になっているが、
<紙>が使っているのは、「tinybld195 Sep.2007」です。


mikroBASIC が生成するHEXファイルの1行目は、例えば次のようになる。
:10-0000-00-2728-FF3F-FF3F-FF3F-0D30-0313-8312-FC00-03
( - は<紙>が判り易いように追加したもの)
一般形では、次のようになるはずです。
:10-0000-00-2???-FF3F-FF3F-FF3F-????-????-????-????-??

これにパッチをかけて、つぎのようにする。
:10-0000-00-8A01-2728-FF3F-FF3F-0D30-0313-8312-FC00-B6

つまり、0番地目の、2728(例です)の前に 8A01(=CLRF PCLATH)を挿入し、
1番地目の FF3F を消し、チェックサムの 03(例です)に B3 を加える。

これで、0番地から(3番地までが)
  goto main
だけなのが、
  CLRF PCLATH
  goto main
となる。

なお、HEXファイルの仕様については、ここか、ここが参考になります。

また、SDCC(Small Device C Compiler)を使うなら、
TinyBootloader の条件を満たすので、上記のことは不要です。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(10) SDCC

2008-07-01 :  PIC・マイコン
                                                日記@BlogRanking
PIC16F877A & mikroBASIC で遊んでいたら、2kW の制限が気になりだした。

RTCを読んでLCDで表示し、時刻変更は赤外線リモコンでコントロールする
ようなものを作ると、1.7kW を超えてしまった。

で、どうするか?(14ビット/16ビット共通で探してみた。)

1.US$ 149 で購入する。
  ・・・ムリ。
2.フリーのBASICを探す。
  boostBASIC は?beta版なので機能無制限だが、期限付き 2008.5.1 迄。
  (現状は、期限なしで、2kW の制限が付いた。)
  気に入らないのは、ポート名が大文字ダメ小文字であること。(PORTC --> portc)
  ・・・却下。
3.PIC18F 専用のBASICなら、Swordfish Compiler がある。
  ・・・どうしよう?
4.C言語に移るか。
  SDCC(Small Device C Compiler)はどうか。・・・ライブラリが無い。

言語選定のためには、PIC Micro Controller Languages (古いような気がするが)がうってつけかも。


何れにしろ、mikroBASIC のライブラリから脱却し、自作することにした。
PIC16F877A 向け自分専用で、mikroBASIC 標準のものをパクって7種類作った。
LCD、USART、ADC、I2C(master)、PWM、Flash、EEPROM

この自作lib により、8本を書き換えてみた。上記は、1.2kW となった。
今しばらく、mikroBASIC が使える。(さらに、PIC18F2550 専用版も作った。)


そこで、これらをC(SDCC)言語版に書き換え、SDCCに挑戦してみた。

mikroBASIC &自作 lib 版を6本、PIC16F877A でSDCCに移植してみた。
結果、BANKSEL のオンパレードとなり、サイズが激増してしまった。

SDCC のobjサイズ = mikroBASIC の1.5倍 + 200W + ムダな include 分
(include すると、使っていなくてもオブジェクトが生成される。(当然ですか))

ということは、・・・振り出しに戻ったということだァ。4月が過ぎ去った。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(9) mikroBASIC

2008-06-30 :  PIC・マイコン
                                                   日記@BlogRanking
今回は、mikroBASIC を使ってのいろいろな入出力の方法を纏めておく。

LED点滅:
  mikroBASIC 標準の delay_ms(500) と、
  PORTC.0 = 1 - PORTC.0 で、OK。

LCD表示:
  mikroBASIC 標準の LCD(4-bit interface) Library でOK。

RS232C通信:(対向はPCでもPICでも)
  mikroBASIC 標準の USART Library でOK。

I2C通信:(こちらがマスターの場合)
  mikroBASIC 標準の I2C Library でOK。
   RTCのアドレスは、$A2(読取)、$A3(書込)
   EEPROMのアドレスは、$A4(読取)、$A5(書込)

CdSでADC:
  mikroBASIC 標準の ADC Library を使う。
  22kohm との電圧分割では、0.62V~3.3V となった。
  3.1k~42.7kohm の変化(0.6k~1000kohm にはならなかった)。

赤外線リモコン受信:
  CCPのcapture モードでパルス長を計る。
  PPM(Pulse Position Modulation)の仕様は、これがよい。
  それと、これも参考になる。
  わたしは、PCのTVボード付属のリモコンで遊んでいる。
  家のエアコン用リモコンは仕様が違うようだ。

PS/2・KB入力:
  mikroBASIC 標準の PS/2 Library でOK。
  但し、割込は使えなくなる。
  こんなのもある。(PICが PS/2・KBになる。)
  やってみたものの1つ。

PS/2・マウス入力:
  通信プロトコルは、The PS/2 Mouse/Keyboard Protocolが親切。私にも理解できた。
  ここに、「The PS/2 Mouse Interface」なども載っている。
  とりあえず、割込なし wait 方式で作った。
  ここにある「TB055 Source Code - PS/2 to USB Mouse Translator」
  は、割込方式によるマウス入力である。
  これもやってみたいものである。

これらで3月が過ぎ去ったのである。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(8) 回路図

2008-06-30 :  PIC・マイコン
                                                日記@BlogRanking
 各種 PIC デバイスを、mikroBASIC 及び C18 コンパイラで実験できた。
今度は、LCDに表示し、PCなしでも動くようにしたい。

 3ヶ月ぶりにアキバに行き、LCDと、40ピンの 16F877A を買った。
ついでに、赤外線受光素子、CdSセル、RTC、EEPROM も買った。

 ブレッドボードを整理し、16F877A に変えたので、先ずは、
(MPASMでアセンブルし)tiny bootloader ファームを書き込んだ。

で、テストは例によってLEDの off/on である。言語は、mikroBASIC。
次は、RS232CによるPCからの受信/返送信。
これらは、16F873A 用のソースを流用してOK。

 いよいよ、LCDを繋ぐ。ハンダ付けをしてと。
データは4ビットモードで十分。RWは使わず GND 固定。
mikroBASIC の LCD lib の説明に RW ピンのことが補足で書いてあった。
コントラストは・・・DIODE で GND に落としての輝度固定とした。
これは、Web検索で見つけた回路である。
いよいよ、本番。Mikroelektronika 社のサンプルでOKOK。


 こんな文章ばかりの blog では殺風景なので、回路図を入れることにした。
やはり、水魚堂さんのエディタでしょう。「水魚堂さん」ありがとう御座います。
ついでに、BLUEさんの lib もDLしPIC分を改造させていただきました。

やっと、回路が書けるようになりましたので、以下に載せます。
PIC16F877A で一通り実験するための、わたし的評価ボードです。



お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(7) USB・HID/CDC

2008-06-29 :  PIC・マイコン
                                             日記@BlogRanking
 今度は、「HIDクラス」に挑戦した。
結局はマイクロチップ社のサンプルソースをDLするのだが。

その1:スタンダード(2ボタン)マウスエミュレータ
(マウスカーソルが円を描くように動くもの)

その2:インテリマウス化
(3ボタン目の追加)

その3:スクロールのエミュレーション

その4:KBのエミュレーション

PIC18F2550 を、これらUSBデバイス化するファームウェアを作るには、
「pic18Fusb.online.fr」が非常に参考になったのだが、
この Wiki は削除されたよう(フランス語はチンプンカンプンです。)

これらソースをC18でコンパイルし、tiny bootloader で書き込んで、
PICを、PCに繋ぐと、自動認識し、エミュレーションしてくれた。


 さらに、HID汎用デバイス用のファームウェアは、
「Jan Axelson's Lakeview Research」のUSBのページの中のHIDsのページ
からDLして、汎用デバイスクラスと同じ機能のものを作った。

PC側は、デバイスドライバは不要だが、
デバイスにアクセスするための関数定義は、インクルードファイルを用いた。


 さらにさらに、CDCクラスのファームウェアも、
マイクロチップ社のサンプルソースをDLする。
これを、汎用デバイスクラスのものと見比べながら修正した。

inf ファイルは添付されているので、それを使い、
PCソフトは、以前に作ってあったCOMxのIO用のものを若干修正して用いた。


 これで、PIC18F2550 をUSBデバイス化し、PCから通信することは、
3種類のクラス(汎用、CDC、HID汎用)とも一応完了した。
2月はこれで終わった。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(6) USB・Gen

2008-06-29 :  PIC・マイコン
                                                日記@BlogRanking
さて、目標であったUSBデバイスへ挑戦する。

先ずは、mikroBASIC 組み込みの USB HID Library を使ったサンプルプログラムを
コンパイルしてみたが、demo版の制限でダメでした。

ネットであちこち探しまくっていたが、なんのことは無い、本家でよかったのだ。

マイクロチップ テクノロジー ジャパン社のHPにある、「PIC関係のリンク」に載っている
「USBコントローラ内蔵のPIC18F2550の使用例」が、ピッタリであった。

 早速動かしたいところだが、その前に、C18 コンパイラが必要だ。
C言語は知らないけど、何とかなるだろうと、インストールしMPLAB に登録した。

上記HPからDLしたものからクロック数の変更だけで、コンパイル/リンクし、
tiny bootloader で書き込み、添付のテストプログラムを動かした。

 Microchip社のUSBブートローダでなくても、tiny bootloader でも共存可能だ。
(当たり前の話だけど。リンカースクリプトが読めれば。
 マイクロチップ社のUSBブートローダは0番地から常駐し、
 ターゲットプログラムは 0x800 からになる。
 一方、tiny bootloader はROMの最上位番地に常駐する。)

で、このUSBデバイスは、デバイスクラスの分類では「汎用」なので、
デバイスドライバ(inf ファイルと、sys ファイル)が必要であり、
PCでプログラミングするなら、DLL が必要になる。

 その他のデバイスクラスとしては、CDC、HID、Mass Storage がある。
HIDクラスはさらに、「マウス」「KB」「汎用」に分かれる。

デバイスドライバなどの要否は、
       inf      sys     DLL
 汎用    要     要     要 : 上記の通り。
 CDC   要     不要 : システム標準でOK。(serial on usb)
 HID
  マウス  不要 : システムが入力デバイスで使用。(直接入力不可?)
  KB    不要 : システムが入力デバイスで使用。(直接入力不可?)
  汎用   不要   不要   不要*
   (訂正:* kernel32、hid.dll を使うので、宣言(ヘッダーファイル)は必要。)

 それで、このサンプルUSBデバイスを ActiveBASIC プログラムでアクセスしてみたい。
 同梱されていた、柏野政弘さん作のドライバでは、どうしても上手くいかない。
1回目はOKで、2回目はライト(PC->PIC)出来るが読み込みでストールする。

 悪戦苦闘の末、MICROCHIP社のmchpusb.sysなるデバイスドライバにすることにした。やっと、PCソフトも完成し、
PCからPIC(USB・汎用デバイス)への出力・入力が完成した。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking

PIC(5) 18F2550

2008-06-28 :  PIC・マイコン
                                             日記@BlogRanking
 これまでで、PIC16F は5種類入門できた(カナ)。
16F84A、12F683、16F648A、16F873A、16F88。

 再度、tiny bootloader の補足をしておく。

1.16F873A:tinybld16F873A.asm があったので、このままASMした。
 実はバグがあって、ターゲットプログラムが書き込まれないので悩んだ。
  bcf EECON1,EEPGD
 となっている行は間違いで、正しくは
  bsf EECON1,EEPGD
 である。 tinybld16F873.asm では正しい。

2.16F88:tinybld16F88_i8MHz __19200.HEX があるので、このまま使っている。


で、今度は 18F2550 に移ることにした。

 先ずは、tiny bootloader ファームウェアの準備であるが、
幸い、tinybld18F2550usb _20MHz_115200.HEX があったので、
このまま使うことにして、AKI-PICライタで書き込んだ。

 mikroBASIC のプログラムは、16F873A で作った、
PS/2・KB入力--232CでのPC出力 を移植した。
といっても修正することはほとんど無い。
chip 指定と config 指定。これは、IDEで。
ソースでは、全ピンデジタルとするため、ADCON1 指定と、
232Cでのボーレートを変えたので、Usart_Init のパラメータ変更。
以上でコンパイル&ゴー。 ---> 見事に文字化け。

相当悩んだ末、config ワードの問題と判明。
tiny bootloader のサンプルでは、
 PLLDIV_5_1L
 CPUDIV_OSC3_PLL4_1L
 USBDIV_2_1L
 FOSC_HSPLL_HS_1H
となっていた。これは、20MHzセラロックを用いたとき、
動作クロックは24MHzということである。
 --> mikroBASIC ソースを修正して。完動。

ここまでくれば、手持ち6chipとも使えるナ。

この後、16F873A で、
 マブチモータを、モータードライバ TA7291P 経由で正転・逆転制御。
制御入力はPS/2・KB -> OK。

PS/2・マウス入力--232CでPCへ出力 -> OK。

そうこうしているうちに、1月が過ぎ去った。

お手数をおかけします。2クリック(投票を)お願いします ⇒ 日記@BlogRanking
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク