#include <MsTimer2.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#define INVAL_20 2 // メインルーチン 20ms =割込10ms x INVAL_20
#define INVAL_100 10 // メインルーチン 100ms =割込10ms x INVAL_100
#define ENCODER_CLK 2
#define ENCODER_DT 3
#define DEVICE_ADDRESS 0x50 // 101 0000b, I2C 7bit address of 24LC256
// PORT define
const uint8_t LCD_BL = 23; // D23 pin, Out LCD Backlight
LiquidCrystal lcd(12, 11, 26, 27, 28, 29);
/*==============================================================================
Variables.
================================================================================*/
int16_t TCOUNT0,TCOUNT1,TCOUNT1s; // Interval counter
uint8_t test = 0;
volatile int count; // エンコーダー変化量
uint8_t IDnum[1]; // EEPROM読込みデータ格納用 1byte (登録番号)
uint8_t DEV_NAME[9]; // EEPROM読込みデータ格納用 9byte (機種名)
uint8_t XYdata1_8[16]; // EEPROM読込みデータ格納用 16byte (XY1~8data)
uint8_t XYdata9_16[16]; // EEPROM読込みデータ格納用 16byte (XY9~16data)
uint8_t XYdata17_24[16]; // EEPROM読込みデータ格納用 16byte (XY17~24data)
uint8_t XYdata25_32[16]; // EEPROM読込みデータ格納用 16byte (XY25~32data)
uint8_t XYdata33_40[16]; // EEPROM読込みデータ格納用 16byte (XY33~40data)
uint8_t XYdata41_48[16]; // EEPROM読込みデータ格納用 16byte (XY41~48data)
uint8_t XYdata49_56[16]; // EEPROM読込みデータ格納用 16byte (XY49~56data)
uint8_t XYdata57_64[16]; // EEPROM読込みデータ格納用 16byte (XY57~64data)
/*==============================================================================
Interruput Program routine
================================================================================*/
void timer2_ms() // 10ms interrupt
{
if(TCOUNT0 != 0)
TCOUNT0--; // 20msタイマーカウント
if(TCOUNT1 != 0)
TCOUNT1--; // 100msタイマーカウント
if(TCOUNT1s != 0)
TCOUNT1s--; // 1sタイマーカウント
}
void IRQ_ENC(void)
{
uint8_t dtValue;
dtValue = digitalRead(ENCODER_DT);
if (dtValue == HIGH) {
count++; // Clockwise
}
if (dtValue == LOW) {
count--; // Counterclockwise
}
Serial.println(count);
}
void i2cEEPROM_write(int i2cADR, unsigned int eeADR, byte data )
{
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROMアドレス上位8bit指定 MSB
Wire.write((int)(eeADR & 0xFF)); // EEPROMアドレス下位8bit指定 LSB
Wire.write(data);
Wire.endTransmission();
delay(5); // 書き込み完了待ち
}
uint8_t i2cEEPROM_read( int i2cADR, unsigned int eeADR )
{
uint8_t data;
Wire.beginTransmission(i2cADR); // i2cアドレス指定
Wire.write((int)(eeADR >> 8)); // EEPROMアドレス上位8bit指定 MSB
Wire.write((int)(eeADR & 0xFF)); // EEPROMアドレス下位8bit指定 LSB
Wire.endTransmission();
Wire.requestFrom(i2cADR, 1); // 1バイトデータリクエスト
while (Wire.available()) { //
data = Wire.read(); // データ受信
}
return data;
}
// The setup function runs once when you press reset or power the board
void setup() {
TCOUNT0 = INVAL_20; // 20ms Interval
TCOUNT1 = INVAL_100; // 100ms Interval
TCCR3B = 0x18; // 0001 1000, Disable Timer
TCCR3A = 0x82; // 1000 0010, D5 PWM out, D2 normal I/O
ICR3 = 16000-1;
OCR3A = (int) (ICR3 * 0.5);
OCR3B = (int) (ICR3 * 0.25);
TCNT3=0x0;
// initialize the serial port:
Serial.begin(9600);
Wire.begin();
pinMode(5, OUTPUT); // OC3a
pinMode(ENCODER_CLK, INPUT_PULLUP);
pinMode(ENCODER_DT, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(ENCODER_CLK), IRQ_ENC, FALLING);
// Initialize digital pin LED_BUILTIN (13) as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(LCD_BL, OUTPUT);
digitalWrite(LCD_BL, HIGH); // LCD Backlight ON
lcd.begin(20, 4);
lcd.setCursor(3, 0);
lcd.print("Counter");
// lcd.setCursor(2, 2);
// lcd.print("4 lines, 20 cols");
MsTimer2::set(10, timer2_ms); // 10ms period
MsTimer2::start();
TCCR3B |= 1; // Prescale=1, Enable Timer
}
// The loop function runs over and over again forever
void loop() {
char c;
if( Serial.available() ){ // 何か受信しているかチェック
c = Serial.read(); // 1文字取り出す
if(c != '\n' && c != '\r'){ // エスケープシーケンス以外ならPCへ送り返す
Serial.print(c); // PC側へ1文字送信
}
if((c == '\r') || c == '\n'){
Serial.println(); // 改行コードを送信
}
}
/*==============================================
20ms interval task
==============================================*/
if(!TCOUNT0){
TCOUNT0 = INVAL_20; // 20ms カウンタ設定
lcd.setCursor(7, 2);
lcd.print(count);
lcd.print(" ");
}
/*==============================================
100ms interval task
==============================================*/
if(!TCOUNT1){
TCOUNT1 = INVAL_100; // 100ms カウンタ設定
test=!test;
if(test)
digitalWrite(LED_BUILTIN, LOW);
else
digitalWrite(LED_BUILTIN, HIGH);
}
/*
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
*/
}