/* ----------------------------------- data ---------------------------------- */ uint8_t N, DATA[101], I, O, temp, s ; uint8_t n; //-------------------------------------
//----- data set ----- data_set100() { for(N=1; N<101; N++) { DATA[N] = N;// write
/* ----------------------------------- data ---------------------------------- */ uint16_t DATA[101], temp; uint8_t N, I, LA, HA, n, o, s; //-------------------------------------
//----- data set ----- data_set100() { // ----- data write ----- for(N=1; N<101; N++) { DATA[N] = N;// write
最後にゴミが表示される。何がいけないのだろうか??tab記号か?
/* -----------------------------------
data
---------------------------------- */
uint8_t N, DATA[101], I, O, temp, s ;
uint8_t n;
//-------------------------------------
//----- data set -----
data_set100()
{
for(N=1; N<101; N++)
{
DATA[N] = N;// write
PORTB = DATA[N];// disp(DATA[N])
_delay_ms(100);
}
_delay_ms(2000);
for(n=1; n<6; n++)
{
PORTB = 0xFF;
_delay_ms(100);
PORTB = 0;
_delay_ms(100);
}
PORTB = 0x55;
_delay_ms(1000);
}
//----- data disp -----
data_disp100()
{
for(N=1; N<101; N++)
{
PORTB = DATA[N];// disp(read)
_delay_ms(100);
}
_delay_ms(2000);// check reach
for(n=1; n<6; n++)
{
PORTB = 0xFF;
_delay_ms(100);
PORTB = 0;
_delay_ms(100);
}
PORTB = 0xAA;
}
//-------------------------
//***********************************
int main()
{
DDRB = 0xFF;
PORTB = 0;
//----- data set -----
data_set100();
data_disp100();
while(1)
{
;
}
}
//end
N[100]と定義した場合は、N[0]~N[99]
N[101]と定義した場合は、N[0]~N[100]
という変数が確保されます。
したがって、N[100]と定義したときはN[100]という変数は使用できません。
確保していないメモリ領域を表示させることになるので、意図しない値(ゴミ)が表示されます。
SORTで比較のIntervalを計算する時、この関数を使う。
一見すると[N/2]+1と同じ様に見えるが、数値3~15を
入れて見ると、違いが分かる。
--------------------------
N I=2*[N/4]+1 I=[N/2]+1
2 1 2
3 1 2
4 3 3
5 3 3
6 3 4
7 3 4
8 5 5
9 5 5
10 5 6
11 5 6
12 7 7
13 7 7
14 7 8
15 7 8
差が有る事がわかる。
0.25Pichの極細い横罫線を書いておく、中心に縦の細線
そして、それを中心として左右に2cmの縦線2本、この様紙ならば、定規だけでFLOWが書けた。
処理ブロックは、縦3行、横4cmの四角い箱型のみ。
判断分岐は、横から次処理への分岐線を書いて、
(私が考えた書き易く、分かり易いFLOWCHART)
形にこだわらなければ、書きや易く成るのでは、
昨日1時間くらいかけてFLOWを書いたが、消しゴム跡で
見え易さがダメなので、新しいFLOW用紙で書き直す。
机上デバッグしたら、コ-デイングしてみよう。
3Xで動かすぞ、?
Flowの段階で入念にチェックした。
分岐制御の判定の記述子と範囲確認
分岐先の位置、Flagの名前の確認
分岐記述が正しいか、
PORTB = Nで部分確認をした。
Binary Sort Programでは、Shifting処理
(アドレスをさかのぼって比較する。ポイントの確認。)が処理を複雑にしている。
Flowの清書とデバッグに時間を掛けたので
上手く動作すると思う。
ATTINY10は、確か6Pで有る事を思い出した。
折れた部分をやすりで綺麗にした。基板の余りスペ-スにはんだ付けして、ATTINY10の配線をした。
1PInのPB0, TPIDATAに10k+LED負荷を接続した。
10Kでも書き込みが出来なかった。
PB1/TPICLKに移動した。PB1では、書き込み出来た。
ATTINY10のPrograming信号は、TPIDATA、TPICLKに
変更されている。
TPIDATA Pin#1 PB0にLED負荷を接続していると、
Writeする事が出来ない。”1”レベルが低く抑えられてしまう。
(Programを書き込んだ後、負荷を接続する。)
TPICLK Pin#3 PB1ならばOKの様。出力回路の違いか?TPIDATAは、入力Pin共用だからか?
sort.c (Binary Sort)
AVR: ATMEGA168P
CLOCK: 8 Mhz
OSC: Internal RC OSC
data: uint16_t
Author: kawana
Create: 2014/12/13
------------------------------------
I = 2[N/4] + 1
N: DATA COUNT
I: INTERVAL
---------------------------------- */
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//-----------------------------------
/* -----------------------------------
data
---------------------------------- */
uint16_t DATA[101], temp;
uint8_t N, I, LA, HA, n, o, s;
//-------------------------------------
//----- data set -----
data_set100()
{
// ----- data write -----
for(N=1; N<101; N++)
{
DATA[N] = N;// write
PORTB = DATA[N];// disp(DATA[N])
_delay_ms(50);
}
_delay_ms(2000);
//----- end message1 -----
for(n=1; n<6; n++)
{
PORTB = 0xFF;
_delay_ms(500);
PORTB = 0;
_delay_ms(500);
}
PORTB = 0x55;
_delay_ms(1000);
}
//----- data disp -----
data_disp100()
{
for(N=1; N<101; N++)
{
PORTB = DATA[N];// disp(read)
_delay_ms(50);
}
_delay_ms(2000);// check reach
for(n=1; n<6; n++)
{
PORTB = 0xFF;
_delay_ms(500);
PORTB = 0;
_delay_ms(500);
}
PORTB = 0xAA;
}
//-------------------------
uint8_t I;
//-------------------------
//***********************************
int main()
{
DDRB = 0xFF;
PORTB = 0;
//----- data set -----
data_set100();// set 100 data
data_disp100();// read 100 data
I = 1;
//----- sort start -----
F_1_:
//donothing
if(N==1) goto F_12_;
F_2_:
I = N;
F_3_:
//Interval Calc
I = (I/4)*2+1;
PORTB = I;
_delay_ms(1000);
F_4_:
// Address Calc
LA = 1;
HA = LA + 1;
//F_5_:
// Address Check
//if(HA<=N) goto F_3_;// ≠ over range
F_6_:
// DATA COMPAR
if(DATA[LA] >= DATA[HA]) goto F_8_;//NO memory change
F_7_:
//memory change
temp = DATA[LA];
DATA[LA] = DATA[HA];
DATA[HA] = temp;
F_8_:
// shifting chk
if((LA-I) > 0 ) goto F_13_;//shifting
F_9_:
// next Address
LA = LA + 1;
HA = LA + I;//I:Interval
F_10_:
// HA <= N check
if(HA <= N) goto F_6_;//next compar
F_11_:
// Interva check(I=1?)
if(I==1) goto F_12_;//owari NG*****
goto F_3_;
F_13_:
//shifting calc
LA = LA - I;
HA = LA + I;
goto F_6_;
F_12_:
goto F_12_;
}
//-----------------------------------------
勉強のため、印刷してみた。
xitoa.sのasmが有るし、難しそう。理解には、半年くらい
かかるかな?