GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
すみません。先ほどの質問のスレッドは間違って消してしまったようです。
Fujitaさんの1/2秒割り込みのサンプルでLEDの点滅はできました。
しかし、I2C液晶(AQM0802)の表示更新はできませんでした。
I2Cは無理ですかね?
鈴木さんの「GR-KURUMIでI2C LCDを使う」という記事の
サンプルプログラムをベースに改良しているのですが、
PM_STOP_MODEとの両立方法を模索しています。
よろしくお願いします。
以下のプログラムを試しているのですが、タイマー割り込みルーチン内での液晶の表示はうまくいきません。
不明点があるので教えてください。
(1)スケッチリファレンスで
PM_STOP_MODE(delay()関数実行時にSTOPモードに移行)
なっていますが、リモコンのサンプルで示されているdelay(0xFFFFFFFF);の
0xFFFFFFFFは特別な意味がありますか?
任意の値が指定された場合でもSTOPモードに移行しますか?
(2)STOPモード時にタイマーや外部端子割り込みがかかった場合に、
loop文の中のdelay(0xFFFFFFFF);の次の行に移行しますか?
移行するとして割り込みルーチンの後で実行さるのでしょうか?
#include <Arduino.h>#include <RLduino78_RTC.h>#include <Wire.h>
#define SDAPIN 8#define SCLPIN 7//#define RESET_N 5 // for AQM0802#define LCD_ADRESS 0x3E // for AQM0802
#define LED_R 22#define LED_G 23#define LED_B 24#define LED_ON 0#define LED_OFF 1
char lcd_str[9];int err;uint8_t gContrast = 35; //15; 0-63
RTC_TIMETYPE currentTime;
void set_rgb(int rgb) { if ((rgb&1) !=0) digitalWrite(LED_B, LED_ON); else digitalWrite(LED_B, LED_OFF); if ((rgb&2) !=0) digitalWrite(LED_G, LED_ON); else digitalWrite(LED_G, LED_OFF); if ((rgb&4) !=0) digitalWrite(LED_R, LED_ON); else digitalWrite(LED_R, LED_OFF);}
void lcd_cmd( uint8_t cmd ) { Wire.beginTransmission( LCD_ADRESS ); Wire.write( 0b00000000 ); // CO = 0, RS = 0 Wire.write( cmd ); Wire.endTransmission();}
void lcd_contdata( uint8_t data ) { Wire.write( 0b11000000 ); // CO = 1, RS = 1 Wire.write( data );}
void lcd_lastdata( uint8_t data ) { Wire.write( 0b01000000 ); // CO = 0, RS = 1 Wire.write( data );}
void lcd_printStr( const char *str ) { Wire.beginTransmission( LCD_ADRESS ); while ( *str ) { if ( *(str + 1) ) { lcd_contdata( *str ); } else { lcd_lastdata( *str ); } str++; } Wire.endTransmission();}
void lcd_setCursor( uint8_t locx, uint8_t locy ) { lcd_cmd( 0x80 | (locy * 0x40 + locx) );}
void lcd_setContrast( uint8_t con ) { lcd_cmd( 0x39 ); lcd_cmd( 0b01110000 | (con & 0x0f)); // contrast Low lcd_cmd( 0b01011100 | ((con >> 4) & 0x03) ); // contast High/icon/power lcd_cmd( 0x38 );}
void disp_current_time() { sprintf(lcd_str,"%2d:%02d:%02d", currentTime.hour, currentTime.min, currentTime.second); lcd_printStr( lcd_str );}
void rtcConstantPeriodInterruptHandler(){//(unsigned long u32ms) { noInterrupts(); rtc_get_time(¤tTime); interrupts(); set_rgb(4>>(currentTime.second%3)); //lcd_setCursor( 0, 1); //disp_current_time();}
void setup(){ Wire.begin(); //Serial.begin(9600); //Serial.println("START"); // pinMode(LCD_RESET_N, OUTPUT);// digitalWrite(LCD_RESET_N,0);// delay(250);// digitalWrite(LCD_RESET_N,1);// delay(250); // LCD INIT lcd_cmd( 0b00111000 ); // function set lcd_cmd( 0b00111001 ); // function set lcd_cmd( 0b00000100 ); // EntryModeSet lcd_cmd( 0b00010100 ); // interval osc lcd_cmd( 0b01110000 | (gContrast & 0xF) ); // gContrast Low lcd_cmd( 0b01011100 | ((gContrast >> 4) & 0x3) ); // contast High/icon/power lcd_cmd( 0b01101100 ); // follower control delay( 200 ); lcd_cmd( 0b00111000 ); // function set lcd_cmd( 0b00001100 ); // Display On lcd_cmd( 0b00000001 ); // Clear Display delay( 2 ); lcd_setCursor( 0, 0 ); lcd_printStr( "GR-WATCH" ); delay(1000);
pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); set_rgb(0); err = rtc_init(); currentTime = {17, 8, 8, RTC_WEEK_TUESDAY, 01, 15, 0}; err = rtc_set_time(¤tTime);
rtc_attach_constant_period_interrupt_handler(rtcConstantPeriodInterruptHandler); rtc_set_constant_period_interrupt_time(RTC_CONSTANT_PERIOD_TIME_1SECOND); rtc_constant_period_interrupt_on(); setPowerManagementMode(PM_STOP_MODE);}
void loop() { delay(0xFFFFFFFF); lcd_setCursor( 0, 1); disp_current_time();}