picからsg12864を制御しています。
picからsg12864を制御しています。
直線の描画を行った際、まっすぐな縦線が点線のようになってしまいます。
横線・斜線は問題なく描画できます。また、ビットマップをそのまま表示した場合も問題なく描画できます。
後閑さんのプログラムを使用しています。下記のlcd_Lineを使用しています。
for文を使用して、1秒間隔でlcd_Pixelで点を打って直線を描画て動作を確認したところ、一度は黒いドットが表示されますが、消えてしまう箇所がありました。消えてしまう箇所はいつも同じです。
どなたか、解決方法がわかる方はいらっしゃいませんでしょうか?
#define abs(a) (((a)>0) ? (a) : -(a))
void lcd_Line(int x0, int y0, int x1, int y1)
{
int steep, t;
int deltax, deltay, error;
int x, y;
int ystep;
/// 差分の大きいほうを求める
steep = (abs(y1 - y0) > abs(x1 - x0));
/// x、yの入れ替え
if(steep){
t = x0; x0 = y0; y0 = t;
t = x1; x1 = y1; y1 = t;
}
if(x0 > x1) {
t = x0; x0 = x1; x1 = t;
t = y0; y0 = y1; y1 = t;
}
deltax = x1 - x0; // 傾き計算
deltay = abs(y1 - y0);
error = 0;
y = y0;
/// 傾きでステップの正負を切り替え
if(y0 < y1) ystep = 1; else ystep = -1;
/// 直線を点で描画
for(x=x0; x<x1; x++) {
if(steep) lcd_Pixel(y,x,1); else lcd_Pixel(x,y,1);
error += deltay;
if((error << 1) >= deltax) {
y += ystep;
error -= deltax;
}
}
}
void lcd_Pixel(int Xpos, int Ypos, char On){
char cs, data, page, pos, count, i;
/* if colum >127 then do nothing */
if(Xpos<128){
if(Xpos>63){ // 64=<colum<=127?
Xpos = Xpos-64; // shift 64 dot
cs = 1;
}
else
cs = 2;
page = (char)(7-Ypos/8); // set page
lcd_Write(cs, 0xB8+page, 1);
lcd_Write(cs, 0x40+Xpos, 1); // set colum
data = lcd_Read(cs,0); // get current data
lcd_Write(cs, 0x40+Xpos, 1); // set colum ????
data = lcd_Read(cs,0); // get current data ????
pos =1; // set bit position
count = (char)(7-Ypos%8); // set bit
for(i=0; i<count; i++) // caluculate 2^n
pos *= 2;
lcd_Write(cs, 0x40+Xpos, 1); // back address
if(On==1) // set or reset bit
lcd_Write(cs, data | pos, 0); // set 1
else
lcd_Write(cs, data & ~pos, 0); // set 0
}
}
補足
ありがとうございます。 CAD図には微小線分がないのに プログラムに微小線分が出たので、 それをなくす パラメータを観察していました。 今回では ワイヤー線形が0.25で放電ギャップが0では 微小線分を出力しないという結果でした。 >マシンオフセットを使ってください CAD図には問題なく 微小線分がどうしても出てしまう場合には機械エラーを避けるため 制御機側ではなく コンピュータ側(補正を使わない) タイプでGコードを出力しようかとも思いましたが、 >原因は円弧と円弧を繋ぐ際の判断がうまくいってない。 との事なので、コンピュータ側は避けた方がいいですかね?