タコPICプロジェクト


たった8本足のPIC12F683これ何ができるかな。
8本足だからタコPIC(笑)

PIC12F683

とりあえず基板にのせて<表と裏>

基板表.jpg
基板裏.jpg

んで、点灯したらこんな感じ。
えーと点滅しているんだけど写真じゃ判らんよね
<実は1個点灯していません、これは出力ポートが5本しかない事を忘れてLEDを6本付けたため(爆)>
基板点灯.jpg

10年前にはアセンブラ使ったので今回もってやってみたけどPICのアセンブラはすっかり忘れてしまい苦戦・・結局Cのお世話になってます。

そしてソースです。置き方判らんのでそのまま貼っておきます。
メインではWDTのクリヤしてるだけ、割り込み部分でポート弄ってます。
使用条件はGNUに従います。
<pic.h> の部分の<>は全角なので半角修正する必要があります。



#include <pic.h>

__CONFIG( INTIO & BORDIS & WDTEN & PWRTEN & UNPROTECT & MCLRDIS );

/*
* Example code for using timer0 on a 12F629
* Just sets up a 1 second interrupt and increments a variable
*/

/*
* Calculate preload value for one second timer
*/

#define PERIOD 1000000 // period in uS - one second here
#define XTAL 4000000 // crystal frequency - 4MHz

#define IPERIOD (4 * 1000000 / XTAL) // Period of instruction clock in uSeconds

//#define SCALE 256 // Timer 0 prescaler
#define SCALE 16 // Timer 0 prescaler
#define T0_TICKS 250 // Number of counts for interrupt

#define TICK_PERIOD (SCALE * IPERIOD) // Period (uSec) of one increment of timer 0

#define RELOADS ((PERIOD/T0_TICKS)/TICK_PERIOD)

unsigned long seconds; // second count
near char reload = 0;

/* service routine for timer 0 interrupt */
void interrupt
timer0_isr(void)
{
TMR0 = -T0_TICKS;
if(reload == 0){
// effect a change on PORTB whenever our desired period is reached.
// Note this timing will contain a margin of error.
reload = RELOADS + 0;
seconds++;
if(0 == (1 & seconds)){
GPIO=0; // effect a change on PORTB
}else{
GPIO=0xff;
}
}
reload--;
T0IF = 0;
}

main()
{
// initialize timer 0;

// OPTION = 0b0111; // prescale by 256
// OPTION = 0b0101; // prescale by 64
OPTION = 0b0011; // prescale by 16
T0CS = 0; // select internal clock
T0IE = 1; // enable timer interrupt
GIE = 1; // enable global interrupts
TRISIO = 0; // output changes on LED

for(;;){
#asm
clrwdt
#endasm
// continue; // let interrupt do its job
}
}

© Rakuten Group, Inc.
Design a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: