PIC

2010/02/20
Counter: 7607, today: 2, yesterday: 1

PIC12F629.png

環境

  • Mikro C Lite Version

RS232Cプラグ・ピン番号

5pin-4pin-3pin-2pin-1pin
rs232c.jpg
9pin-8pin-7pin-6pin

PICで電子オルゴール

2010/02/20
  • リンク先のmelodybのソースをMikro C用に変更してみた(INTCOM.をいくつか追加).
  • リンク先のMPLAB用のソースはMPLAB IDE v8.43(HI-TECH C)でそのまま動いた.
    PIC12F629オルゴール.jpg

RS232Cテストデータ送信ユニット

2010/02/11
  • リンク先の回路とプログラムでそのまま動いた.
  • TX(GPIO.5)にトランジスタ入れてRS232C(メス)の2pinへ接続する.
  • GNDをRS232C(メス)の5pinへ接続する.
  • RS232Cの4-6pin, 8-7pinをそれぞれ結線する.

PIC12F629.jpg rs232c_tx.jpg

RTC時計ユニット

2010/02/15
  • 上のデータ送信ユニットのソースを修正して, RTC(リアルタイムクロックモジュール)の時刻をI2Cで読んでRS232Cで出力するようにした.
  • 何故かI2Cは, GP2, GP3での接続は駄目で, GP4, GP5では動いた???
    Soft_Uart_Init(GPIO, 3, 2, 9600, 0);
    Soft_I2C_Config(&GPIO, 4, 5);
  • GP2のシリアル出力を2SC1815で変換してRS232Cに出力する.
  • GP3のSW(1秒間押す)が送信開始・停止のトグル (10kΩでプルアップ)
  • GP0のLEDは送信中は点灯. (330ΩでGNDに接続)
#define		SW			GPIO.F3
#define		LED			GPIO.F0
#define		CR			0x0D
#define		LF			0x0A
#define		ON			0
#define		OFF			1
#define   ACK     1
#define   NO_ACK  0
void	timeSend(unsigned short buf[])
{
  Soft_I2C_Start();
  Soft_I2C_Write(0xA2);
  Soft_I2C_Write(0x02);
  Soft_I2C_Start();
  Soft_I2C_Write(0xA3);
  buf[0]=Soft_I2C_Read(ACK);
  buf[1]=Soft_I2C_Read(ACK);
  buf[2]=Soft_I2C_Read(NO_ACK);
  Soft_I2C_Stop();
  Delay_ms(10);
  Soft_Uart_Write('0'+((buf[2]>>4)& 0x03));
  Soft_Uart_Write('0'+(buf[2] & 0x0F));
  Soft_Uart_Write(':');
  Soft_Uart_Write('0'+((buf[1]>>4)& 0x07));
  Soft_Uart_Write('0'+(buf[1] & 0x0F));
  Soft_Uart_Write(':');
  Soft_Uart_Write('0'+((buf[0]>>4)& 0x07));
  Soft_Uart_Write('0'+(buf[0] & 0x0F));
}
void main()
{
	char	cnt;
  static unsigned char buf[6];
	TRISIO = 0b00001110;
	Soft_Uart_Init(GPIO, 3, 2, 9600, 0);
	Soft_I2C_Config(&GPIO, 4, 5);
	for (cnt = 0; cnt < 5; cnt++) {
		LED = ON;
		Delay_ms(100);
		LED = OFF;
		Delay_ms(100);
	}
	while (1) {
		while (Button(&GPIO, 3, 1, 0) == 0)
			;
		while (Button(&GPIO, 3, 1, 1) == 0)
			;
		LED = ON;
		while (1) {
			timeSend(buf);
			Soft_Uart_Write(CR);
			Soft_Uart_Write(LF);
			Delay_ms(1000);
			if (SW == ON) {
				while (Button(&GPIO, 3, 1, 0) == 0)
					;
				while (Button(&GPIO, 3, 1, 1) == 0)
					;
				break;
			}
		}
		LED = OFF;
	}
}

タイマー割込みによるLEDの点滅

2010/02/03
  • MPLAB IDE v8.43(HI-TECH ANSI C Compiler)でタイマー0割込みを使ってみた.
  • CONFIGで注意は, WDTDISかな?
  • Prescaler(PS)は, 010 (1:8)を使ってカウント数を調整して, 約1秒ごとに点滅する(PSを1:2にすれば精度を上げれる???).
    // pic12f629 (2010.02.03 ym)
    //
    #include <pic.h>
    __CONFIG (
        UNPROTECT & BORDIS & MCLRDIS & WDTDIS & PWRTDIS & INTIO
    );
    static long	count;
    static int flag;
    void main(void)
    {
      T0CS  = 0;		// Timer1 increments on instruction clock
      TRIS0 = 0;		// Port GPIO all bits are output 
      T0IE  = 1;		// Enable interrupt on TMR0 overflow
      GIE   = 1;		// Global interrupt enable
      PS2   = 0; PS1   = 1; PS0   = 0;  // Prescaler Rate 1:8
      PSA   = 0;      // Prescaler is assigned to the TIMER0 module
      count = 0; flag  = 0; GPIO  = 0; 
      for(;;)
        CLRWDT();	// Idly kick the dog
    }
    static void interrupt isr(void)
    { 
      count++;
      T0IF = 0;
      if (count == 488) { // 1/4000000(Hz) * 4cycle * 8scale * 256tmr0 = 0.999424sec
           count = 0;
           if (flag == 0) { flag=1; GPIO=1; }
           else { flag=0; GPIO=0; } 
    	}
    }
  • MPLAB IDE v8.43(Assemblerでの実現)
    2010/02/11
    ; 3個のLEDで2進数の0(000)から7(111)まで表示する.
    ; 2007/11/01 (ym) 2010/02/11 (ym reviced)
    	list	p=pic12f629
    	#include	<p12f629.inc> 
    	errorlevel	-302
    	__CONFIG	_CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
    ;
    	CBLOCK	H'20'
    	WKSC
    	WKDC
    	WTMP
    	STMP
    	TIMER
    	CNT1
    	CNT2
    	CNT3
    	ENDC
    ;
    	ORG	H'0'
    	GOTO	L1
    	ORG H'4'
    	GOTO	INTR
    ; 	RETFIE
    ;
    L1
    	clrf	INTCON
    	BANKSEL	GPIO
    	MOVLW	B'00000000'
    	MOVWF	GPIO
    	BANKSEL	CMCON
    	MOVLW	B'0000111'
    	MOVWF	CMCON
    	BANKSEL	TRISIO
    	MOVLW	B'00001000'
    	MOVWF	TRISIO
    ;
    	CALL	INITTMR0
    ; 
    	BANKSEL	GPIO
    L2
    	MOVLW	D'1'
    	MOVWF	WKSC
    	MOVLW	D'8'
    	MOVWF	WKDC
    L3
    	MOVF	WKSC,W
    	ANDLW	B'00000111'
    	BANKSEL	GPIO
    	MOVWF	GPIO
    	CALL	WAIT1
    	INCF	WKSC,F
    	DECFSZ	WKDC,F
    	GOTO	L3
    	GOTO	L2
    ;
    WAIT1
    	MOVLW	D'15'		; 1/400000(Hz) * 4cycle * 256scale * 256tmr0 * 15count(TIMER) = 0.983040sec
    	MOVWF	TIMER
    WAITLOOP
    	MOVF	TIMER,W
    	BNZ		WAITLOOP
    	RETURN
    ;
    INTR
    	MOVWF	WTMP
    	SWAPF	STATUS,W
    	MOVWF	STMP
    	BTFSC	INTCON,T0IF
    	GOTO	INTRTMR0
    	RETFIE
    ;
    INTRTMR0
    	MOVF	TIMER,W
    	BTFSS	STATUS,Z
    	DECF	TIMER,F
    	BCF	INTCON,T0IF
    ;
    	SWAPF	STMP,W
    	MOVWF	STATUS
    	SWAPF	WTMP,F
    	SWAPF	WTMP,W
    	RETFIE
    ;
    INITTMR0
    	BANKSEL	TMR0
    	MOVLW	H'0'
    	MOVWF	TMR0
    	BSF	INTCON,T0IE
    	BSF	INTCON,GIE
    ; GPIO pull-ups are disabled, TMR0 Clock Source = Internal
    ; Prescaler Assinged to the TIMER0 module TMR0 Rate = 1:256
    	MOVLW	B'10000111'
    	BANKSEL	OPTION_REG
    	MOVWF	OPTION_REG
    	RETURN

添付ファイル: filePIC12F629オルゴール.jpg 1806件 [詳細] filePIC12F629.png 736件 [詳細] filers232c_tx.jpg 651件 [詳細] filers232c.jpg 611件 [詳細] filePIC12F629.jpg 753件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-04 (木) 03:41:35 (2760d)