人気ブログランキング | 話題のタグを見る

ATmega88PのPCINTが動作した

この間から,BASCOM-AVR 11.9.5(製品版)で組んだATmega88P用のテストプログラムが動かず,しばらく唸っていたのだが,BASCOM-AVRを使った作品と,BASCOM-AVRの日本語リファレンスを公開されているO-Familyさんのところの掲示板で質問してみたところ,ATmega88P用のregfileにバグが残っていたことが原因と判明.O-Familyさん,ありがとうございます!
BASCOM添付のサンプルプログラムが,無印のATmega88のregfileを使うとシミュレータで動作するのだが,88P用を使うと全く駄目という状況で,もしかするとBASCOM側に原因があるのでは?と思ってはいたのだが原因と対処法がわかって一安心….

BASCOMでPCINTを使ったプログラムが動作することがわかったので,試しに簡単なプログラムを作ってみた.スイッチを押すとLCDに表示された数字が増減すると言う他愛のないもので,別にPCINTを使う必要もないものだが,そこはテストと言うことで….実際に動作させると,スイッチのチャタリング対策を行っていないせいで勝手に数字が増減することがっ(笑).プログラムは以下の通り.ハードウェアはプログラムを見ればわかってもらえると…^^;.

$regfile = "m88pdef_rev.dat"
$crystal = 8000000

' *******************************************************
' LCD module initialize
' *******************************************************
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cls
Cursor Off

' *******************************************************
' Definition of variable and subroutines
' *******************************************************
Dim Count_number As Integer
Dim Count_character As String * 4

Declare Sub Lcd_print

' *******************************************************
' Configulation of port direction
' *******************************************************
Config Pinb.0 = Input
Config Pinb.1 = Input
Portb = &B00000011

' *******************************************************
' Configulation of interrupt
' *******************************************************
Enable Interrupts
Enable Pcint0
On Pcint0 Isr_pcint0
Pcmsk0 = &B00000011
Pcicr = &B00000001

' *******************************************************
' Main routine
' *******************************************************
Count_number = 0 ' reset number of count
Call Lcd_print

Do

Loop

' *******************************************************
' Subroutines
' Character printing into LCD module
' *******************************************************
Sub Lcd_print
Count_character = Str(count_number)
Count_character = Format(count_character , "0000")
Locate 2 , 6
Lcd Count_character
End Sub

' *******************************************************
' Interrupts
' Increment or decriment number of count when switches are
' pressed
' *******************************************************
Isr_pcint0:

Disable Interrupts
Waitms 10
If Pinb.0 = 0 Then
If Count_number <> 0 Then Count_number = Count_number - 1
End If
If Pinb.1 = 0 Then
If Count_number < 9999 Then
Count_number = Count_number + 1
Else
Count_number = 0
End If
End If

Call Lcd_print

Pinb.0 = 1
Pinb.1 = 1

Enable Interrupts
Return

ATmega88PのPCINTが動作した_b0027830_23473852.jpg

by buchi1201 | 2009-07-27 23:47 | 自転車&工作