AVR LCD Program をTM8S-DISCOVERY用に変更し動作確認したが、
PORT_Bの連続使用、PORT_BがADCにも割り振られていたので、
if( (ch & b0)==b0 ) {PADR |= _BV(3);} else {PADR &= ~_BV(3);}
でBit0--->Bit3に変更で対処した。
+-------+
0.9sec Loop-->1秒入力で、時計表示 23:59:59表示をル-プで処理していたのを
Timer処理に変更する。
Timerは、4本、
16-bit advanced control timer(TM1)
16-bit general purpose timers(TM2, TM3)
8-bit basic timer(TM4)
これを使用して0.9sec Loopの使用を止める。
PORT_Bの連続使用、PORT_BがADCにも割り振られていたので、
if( (ch & b0)==b0 ) {PADR |= _BV(3);} else {PADR &= ~_BV(3);}
でBit0--->Bit3に変更で対処した。
+-------+
0.9sec Loop-->1秒入力で、時計表示 23:59:59表示をル-プで処理していたのを
Timer処理に変更する。
Timerは、4本、
16-bit advanced control timer(TM1)
16-bit general purpose timers(TM2, TM3)
8-bit basic timer(TM4)
これを使用して0.9sec Loopの使用を止める。
PE 76
PA 654
PD 765を使用してPortBを空ける。
LEDbuf = 0x88;//0x44,0x22,0x11
while(1){
if( (LEDbuf & b7)==b7 ){PEDR |= _BV(7);}else{PEDR &=~_BV(7);}
if( (LEDbuf & b6)==b6 ){PEDR |= _BV(6);}else{PEDR &=~_BV(6);}
if( (LEDbuf & b5)==b5 ){PADR |= _BV(6);}else{PADR &=~_BV(6);}
if( (LEDbuf & b4)==b4 ){PADR |= _BV(5);}else{PADR &=~_BV(5);}
if( (LEDbuf & b3)==b3 ){PADR |= _BV(4);}else{PADR &=~_BV(4);}
if( (LEDbuf & b2)==b2 ){PDDR |= _BV(7);}else{PDDR &=~_BV(7);}
if( (LEDbuf & b1)==b1 ){PDDR |= _BV(6);}else{PDDR &=~_BV(6);}
if( (LEDbuf & b0)==b0 ){PDDR |= _BV(5);}else{PDDR &=~_BV(5);}
wait_ms(100); //100ms
たが、うまく動作してくれない。
ADCを動作させるためには
Q1.PB7-0は、IO Portでもある、
ADCとして使用の場合はPortBを入力とする必要
Q2.option byteを変更する必要は
bit7 6 5 4 | 3 2 1 0
//__________________|___________________
|PE7| PE6| PC7| PC6 |PA6| PA5| PA4| PA3|
//------------------|-------------------
途中で定義の取り違えでDebugに少し苦労
PA5をsetする時
PADR |= _BV(2);としてしまう。_BV(5);// ○
#define b5 0x20と定義して _BV(b5)と記述
してしまう。
初歩的ミス、間違え易い事に気が着くこのごろ
#define d7 0x80
if((LEDbuf & d7)==d7){PEDR |= _BV(b7);}else
{PEDR &= ~_BV(b7);}
STM8ディスカバリーは他のデバイス秋月に2種類
32ピンSDIP STM8S105K4B6 はシュリンク型でかえって実装しにくく、LQFP STM8S105K4T3C にすれば ET-PCB-TQFP32 ピッチ変換基板が使えます。
始めはともかく変更無しで「STM8S105C6」のままですと
ADCはオプションビットなどで、切り換えるようです。
調べて、電子ネコノコにUPしてみます。
一気に変更するのでは無く
1.DataBusを
PB3,2,1,0からPA6,5,4,3に変更
2.E,RSを
PB5,4からPE7,6
の様に、変更を分けて修正してゆく
こうするとDebugし易かった。
unsigned char LED=0;
unsigned char n;
//***** main *****
void main(void)
//****************
{
PBDDR = 0b11111111; //PortB Directin Output
PEDDR = 0b11000000;
PCDDR = 0b11000000;
PADDR = 0b01111000;
LED = 1;//char
n = 0;//char
//------------------------------
while(1)
{
LED = 1 << n;
LEDbuf = LED;//
LEDb_LED();//Write LED
for(N=0; N< 60000; N++){ };//N=uint
if (++n >7 ){n=0;}
}
}
*****
unsigned int N;
Nは、unsigned intでなくてはいけないのですね
LED 12個で時計表示をする事を考えた。
表示は、
1.正時の時は、12個の該当LEDを100msで
2回点滅後、連続点灯
2.分表示は、5分きざみで、該当LEDを1000ms
周期で点滅する。
(0~5分:LED_1、5~10分は、LED_2、10~15分は、LED_3を点滅、. . . . . . . . .
ユニバ-サル基板にLEDを30度感覚で綺麗に取り付ける事は、12,3,6,9時以外は、出来ないのでPinバイスで穴あけをした。
した。
Flowを書いてみた。
Basicの多分岐処理をCで書く事は出来ないのか?
if(jn){1,2,3,4,5,6,7,8,9,10,11,12};
jn=1:jump 1;
やっぱり、Timer割り込みの理解が必要だ。RaisonanceCのSampleProgramを動作させ
理解してゆくのが、手っ取り早い気がする。
動くはずのProgramが動かない、よく有ることですね。
PEDR &= ~_BV(6 ;//
)が無いと想像外のMessageが出る?
prototyoe error,etc