PIC16F628Aで割り込み処理

今日はもう1月の5日です。明後日には会社に行かなければなりません。

しかしこの休日はEZ-USBが訳わからず、大分時間を無駄にしました。

「もうこんなプラットフォームは嫌だ!」という訳でPIC-USBに乗り換えることにしました。

初期のPICを弄っていたのはもう8年位前なのでPICのプログラムの勘を戻す(?)ために最新のMPLAB X Ver.5.1 をPCにインストールすることにしました。

これがもう凄く重いソフトで”きかこ”のCORE 2DUOのPCではもう限界かもしれません。

まあとりあえずインストールできましたので手元にあったPIC16F628AでLEDでも点滅させてみようとWEBでぐぐって人様の書いたプログラムを参考にLEDの点滅プログラムを書きました。

コンパイルも上手くいきましてLEDも無事に点滅できました。

と、ここまではすんなりできたのですがこの次にタイマー割り込みでLED点滅をさせようとしたのですがこれが上手くいかずコンパイルが通りません。

散々試行錯誤して悩んだ末に分かったのが割り込み処理部分の記述が悪いということです。

ネットで色々調べて分かりましたよ、原因が。以下にサンプルプログラムをペーストしますので興味のある方は参考にしてくださいね。

/*
* File: main.c
* Author: Jun
*
* Created on 2019/01/05, 17:13
*/

#include <stdio.h>
#include <stdlib.h>

#include <xc.h>

//16F628Aのコンフィグレーション
//プログラムでは変更できない各種設定で、PICへの書き込み時に読み込まれる

//内部クロック4MHz使用設定
#pragma config FOSC = INTOSCIO

#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF

//水晶発振などの取り付けた場合の周波数設定
#define _XTAL_FREQ 32768

//割り込み発生時に随時呼び出されて実行される関数
void __interrupt() isr(void)
{
T0IF = 0; // 次の割り込みの為にTMR0オーバーフローフラグのクリア

TMR0 = 0x00;

PORTB = PORTB ^ 0x01; // RB0をビット反転
PORTB = PORTB ^ 0x02;

}

//これ以降がプログラム本体
void main(void) {

TRISA = 0x00; //PORTA全てのピン(RA0-RA7)は「0」。つまり出力設定。
TRISB = 0x00; //PORTB全てのピン(RB0-RB7)は「0」。つまり出力設定。
PORTA = 0x00; //PORTA全てのピンを「0」に設定
PORTB = 0x00; //PORTB全てのピンを「0」に設定

//プリスケーラは256倍。カウンターは最大の256。256×256=65536カウント。
//TMR0が65536カウントする毎に割り込みが発生。

OPTION_REG = 0b10000111; //TMR0割り込みカウントの倍率設定(プリスケーラ)
TMR0 = 0x00; //TMR0は0からスタート。最大の256カウント
INTCON = 0b10100000; //GIE:1 ,T0IE:1 タイマ0割り込み許可設定

PORTB = 0x01;

while(1)
{}
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です