Q&A
| 번호 | 제목 | 작성자 | 등록일 | 조회 |
|---|---|---|---|---|
| 708 | 답변완료[소스]스피커소리내기 학교종이땡땡땡~~ | 안양박 | 2008-01-16 | 2,084 |
|
도레미파솔라시도 맞춰봤는데 청각이 안좋아서..^_^
//ICC-AVR application builder : 2008-01-14 오전 11:11:48
// Target : M128
// Crystal: 16.000Mhz
#include <iom128v.h>
#include <macros.h>
#define ONS (PORTG = PORTG|0x10)
#define OFFS (PORTG = PORTG&0xef)
volatile int toggle=0, sori=0, status=0;
volatile char keyin=0;
int d_time=500;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x10;
}
//TIMER0 initialize - prescale:32
// WGM: Normal
// desired value: 3KHz
// actual value: 3.012KHz (0.4%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x5A; //set count
OCR0 = 0xA6;
TCCR0 = 0x03; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = sori; //reload counter value
if(status==1){
if(toggle == 0){
toggle = 1;
ONS;
}else{
toggle = 0;
OFFS;}
}
}
void delay(int cnt)
{ int i, j;
for(i=0; i<cnt; i++){
for(j=0; j<1000; j++)
;
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
timer0_init();
MCUCR = 0x80;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x01; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void schoolsong(){
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x64;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x64;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x49;
delay(d_time);
status=0;
delay(d_time);
delay(d_time);
delay(d_time);
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x64;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x64;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
delay(d_time);
status=1;
sori=0x5a;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x49;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori=0x52;
delay(d_time);
status=0;
delay(d_time);
status=1;
sori = 0x40;
delay(1000);
status=0;
delay(1000);
}
/*
sori = 0x40;//도
sori = 0x49;//레
sori = 0x52;//미
sori = 0x56;//파
sori = 0x5a;//솔
sori = 0x64;//라
sori = 0x6e;//시
sori = 0x73;//도
*/
void main(void)
{
init_devices();
//randomize();
//insert your functional code here...
status=1;
while(1){
sori=0x52;
delay(50);
status=0;
delay(5);
status=1;
sori=0x6e;
delay(50);
status=0;
delay(5);
status=1;
}
}
관리자 답변
Good!!!
멋쟁이!
|
||||
| 707 | 답변완료[소스]GLCD를이용한빙고게임1차완성. | 안양박 | 2008-01-16 | 2,308 |
|
E_font.h 파일이 빠져있어 같이올립니다.ㅜ 꾸벅..
오락실에있는과일나라 맞추기게임을만들어보았습니다. 사운드는 따로 올릴테니 참고해서하시고 키보드로 조작하도록되었습니다. 모든키를 누르면 스타트되고 엔터키를 누르면멈추는식으로되어있으니 재미있게 노세요..그리고 추가적인기능은 계속 업데이터시키겠습니다. 다음목표는 낱말 맞추기게임..^_^
//ICC-AVR application builder : 2008-01-07 오후 1:54:02
// Target : M128
// Crystal: 16.000Mhz
#include <iom128v.h>
#include <macros.h>
#include <E_font.h>
#define LCD_Control PORTB
#define LCD_Data PORTD
#define RS_ON LCD_Control = LCD_Control|0x01
#define RS_OFF LCD_Control = LCD_Control&0xfe
#define RW_ON LCD_Control = LCD_Control|0x02
#define RW_OFF LCD_Control = LCD_Control&0xfd
#define EN_ON LCD_Control = LCD_Control|0x04
#define EN_OFF LCD_Control = LCD_Control&0xfb
#define CS2_ON LCD_Control = LCD_Control|0x10
#define CS2_OFF LCD_Control = LCD_Control&0xef
#define CS1_ON LCD_Control= LCD_Control|0x08
#define CS1_OFF LCD_Control = LCD_Control&0xf7
#define CS_ALL 0x18
#define CS_NO LCD_Control = LCD_Control&0xe7
#define RESET_ON LCD_Control= LCD_Control|0x20
#define RESET_OFF LCD_Control= LCD_Control&0xdf
#define ON 1
#define OFF 0
#define delaytime 2
#define delaytime1 5
int XPosition=0, YPosition=0;
int XPosition_1=0, YPosition_1=0;
const char x=0xb8, y=0x40;
char compare[8][128]={0x00,};
volatile char tmp='\\0';
volatile int status=0;
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0xff;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xff;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x67; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x98;
}
#pragma interrupt_handler uart0_rx_isr:19
void uart0_rx_isr(void)
{
//uart has received a character in UDR
tmp=UDR0;
status=1;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
uart0_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void BackLight(int onoff){
if(onoff==ON)
LCD_Control |= 0x40;
else
LCD_Control &= 0xbf;
}
void DisplayOnOff(int onoff){
RW_OFF;
RS_OFF;
if(onoff==ON){
DataInput(0x3F);
}else{
DataInput(0x3E);
}
}
void DataInput(char data){
RS_OFF;
RW_OFF;
EN_ON;
LCD_Control = data;
EN_OFF;
}
void DisplayStartLine(int displayline){
DataInput(displayline | 0xc0);
}
void SetX(int X){
DataInput(X | 0xb8);
}
void SetY(int Y){
DataInput(Y | 0x40);
}
void delay(int cnt){
int i , j;
for(i=0; i<cnt; i++){
for(j=0; j<100; j++) ;
}
}
void Write_Control(char CS, char cmd){
EN_OFF;
LCD_Control = CS;
EN_ON;
RS_OFF;
delay(delaytime);
RW_OFF;
delay(delaytime);
EN_ON;
delay(delaytime);
LCD_Data = cmd;
delay(delaytime);
EN_OFF;
delay(delaytime);
}
void Write_Data(char CS, char data){
EN_OFF;
LCD_Control = CS;
RS_ON;
delay(delaytime);
RW_OFF;
delay(delaytime);
EN_ON;
delay(delaytime);
LCD_Data = data;
delay(delaytime);
EN_OFF;
delay(delaytime);
}
void Lcd_Clear(){
int i, j, x_, y_;
LCD_Control = 0x00;
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
x_=0xb8;
y_=0x40;
for(i=0; i<=7; i++){
Write_Control(CS_ALL, x_);
Write_Control(CS_ALL, y_);
for(j=0; j<64; j++){
Write_Data(CS_ALL, 0x00);}
x_++;
}
}
void Lcd_Clear_1(){
int i, j, x_, y_;
LCD_Control = 0x00;
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
x_=0xb8;
y_=0x40;
for(i=0; i<=7; i++){
Write_Control(CS_ALL, x_);
Write_Control(CS_ALL, y_);
for(j=0; j<64; j++){
Write_Data(CS2_OFF, 0x00);}
x_++;
}
}
void Lcd_Clear_2(){
int i, j, x_, y_;
LCD_Control = 0x00;
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
x_=0xb8;
y_=0x40;
for(i=0; i<=7; i++){
Write_Control(CS_ALL, x_);
Write_Control(CS_ALL, y_);
for(j=0; j<64; j++){
Write_Data(CS1_OFF, 0x00);}
x_++;
}
}
void Lcd_init(){
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
Write_Control(CS_ALL, 0xb8);
Write_Control(CS_ALL, 0x40);
}
void Lcd_XY(int x_, int y_){
XPosition = x_;
YPosition = y_;
}
void Lcd_XY_S(int s, int x_, int y_){
Lcd_XY(x_,y_);
if(s==0)
Write_Control(CS_ALL, 0xb8 + x_*2);
else
Write_Control(CS_ALL, 0xb8 + x_*2 + 1);
if(YPosition <8)
Write_Control(CS2_OFF, 0x40 +y_*8);
else
Write_Control(CS1_OFF, 0x40 +(y_-8)*8);
}
void Write_English(unsigned char code){
int x_, y_, i, sign;
x_=XPosition;
y_=YPosition;
Lcd_XY_S(0,x_,y_);
if(YPosition < 8)
sign = CS2_OFF;
else
sign = CS1_OFF;
for(i=0;i<8;i++)
Write_Data(sign, E_font[code][i]);
Lcd_XY_S(1,x_,y_);
if(YPosition < 8)
sign = CS2_OFF;
else
sign = CS1_OFF;
for(i=8; i<16; i++)
Write_Data(sign, E_font[code][i]);
YPosition++;
if(YPosition==16){
YPosition = 0;
XPosition++;
}
if(XPosition>3){
XPosition = 0;
Lcd_Clear();}
}
void Lcd_XY_1(int x_, int y_){
XPosition_1 = x_;
YPosition_1= y_;
}
void Lcd_XY_S_1(int s, int x_, int y_){
Lcd_XY_1(x_,y_);
if(s==0)
Write_Control(CS_ALL, 0xb8 + x_*2);
else
Write_Control(CS_ALL, 0xb8 + x_*2 + 1);
Write_Control(CS2_OFF, 0x40 +y_*16+4);
}
void Write_Draw(unsigned char code){
int x_, y_, i, sign;
x_=XPosition_1;
y_=YPosition_1;
Lcd_XY_S_1(0,x_,y_);
sign = CS2_OFF;
for(i=0;i<8;i++)
Write_Data(sign, E_font[code][i]);
Lcd_XY_S_1(1,x_,y_);
sign = CS2_OFF;
for(i=8; i<16; i++)
Write_Data(sign, E_font[code][i]);
YPosition++;
if(YPosition==4){
YPosition = 0;
XPosition++;
}
if(XPosition>=4){
Lcd_Clear_1();
XPosition = 0;
}
}
int putchar(char data){
Write_English(data);
}
void PointXY(int xpoint, int ypoint){
int point=0x01, value;
int x1, y1, y2, y3;
x1=xpoint%128;
y1=ypoint%64;
y2=y1/8;
y3=y1%8;
compare[y2][x1]|=(point<<y3);
value=compare[y2][x1];
if(x1<64){
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1);
Write_Data(CS2_OFF, value);} else {
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1-64);
Write_Data(CS1_OFF, value);}
}
void Point_Del(int xpoint, int ypoint){
int point=0x01, value;
int x1, y1, y2, y3;
x1=xpoint%128;
y1=ypoint%64;
y2=y1/8;
y3=y1%8;
compare[y2][x1]&=(~(point<<y3));
value=compare[y2][x1];
if(x1<64){
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1);
Write_Data(CS2_OFF, value);} else {
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1-64);
Write_Data(CS1_OFF, value);}
}
void Draw_Line(int X0, int Y0, int X1, int Y1){
int x0=X0, y0=Y0, x1=X1, y1=Y1;
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
if (dy < 0) {
dy = -dy;
stepy = -1;
} else {
stepy = 1;
}
if (dx < 0) {
dx = -dx;
stepx = -1;
} else {
stepx = 1;
}
dy <<= 1;
dx <<= 1;
PointXY(x0, y0);
if (dx > dy) {
int fraction = dy - (dx >> 1);
while (x0 != x1) {
if (fraction >= 0) {
y0 += stepy;
fraction -= dx;
}
x0 += stepx;
fraction += dy;
PointXY(x0, y0);
}
} else {
int fraction = dx - (dy >> 1);
while (y0 != y1) {
if (fraction >= 0) {
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
PointXY(x0, y0);
}
}
}
void Line_Del(int X0, int Y0, int X1, int Y1){
int x0=X0, y0=Y0, x1=X1, y1=Y1;
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
if (dy < 0) {
dy = -dy;
stepy = -1;
} else {
stepy = 1;
}
if (dx < 0) {
dx = -dx;
stepx = -1;
} else {
stepx = 1;
}
dy <<= 1;
dx <<= 1;
Point_Del(x0, y0);
if (dx > dy) {
int fraction = dy - (dx >> 1);
while (x0 != x1) {
if (fraction >= 0) {
y0 += stepy;
fraction -= dx;
}
x0 += stepx;
fraction += dy;
Point_Del(x0, y0);
}
} else {
int fraction = dx - (dy >> 1);
while (y0 != y1) {
if (fraction >= 0) {
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
Point_Del(x0, y0);
}
}
}
void Draw_Line_function(){
Draw_Line(0,1,0,62);
Draw_Line(63,1,63,62);
Draw_Line(0,0,63,0);
Draw_Line(0,63,63,63);
PointXY(16,16);
PointXY(16,32);
PointXY(16,48);
PointXY(32,16);
PointXY(32,32);
PointXY(32,48);
PointXY(48,16);
PointXY(48,32);
PointXY(48,48);
}
void main(void)
{
int i, x1, y1, arr_val;
int sum_=0, bet=10, win=0;
int a1, a2;
char win_arr[4][4]={0x00,};
char arr[]={1,2,3,6,11,12,13,14,1,2,3,6,11,12,13,14,
1,2,3,6,11,12,13,14,1,2,3,6,11,12,13,14,2,3,
6,11,12,13,14,1,2,3,6,11,12,13,3,6,11,12,13,
14,1,2,3,6,11,12,13,14,11,12,13,14,14,11,1,3,
1,6,11,12,13,14,1,2,3,13,14,3,6,3,6,13,14,6,0};
init_devices();
Lcd_init();
Lcd_Clear();
Lcd_XY(0,8);
printf("%-Lucky-");
Lcd_XY(1,8);
printf("Sum: %d$", sum_);
Lcd_XY(2,8);
printf("Bet: %d$", bet);
Lcd_XY(3,8);
printf("Win-Los");
Draw_Line_function();
for(i=0;i<16;i++){
x1=i/4;
y1=i%4;
Lcd_XY_1(x1,y1);
Write_Draw(arr[i]);}
while(1){
if(status==1){
for(i=0;i<16;i++){
x1=i/4;
y1=i%4;
arr_val=(rand()%70);
Lcd_XY_1(x1,y1);
Write_Draw(arr[arr_val]);
win_arr[x1][y1]=arr[arr_val];
}
}
if(tmp=='\\r'){
status=0;
tmp='\\0';
if((win_arr[0][0]==win_arr[0][1])==(win_arr[0][2]==win_arr[0][3])){
win++;}
if((win_arr[1][0]==win_arr[1][1])==(win_arr[1][2]==win_arr[1][3])){
win++;}
if((win_arr[2][0]==win_arr[2][1])==(win_arr[2][2]==win_arr[2][3])){
win++;}
if((win_arr[3][0]==win_arr[3][1])==(win_arr[3][2]==win_arr[3][3])){
win++;}
if((win_arr[0][0]==win_arr[1][0])==(win_arr[2][0]==win_arr[3][0])){
win++;}
if((win_arr[0][1]=win_arr[1][1])==(win_arr[2][1]==win_arr[3][1])){
win++;}
if((win_arr[0][2]==win_arr[1][2])==(win_arr[2][2]==win_arr[3][2])){
win++;}
if((win_arr[0][3]==win_arr[1][3])==(win_arr[2][3]==win_arr[3][3])){
win++;}
if((win_arr[0][0]==win_arr[1][1])==(win_arr[2][2]==win_arr[3][3])){
win++;}
if((win_arr[0][3]==win_arr[1][2])==(win_arr[2][1]==win_arr[3][0])){
win++;
}
/*if(win>0){
sum_ = sum_ + win;
Lcd_Clear_2();
Lcd_XY(0,8);
printf("%-Lucky-");
Lcd_XY(1,8);
printf("Sum: %d$", sum_);
Lcd_XY(2,8);
printf("Bet: %d$", bet);
Lcd_XY(3,8);
printf("$%d Win", win);
win=0;
} else { Lcd_XY_1(3,8);
printf(" -LOSE-");}*/
}
}
}
관리자 답변
안돌아 가는 데요..
|
||||
| 706 | 답변완료스테핑모터가감속테이블 짜는방법이나 소스부탁드립니다.... | 임형섭 | 2008-01-15 | 2,986 |
|
키트에서 가감속을 SW를 이용해서 하라고 하셨는데 감이 안옵니다....
스테핑모터가감속테이블 짜는방법이나 소스부탁드립니다....
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니 제품을 이용하여 주셔서 감사드립니다.
우선, MS2의 경우 클럭 넣는 곳에 function generator를 물리시고, 두바퀴 돌 때마다 가속 시켜서 올려 보면 간단히 테스트가 가능합니다. 그 값으로 가속 시켜 주면 되겠지요.
일반적으로 400 클럭 정도 들어갔을 때 가속 시켜 줌이 바람직합니다. 가속 테이블은 테스트 해가면서 적당한 포인트와 가속치를 주는 것이 바람직합니다.
스테핑 모터용 소스는 CS2P 나 MS2 모두 예제 소스가 자료실->기존자료실에서 "소스"로 검색하시면 찾으실 수 있습니다.
감사합니다.
>키트에서 가감속을 SW를 이용해서 하라고 하셨는데 감이 안옵니다....
>
>스테핑모터가감속테이블 짜는방법이나 소스부탁드립니다....
|
||||
| 705 | 답변완료류대우 선생님을 통해 AVR보드산 학생 | 한병인 | 2008-01-15 | 2,474 |
|
- AVR MEGA 128pro 개발키트를 구입한 학생입니다.
- 이 보드에 맞는 샘플 프로그램 모음을 당부드립니다.
- 샘플 프로그램을 보고 추가 확장 보드를 구입하려합니다.
- 당부드립니다...[한병인 올림]
관리자 답변
안녕하세요? 한병인님,
저희 보드를 이용해 주셔서 감사합니다.
요청하신 소스를 올려두었습니다.
주로, 저희 회사 확장보드를 KD-128PRO킷트를 이용할 때의 예제들입니다.
참고하시고, 언제든 필요하신 소스가 있으시면, Q&A를 통해 질문해 주시기 바랍니다.
감사합니다.
>
> - AVR MEGA 128pro 개발키트를 구입한 학생입니다.
>
> - 이 보드에 맞는 샘플 프로그램 모음을 당부드립니다.
>
> - 샘플 프로그램을 보고 추가 확장 보드를 구입하려합니다.
>
> - 당부드립니다...[한병인 올림]
|
||||
| 704 | 답변완료안녕하세요? 가속도센서(AM-3AXIS)의 스펙에 관한 질문입니다. | 민병우 | 2008-01-15 | 2,429 |
|
안녕하세요?
가속도센서(AM-3AXIS)를 구입 할 예정이고, 현재 메뉴얼을 공부하고 있습니다.
제가 가속도 센서를 처음 써 봐서 센서 스펙을 아직 이해 못하고 있습니다.
가속도 센서 스펙에 보면, Sensitivity에 보면 1.5g / 2g / 4g / 6g 모드로 되어있는 것으로 알고 있습니다.
0 g인 경우 3.3v 범위에서 1.65V라고 하셨는데...
1) 이것이 모든 모드에 적용되는 것입니까?
2) 1.5g에서 1g당 0.8V로 되어 있는데, 계산에 의하면, 3.3V이면, 거의 2g이고,
1.5g가 최대가속도 값이라서 3.3V라도 1.5g가 되는것입니까?
3) 만약에 1.65값 이하 일경우 -g값으로 되는 것입니까? 만약에 0V이면, -1.5g
가 되는 것입니까?
4) 0 g라는 의미가 동적가속도가 0이라는 것인지. 그러면, 센서를 평행한 상태로
가만히 놔두면 x,y,z전압값이 1.65V가 나오는 것인지 궁금합니다.
5) 출력으로 나오는 가속도 값이 X, Y축만 동적 가속도만 나오는 것인지,
Z축만 정적 가속도 값만 나오는 것인지 궁금합니다.
처음 해보니 궁금한 점이 많이 있어서 많은 질문 드립니다.
수고하세요~
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니 제품을 이용해 주셔서 감사드립니다.
질문하신 내용에 답변해 드립니다.
1) 0g에서 1.65V 인 것인 스펙상으로는 모든 모드에 적용됩니다.
2) 1.5g 모드에서 800mV/g 로 변한다는 것이구요. 1.5g 모드라고 해서 1.5g까지만 측정이 가능하다는 말은 아닙니다.
3) -값도 존재합니다.
4) 0g 라는 것은 동적 가속도는 당연히 0이구, 정적 가속도도 0g 일때를 말합니다. 평행한 상태로 둔다는 의미가 무엇인지요. X,Y,Z 에 따라 0g가 되는 위치포인트가 다릅니다. 데이터 시트에 그림으로 잘 설명되어 있습니다. 참고하세요.
5) X,Y,Z 모두 가속도 = 정적가속도+동적가속도로 출력됩니다.
감사합니다.
>안녕하세요?
>가속도센서(AM-3AXIS)를 구입 할 예정이고, 현재 메뉴얼을 공부하고 있습니다.
>제가 가속도 센서를 처음 써 봐서 센서 스펙을 아직 이해 못하고 있습니다.
>가속도 센서 스펙에 보면, Sensitivity에 보면 1.5g / 2g / 4g / 6g 모드로 되어있는 것으로 알고 있습니다.
>0 g인 경우 3.3v 범위에서 1.65V라고 하셨는데...
>
>1) 이것이 모든 모드에 적용되는 것입니까?
>2) 1.5g에서 1g당 0.8V로 되어 있는데, 계산에 의하면, 3.3V이면, 거의 2g이고,
> 1.5g가 최대가속도 값이라서 3.3V라도 1.5g가 되는것입니까?
>3) 만약에 1.65값 이하 일경우 -g값으로 되는 것입니까? 만약에 0V이면, -1.5g
> 가 되는 것입니까?
>4) 0 g라는 의미가 동적가속도가 0이라는 것인지. 그러면, 센서를 평행한 상태로
> 가만히 놔두면 x,y,z전압값이 1.65V가 나오는 것인지 궁금합니다.
>5) 출력으로 나오는 가속도 값이 X, Y축만 동적 가속도만 나오는 것인지,
> Z축만 정적 가속도 값만 나오는 것인지 궁금합니다.
>
>처음 해보니 궁금한 점이 많이 있어서 많은 질문 드립니다.
>수고하세요~
>
|
||||
| 703 | 답변완료서보관련문의입니다. | 오원세 | 2008-01-14 | 2,239 |
|
저희가 서보를 제어를 해야하는데 시작한지 얼마되지않아 잘몰라서 문의드립니다.
제공해 주신 소스로 서보를 구동시켜 봤습니다.
버튼누르니 좌로 움직였다가 우로 움직입니다.
저희가 하고싶은 것은 버튼누를때마다 왼쪽으로 일정한 각도로 움직이고
다른버튼 누르면 반대쪽으로 일정한 각도로 움직이는 것입니다.
소스의 어떤부분을 수정하면 되는지 조언부탁드립니다.
참고로 KD-128Pro를 가지고있습니다.
감사합니다.
관리자 답변
안녕하세요?
저희 뉴테크놀로지 컴패니 제품을 이용해 주셔서 감사드립니다.
여기서,ser_pos[i] = 140 ~ 240을 넣고 있는 데,
이 사이 값을 입력하면, 0~180도 사이각으로 움직이게 됩니다.
그 숫자 값을 바꾸시면 될 것 같네요.
그리고, 한쪽 버튼을 누르면 값이 10씩 증가한다거나, 반대쪽은 10씩 감소한다거나 하는 식으로 하시면 될 것 같습니다.
감사합니다.
>저희가 서보를 제어를 해야하는데 시작한지 얼마되지않아 잘몰라서 문의드립니다.
>
>제공해 주신 소스로 서보를 구동시켜 봤습니다.
>
>버튼누르니 좌로 움직였다가 우로 움직입니다.
>
>저희가 하고싶은 것은 버튼누를때마다 왼쪽으로 일정한 각도로 움직이고
>
>다른버튼 누르면 반대쪽으로 일정한 각도로 움직이는 것입니다.
>
>소스의 어떤부분을 수정하면 되는지 조언부탁드립니다.
>
>참고로 KD-128Pro를 가지고있습니다.
>
>감사합니다.
>
>
|
||||
| 702 | 답변완료SE-SM 구매 | 김민덕 | 2008-01-14 | 2,271 |
|
SE-SM을 구매하였읍니다.
소스좀 보내주세여.
수고하세여.
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니 제품을 이용해 주셔서 감사드립니다.
우선, 스테핑 모터는 모터만 가지고는 동작하지 않습니다.
모터 구동용 드라이버를 구매하셔야 합니다. 예를 들자면, 확장 보드 중에서 AM-CS2P 나 AM-MS2 같은 것입니다.
CS2P는 상을 일일이 만들어 주셔야 하구요. 클럭당 최소 0.9도 각도로 구동이 가능합니다.
MS2는 클럭으로 구동이 되구요. 마이크로 스텝, 즉 클럭당 최소 약 0.1도까지 구동 가능합니다.
각각에 대한 소스는 첨부해 드립니다.
감사합니다.
>SE-SM을 구매하였읍니다.
>소스좀 보내주세여.
>수고하세여.
|
||||
| 701 | 답변완료AM-LCD보드 문의 입니다. | 조정교 | 2008-01-14 | 2,316 |
|
얼마전 AM-LCD보드를 리뉴얼 중이라고 들었던 기억이 있습니다..
리뉴얼된되 보드는 언제쯤이면 구매가 가능할지 궁굼합니다.
답변 바랍니다.
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니 제품을 늘 애용해 주셔서 감사드립니다.
2-3주 후면 완료됩니다. 자세한 일정은 공지하도록 하겠습니다.
감사합니다.
|
||||
| 700 | 답변완료회원가입 안되나요? | 김승주 | 2008-01-11 | 2,145 |
|
웅;;
AM-3AXIS 제품에 관심이 있어서 회원가입하려고 왔는데...
가입도 안되고.. 강좌도 안 봐지고 그렇네요..
서버가 이상한가.ㅠ
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니를 방문해 주셔서 감사드립니다.
회원 가입 안하셔도 강좌 보는 것과는 관계가 없습니다.
회원 가입이 가능하긴 한데, 큰 의미는 현재 부여 하고 있지 않거든요.
강좌가 안봐 지신다는 게 좀 이상하네요.
아마도, 공유기 설정에 막혀 있는 것 같습니다.
공유기 쪽을 IP를 풀어 주시는 것이 좋겠습니다.
감사합니다.
|
||||
| 699 | 답변완료[USBISP 에러 관련] USBISP 관련 사용하실 때 에러 대처법입니다. | N.T.C | 2008-01-11 | 5,055 |
|
안녕하세요? 고객님,
대부분의 고객님들은 편하게 잘 쓰시고 계시는 걸로 알고 있습니다. 하지만,
USBISP를 편리하게 쓰려고 사셨는 데, 일부 고객님들이 사용이 잘 안되거나, 에러 메시지가 나서 사실상 사용 못하시고 있는 분들이 일부 계시는 걸로 압니다.
저희 회사를 찾아 오신 분들은 대부분 해결해서, 가시고 계시지만,
그렇지 못하신 분들은 스스로 고생해서, 해결하시거나 못하시고 그냥 묵혀두시는 분들도 있다고 들었습니다. 그런 분들을 위해서, 에러 대처법을 나름대로 만들어 보았습니다.
- 에러 1 -
1. 에러메시지 :
check that the ISP programming frequency specified on the 'Board' page is well blelow 1/4 of the clock freqeuncy of the device....
2. 조치법 :
1) NTC 자료실에서 최신 드라이버를 다운받아 설치한다.
2) ATMEL AVR Studio 의 경우 ServicePack 2에서 현재 동작하지 않으므로, 삭제하고, AVR Stuido 4.13 + ServicePack 1을 깔아서 사용한다. 향후, 업그레이드 예정입니다.
3) USBISP용 드라이버가 중복 설치되면, 에러가 날 수 있습니다. 따라서, 프로그램 추가 삭제에도 간혹 FTDI 드라이버가 뜨는 경우가 있는 데, 거기서 제거해 주시고, 자료실에서 드라이버 최신판 받으셔서 깔아주시면 됩니다.
4)그래도, 같은 메시지가 나오면, ICCAVR을 깔아서 본사의 USBISP 메뉴얼에 있는 데로 설정한 후에 퓨즈비트 값을 읽고, 다운로드를 한 번 성공시킨 후에, 다시 AVR Studio를 사용하면 될 것입니다. 이 부분은 AVR Studio의 버그로 보입니다.
이걸로 해결이 안되면,
사용하시는 컴파일러의 다운로더에 따라서 USBISP를 지원하지 않는 경우도 있습니다.
예를 들어서, 코드비전 같은 경우에는 v1.24 이상을 지원하구요.
코드비전 자체가 USBISP용 프로토콜인 STK500에 대해서,
예전버전에서 지원되지 않는 부분이 코드비전 컴파일러 제조사인
HPINFOTECH에서 밝히고 있습니다. 아래 링크를 참고하시구요.
따라서, V1.24.6 Commercial Release 이상 버전에서 STK500 프로토콜을 이용하여 USBISP로 프로그램 라이트가 가능하시구요. 링크를 찾아보면, V1.24.7F는 주파수가 일부 셋팅되지 않는 버그가 있는 것으로 확인하실 수 있구요. 그래서, V1.24.7F 도 지원되지 않습니다. 그 버전을 제외한 V1.24.6 버전 이상을 구하셔서 사용하셔야 할 것 같습니다.
- 아래 -
http://www.hpinfotech.ro/html/cvavr_history.htm
USBISP는 STK500이라는 프로토콜을 사용합니다.
따라서, STK500을 지원하는 컴파일러나 다운로더가 사용 가능합니다.
예를들어서, AVR Studio, ICCAVR, IARC, Code Vision 등입니다.
AVR Studio, ICCAVR, IARC, Code Vision(v1.24 이상) 등을 이용해 주시기 바랍니다. 사용법은 자료실의 메뉴얼에 나와 있습니다.
- 에러 2 -
1. 에러메시지 :
내부 EEPROM에 리드 라이트가 되지 않음.
2. 조치법 :
1) 처음 설계시 고려되지 않은 부분으로 향후 업그레이드 예정입니다.
- 에러 3 -
1. 에러메시지 :
Cannot program....
2. 조치법 :
1) NTC 자료실에서 최신 드라이버를 다운받아 설치한다.
2) 시리얼 COM포트를 윈도우의 제어판->시스템->하드웨어->장치관리자->포트에서 USB to Serial 로 잡힌 포트를 확인 후 포트가 1-8 이상일 경우 Advanced 메뉴에서 1-8 이내로 빈 곳으로 바꾸어 준다.
3) 사용 중인 다운로딩 프로그램에서 포트를 맞춰서 잘 설정한다.
좀 더 좋은 제품을 만들 수 있도록 노력하겠습니다.
업그레이드 일정을 좀 앞당겨서 해 볼 수 있도록 노력 중입니다.
감사합니다.
관리자 답변
2) ATMEL AVR Studio 의 경우 ServicePack 2에서 현재 동작하지 않으므로, 삭제하고, AVR Stuido 4.13 + ServicePack 1을 깔아서 사용한다. 향후, 업그레이드 예정이다.
저는 위의 방법으로 해결하였습니다.- 감사합니다-
|
||||
| 698 | 답변완료encoder DC motor 제어 | 오원세 | 2008-01-10 | 2,471 |
|
encoder DC motor를 제어를 해야하는데요...
제가 전자전기 쪽은 완젼초보라서^^;;
atmega128 pro kit가 있어요...
여기에 모터드라이브를 연결하고 그다음 모터를 어떻게 연결하는지요??
모터는 모터뱅크(www.motorbank.co.kr)에서 PGM16-E 이제품을
가지고 있습니다.
제어는 어떤방식으로 해야하나요??
감사합니다.
관리자 답변
안녕하세요? 저희 뉴테크놀로지 컴패니 제품을 이용하여 주셔서 감사드립니다.
일단, DC motor 제어는 저희 모듈을 사용하는 예제소스가 자료실에 공개되어 있구요. Encoder를 사용하는 것은 펄스를 세어서 돌아가는 것을 재구요. 펄스당 각도를 가지고 재게 되구요.
두라인에서 들어오는 펄스를 각각 세서 시계방향, 반시계방향을 판단하게 됩니다.
자세한 인코더 관련 내용은 인터넷을 참고하세요.
감사합니다.
|
||||
| 697 | 답변완료확장보드 질문입니다.. | 조정교 | 2008-01-10 | 2,547 |
|
귀사의 확장보드중에..
디지털 입출력 보드가 있던데요..
어디에 적용이 가능한지 궁굼합니다..
답변 기다리겠습니다 ^^
관리자 답변
안녕하세요? 조정교님,
디지털 입출력 보드가 어떤 제품인지 궁금하네요.
저희 회사에 없는 제품 같습니다.
알려 주세요.
감사합니다.
|
||||
| 696 | 답변완료ADC 학습위한 센서 관련 책좀 추천해 주세요 | KJS | 2008-01-10 | 2,637 |
|
AVR를 이용한 study 중인데요.
ADC 관련 각종 센서 사용에 대한 기본 지식및 skill 위한
좋은 책 있으면 소개 부탁 드립니다.
관리자 답변
안녕하세요? 열공 하세요.
참고하실 만한 책 이름은 자동화를 위한 센서공학 성안당 책입니다. 또한, ADC 기본이 되는 ADC0809에 관한 내용도 나와 있는 책이 있네요.
비주얼 C++을 이용한 프린터포트 제어, 동일출판사 입니다.
좀 다른 방향의 책이지만, ADC 부분이 괜찮은 책 같아 추천합니다.
감사합니다.
|
||||
| 695 | 답변완료<소스>그래픽 lcd 글자쓰기 및 네모그리기 | KJS | 2008-01-10 | 3,234 |
|
폰트 헤더 파일및 기본소스는 newtc 자료실, 그래픽 lcd 부분에 있음.
그걸 겨우 이해해서 간단히 묘사한 상태임
#include <iom128v.h>
#include <macros.h>
#include <math.h>
#include "FONTK52.h"
//#include "GLCDK52.h"
#define LCD_CTRL (*(volatile unsigned char *)0x8001)
#define LCD_OUTP (*(volatile unsigned char *)0x8000)
#define ON 1
#define OFF 0
#define dd_time 10
#define DISPON 0x3f
#define DISPOFF 0x3e
#define DI 0x01
#define RW 0x02
#define E 0x04
#define CS1 0x08
#define CS2 0x10
#define CS_ALL 0x18
#define RESET 0x20
#define SetDI(m) m ? (LCD_CTRL=(L_CON|=DI )) : (LCD_CTRL=(L_CON&=~DI))
#define SetRW(m) m ? (LCD_CTRL=(L_CON|=RW )) : (LCD_CTRL=(L_CON&=~RW))
#define SetE(m) m ? (LCD_CTRL=(L_CON|=E )) : (LCD_CTRL=(L_CON&=~E))
#define SetCS1(m) m ? (LCD_CTRL=(L_CON|=CS1 )) : (LCD_CTRL=(L_CON&=~CS1))
#define SetCS2(m) m ? (LCD_CTRL=(L_CON|=CS2 )) : (LCD_CTRL=(L_CON&=~CS2))
#define SetReset(m) m ? (LCD_CTRL=(L_CON|=RESET)) : (LCD_CTRL=(L_CON&=~RESET))
typedef unsigned char byte;
typedef unsigned int word;
volatile int L_CON = 0x00;
byte ch_data =0x00;
byte ch_keep[8][128]= {0x00};
int page=0;
int y_page=0,first_cnt=0;
byte xcharacter, ycharacter; /* x character(0-3), y character(0-15) */
byte cursor_flag, cursorx, cursory; /* x and y cursor position(0-3, 0-15) */
byte Korean_buffer[32];
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00; // Control Port
PORTB = 0x00;
DDRB = 0x00; // Data Port
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
MCUCR = 0x80;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay( word del )
{
int i, j;
for (i=0; i<del; i++)
for (j=0; j<100; j++) ;
}
void write_cmd( byte signal, byte cmd )
{
//check_bf();
SetCS1(0); delay(10);
SetCS2(0); delay(10);
SetE(1); delay(10);
SetE(0); delay(10);
SetRW(0); delay(10);
SetDI(0); delay(10);
// SetCS1(0);
switch(signal & CS_ALL){
case CS1: {
SetCS1(1); break;
}
case CS2: {
SetCS2(1); break;
}
case CS_ALL : {
SetCS1(1);
delay(10);
SetCS2(1);
break;
}
}
delay(10);
SetE(1); delay(10);
LCD_OUTP = cmd; delay(10);
SetE(0); delay(10);
}
/* 1 문자 출력 */
//signal = CS1, CS2
//cmd = data
void write_data( byte signal, byte ch )
{
//check_bf();
SetCS1(0); delay(10);
SetCS2(0); delay(10);
SetE(1); delay(10);
SetE(0); delay(10);
SetRW(0); delay(10);
SetDI(1); delay(10);
// SetCS1(0);
switch(signal & CS_ALL){
case CS1: {
SetCS1(1); break;
}
case CS2: {
SetCS2(1); break;
}
case CS_ALL : {
SetCS1(1);
delay(10);
SetCS2(1);
break;
}
}
delay(10);
//SetCS1(signal&CS_ALL); delay(10);
//SetCS2(signal&CS_ALL); delay(10);
SetE(1); delay(10);
LCD_OUTP = ch; delay(10);
SetE(0); delay(10);
}
void lcd_clear(void)
{
byte i, j, x, y;
write_cmd(CS_ALL,DISPON);
write_cmd(CS_ALL,0xc0); // Display Start Line
x = 0xB8; /* X start address */
y = 0x40; /* Y start address */
for(i = 0; i <=7; i++)
{
write_cmd(CS_ALL,x);
write_cmd(CS_ALL,y);
for(j = 0; j < 64; j++) {
write_data(CS_ALL,0x00); /* clear CS1 and CS2 */
}
x++;
}
}
void lcd_init(void)
{
SetReset(0);
delay(10);
SetReset(1);
delay(10);
write_cmd( CS_ALL, DISPON );
write_cmd( CS_ALL, 0xc0 ); /* 디스플레이 시작라인 */
}
void delay_us(word time_us)
{
register word i;
for(i=0; i<time_us; i++){ // 4 cycle +
asm("PUSH R0"); // 2 cycle +
asm("POP R0"); // 2 cycle +
asm("PUSH R0"); // 2 cycle +
asm("POP R0"); // 2 cycle +
asm("PUSH R0"); // 2 cycle +
asm("POP R0"); // 2 cycle = 16 cycle = 1us for 16MHz
}
}
void delay_ms(word time_ms)
{
register word i;
for(i=0;i<time_ms;i++) delay_us(1000);
}
void lcd_xy( byte x, byte y ) /* set English character position on GLCD */
{
xcharacter = x; /* x = 0 - 3 */
ycharacter = y; /* y = 0 - 15 */
}
/*-------------------------------------------------------------------------*/
void lcd_xy_row(byte row,byte x,byte y) /* set character upper/lower row on GLCD */
{
lcd_xy(x,y); /* x = 0 - 3, y = 0 - 15 */
if(row == 0) /* if upper row, set Y address */
write_cmd(CS_ALL,0xB8 + x*2);
else /* if lower row, set Y address + 1 */
write_cmd(CS_ALL,0xB8 + x*2 + 1);
if(ycharacter <= 7) /* if y <= 7, CS1 Y address */
write_cmd(CS1,0x40 + y*8);
else /* if y >= 8, CS2 Y address */
write_cmd(CS2,0x40 + (y-8)*8);
}
void GLCD_English(byte Ecode) //* display a 8x16 Dot English(ASCII) on GLCD /
{ byte x, y, i, signal;
x = xcharacter;
y = ycharacter;
lcd_xy_row(0,x,y); //* display upper row /
if(ycharacter <= 7) //* if y <= 7, CS1 /
signal = CS1;
else //* if y >= 8, CS2 /
signal = CS2;
for(i = 0; i <= 7; i++)
write_data(signal,E_font[Ecode][i]);
lcd_xy_row(1,x,y); //* display lower row /
if(ycharacter <= 7) //* if y <= 7, CS1 /
signal = CS1;
else //* if y >= 8, CS2 /
signal = CS2;
for(i = 8; i <= 15; i++)
{ if((cursor_flag == 1) && (xcharacter == cursorx) && (ycharacter == cursory))
write_data(signal,E_font[Ecode][i] | 0x80);
else
write_data(signal,E_font[Ecode][i]);
}
ycharacter++;
if(ycharacter==16){
ycharacter = 0;
xcharacter++;
}
}
void GLCD_Korean(word Kcode) //* display a 16x16 Dot Korean on GLCD /
{ byte x, y, i, signal;
byte cho_5bit, joong_5bit, jong_5bit;
byte cho_bul, joong_bul, jong_bul, jong_flag;
word character;
if(ycharacter==15)
GLCD_English(0x20);
cho_5bit = table_cho[(Kcode >> 10) & 0x001F]; //* get cho, joong, jong 5 bit /
joong_5bit = table_joong[(Kcode >> 5) & 0x001F];
jong_5bit = table_jong[Kcode & 0x001F];
if(jong_5bit == 0) //* don't have jongsung /
{ jong_flag = 0;
cho_bul = bul_cho1[joong_5bit];
if((cho_5bit == 1) || (cho_5bit == 16)) joong_bul = 0;
else joong_bul = 1;
}
else //* have jongsung /
{ jong_flag = 1;
cho_bul = bul_cho2[joong_5bit];
if((cho_5bit == 1) || (cho_5bit == 16)) joong_bul = 2;
else joong_bul = 3;
jong_bul = bul_jong[joong_5bit];
}
character = cho_bul*20 + cho_5bit; //* copy chosung font /
for(i = 0; i <= 31; i++)
Korean_buffer[i] = K_font[character][i];
character = 8*20 + joong_bul*22 + joong_5bit; //* OR joongsung font /
for(i = 0; i <= 31; i++)
Korean_buffer[i] |= K_font[character][i];
if(jong_flag == 1) //* if jongsung, OR jongsung font /
{ character = 8*20 + 4*22 +jong_bul*28 + jong_5bit;
for(i = 0; i <= 31; i++)
Korean_buffer[i] |= K_font[character][i];
}
x = xcharacter;
y = ycharacter;
lcd_xy_row(0,x,y); //* display upper left row /
if(ycharacter <= 7) //* if y <= 7, CS1 /
signal = CS1;
else //* if y >= 8, CS2 /
signal = CS2;
for(i = 0; i <= 7; i++)
write_data(signal,Korean_buffer[i]);
lcd_xy_row(1,x,y); //* display lower left row /
if(ycharacter <= 7) //* if y <= 7, CS1 /
signal = CS1;
else //* if y >= 8, CS2 /
signal = CS2;
for(i = 16; i <= 23; i++)
{ if((cursor_flag == 1) && (xcharacter == cursorx) && (ycharacter == cursory))
write_data(signal,Korean_buffer[i] | 0x80);
else
write_data(signal,Korean_buffer[i]);
}
ycharacter++;
y = ycharacter;
lcd_xy_row(0,x,y); ///* display upper right row /
if(ycharacter <= 7) ///* if y <= 7, CS1 /
signal = CS1;
else ///* if y >= 8, CS2 /
signal = CS2;
for(i = 8; i <= 15; i++)
write_data(signal,Korean_buffer[i]);
lcd_xy_row(1,x,y); //* display lower right row /
if(ycharacter <= 7) //* if y <= 7, CS1 /
signal = CS1;
else //* if y >= 8, CS2 /
signal = CS2;
for(i = 24; i <= 31; i++)
{ if((cursor_flag == 1) && (xcharacter == cursorx) && (ycharacter == (cursory+1)))
write_data(signal,Korean_buffer[i] | 0x80);
else
write_data(signal,Korean_buffer[i]);
}
ycharacter++;
if(ycharacter==16){
ycharacter = 0;
xcharacter++;
}
}
/*******************************************************************************
* 완성형 한글을 조합형으로 바꾸어 주는 부분입니다.
*******************************************************************************/
word kssm_convert(word kssm)
{
byte high,low;
word index;
word return_data;
high = (kssm>>8)&0xff;
low = kssm &0xff;
if ((kssm >= 0xb0a1)&&(kssm <= 0xc8fe))
{
index = (high - 0xb0) * 94 + low - 0xa1;
return_data = KSTable[index][0]*256;
return_data |= KSTable[index][1];
return return_data;
}
return 0;
}
void lcd_string(byte x, byte y, byte *string) //* display a string on GLCD /
{ byte character1;
word character2;
lcd_xy(x,y); //* x = 0 - 3, y = 0 - 15 /
while(*string != '\\0')
{
character1 = *string;
string++;
if(((character1 >> 7) & 0x01) == 0)
GLCD_English(character1); //* display English character /
else
{
character2 = *string;
character2 = 256*character1 + (character2 & 0xFF);
string++;
character2 = kssm_convert(character2);//완성형을 조합형으로 변환
GLCD_Korean(character2); //* display Korean character /
}
}
}
void pixelL(int x, int y, int z) // Draw the current pixel
{
byte offset_D;
word x_move, offset, chipselect;
x_move = x/8;
chipselect = y/64;
offset = x%8;
offset_D = (0x01<<offset);
/*
switch(offset){
case 0 : offset_D=0x01; break;
case 1 : offset_D=0x02; break;
case 2 : offset_D=0x04; break;
case 3 : offset_D=0x08; break;
case 4 : offset_D=0x10; break;
case 5 : offset_D=0x20; break;
case 6 : offset_D=0x40; break;
case 7 : offset_D=0x80; break;
}
*/
ch_data= offset_D;
page = x/8;
y_page=y;
if(chipselect){
write_cmd(CS2,0xb8 + x_move);
write_cmd(CS2,0x40 + y%64);
ch_keep[x_move][y]|=ch_data;
if(z) write_data(CS2,ch_keep[page][y_page]);
}
else {
write_cmd(CS1,0xb8 + page);
write_cmd(CS1,0x40 + y%64);
ch_keep[x_move][y]|=ch_data;
if(z) write_data(CS1,ch_keep[page][y_page]);
}
first_cnt=1;
}
void line(int x1, int y1, int x2, int y2){
int deltax, deltay, x, y, xinc1,xinc2, yinc1, yinc2,den, num, numadd,numpixels,curpixel;
deltax = fabs(x2 - x1); // The difference between the x's
deltay = fabs(y2 - y1); // The difference between the y's
x = x1; // Start x off at the first pixel
y = y1; // Start y off at the first pixel
if (x2 >= x1){ // The x-values are increasing
xinc1 = 1;
xinc2 = 1;
}else{ // The x-values are decreasing
xinc1 = -1;
xinc2 = -1;
}
if (y2 >= y1){ // The y-values are increasing
yinc1 = 1;
yinc2 = 1;
}else{ // The y-values are decreasing
yinc1 = -1;
yinc2 = -1;
}
if (deltax >= deltay){ // There is at least one x-value for every y-value
xinc1 = 0; // Don't change the x when numerator >= denominator
yinc2 = 0; // Don't change the y for every iteration
den = deltax;
num = deltax / 2;
numadd = deltay;
numpixels = deltax; // There are more x-values than y-values
}else{ // There is at least one y-value for every x-value
xinc2 = 0; // Don't change the x for every iteration
yinc1 = 0; // Don't change the y when numerator >= denominator
den = deltay;
num = deltay / 2;
numadd = deltax;
numpixels = deltay; // There are more y-values than x-values
}
for (curpixel = 0; curpixel <= numpixels; curpixel++){
pixelL(x, y, ON); // Draw the current pixel
num += numadd; // Increase the numerator by the top of the fraction
if (num >= den){ // Check if numerator >= denominator
num -= den; // Calculate the new numerator value
x += xinc1; // Change the x as appropriate
y += yinc1; // Change the y as appropriate
}
x += xinc2; // Change the x as appropriate
y += yinc2; // Change the y as appropriate
}
}
void rectangle(int startx, int starty, int endx, int endy){
line(endx,starty,endx,endy);
line(startx,starty,endx,starty);
line(startx,starty,startx,endy);
line(startx,endy,endx,endy);
}
void circle(int xCenter, int yCenter, int radius){
int x, y, r2;
r2 = radius * radius;
pixelL(xCenter, yCenter + radius, ON);
pixelL(xCenter, yCenter - radius, ON);
for (x = 1; x <= radius; x++) {
y = (int) (sqrt(r2 - x*x) + 0.5);
pixelL(xCenter + x, yCenter + y, ON);
pixelL(xCenter - x, yCenter + y, ON);
pixelL(xCenter + x, yCenter - y, ON);
pixelL(xCenter - x, yCenter - y, ON);
}
}
void main(void)
{
byte i, j, x, y;
init_devices();
lcd_init();
lcd_clear();
rectangle( 10, 10, 30,45);
while(1){
lcd_string(0,0," 그래픽 시간 ");
lcd_string(1,0," FUNNY DAY ");
lcd_string(2,0," GOOD DAY ");
lcd_string(3,0," BE HAPPY !!!");
delay_ms(1000);
lcd_clear();
rectangle( 10, 10, 30,45);
delay_ms(1000);
circle(30,20,15);
delay_ms(1000);
line(10,20,30,100);
delay_ms(1000);
rectangle( 20, 15, 50,110);
delay_ms(1000);
for(i=0; i<7; i++)
for(j=0; j<128; j++)
ch_keep[i][j]=0x00;
lcd_clear();
}
// write_cmd( CS1, 0xc0 ); /* 디스플레이 시작라인 */
/* y_0=0x40 , x_0=0xb8 */
// x = 0xB8; /* X start address */
// y = 0x40; /* Y start address */
/* for(i = 0; i <=7; i++)
{
write_cmd(CS1,x);
write_cmd(CS1,y);
for(j = 0; j < 64; j++) {
write_data(CS1,0x11); /* - - */
/* }
x++;
}
*/
관리자 답변
안녕하세요, 뉴티씨입니다. 문의 내용 확인하였습니다. 추가 문의사항은 newtc@newtc.co.kr 또는 02-704-4774로 연락 주시기 바랍니다. 감사합니다.
|
||||
| 694 | 답변완료[소스]kt-m128.GLCD를 이용한 빙고게임 | 안양박 | 2008-01-10 | 2,396 |
|
교육용보드인 kt-m128의 그래픽 lcd를 이용해 빙고게임을 만들어봤습니다.
지금은 j변수를 변경함으로써 몇번돌린후 멈추게 되어있습니다. 앞으로
uart 통신을 이용해서 점수계산등 여러가지 기능을 추가해 성인오락실의 과일나라
수준으로 만드는게 목표입니다. 자주 업데이터 하겠습니다..꾸벅..
//ICC-AVR application builder : 2008-01-07 오후 1:54:02
// Target : M128
// Crystal: 16.000Mhz
#include <iom128v.h>
#include <macros.h>
#define LCD_Control (* (volatile unsigned char *) 0x8001)
#define LCD_Data (* (volatile unsigned char *) 0x8000)
#define RS_ON LCD_Control = (LCD_Controller|=0x01)
#define RS_OFF LCD_Control = (LCD_Controller&=0xfe)
#define RW_ON LCD_Control = (LCD_Controller|=0x02)
#define RW_OFF LCD_Control = (LCD_Controller&=0xfd)
#define EN_ON LCD_Control = (LCD_Controller|=0x04)
#define EN_OFF LCD_Control = (LCD_Controller&=0xfb)
#define CS2_ON LCD_Control = (LCD_Controller|=0x10)
#define CS2_OFF LCD_Control = (LCD_Controller&=0xef)
#define CS1_ON LCD_Control= (LCD_Controller|=0x08)
#define CS1_OFF LCD_Control = (LCD_Controller&=0xf7)
#define RESET_ON LCD_Control= (LCD_Controller|=0x20)
#define RESET_OFF LCD_Control= (LCD_Controller&=0xdf)
#define CS_ALL LCD_Control= (LCD_Controller|=0x18)
#define ON 1
#define OFF 0
#define delaytime 1
#define delaytime1 2
char LCD_Controller;
const char x=0xb8, y=0x40;
int status=0 ;
char compare[8][128]={0x00,};
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
void uart1_init(void)
{
UCSR1B = 0x00; //disable while setting baud rate
UCSR1A = 0x00;
UCSR1C = 0x00;
UBRR1L = 0x67; //set baud rate lo
UBRR1H = 0x00; //set baud rate hi
UCSR1B = 0x90;
}
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
status++;
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
XDIV = 0x00; //xtal divider
XMCRA = 0x00; //external memory
port_init();
uart1_init();
MCUCR = 0x80;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void E_Pulse(void){
EN_ON;
delay(delaytime);
EN_OFF;
}
void BackLight(int onoff){
if(onoff==ON)
LCD_Control |= 0x40;
else
LCD_Control &= 0xbf;
}
void DisplayOnOff(int onoff){
RW_OFF;
RS_OFF;
if(onoff==ON){
DataInput(0x3F);
}else{
DataInput(0x3E);
}
}
void DataInput(char data){
RS_OFF;
RW_OFF;
LCD_Control = data;
E_Pulse();
}
void DisplayStartLine(int displayline){
DataInput(displayline | 0xc0);
}
void SetX(int X){
DataInput(X | 0xb8);
}
void SetY(int Y){
DataInput(Y | 0x40);
}
/*char Read_Status(void){
char status;
RW_ON;
RS_OFF;
status=(LCD_Control & 0xb0);
E_Pulse();
return(status);
}*/
void Reset(void){
DataInput(0x10);
}
void Init_Graph(void){
CS2_ON;
CS1_ON;
DisplayOnOff(ON);
Reset();
}
void delay(int cnt){
int i , j;
for(i=0; i<cnt; i++){
for(j=0; j<100; j++) ;
}
}
/*void Check_BF(void){
while(Read_Status()&0x80);
}*/
char Read_Data(void){
char data;
//Check_BF();
CS_ALL;
RS_ON;
RW_ON;
EN_ON;
delay(delaytime);
data = LCD_Data;
EN_OFF;
delay(delaytime);
return data;
}
void Write_Control(char CS, char cmd){
//Check_BF();
delay(delaytime);
EN_OFF;
delay(delaytime);
RS_OFF;
delay(delaytime);
RW_OFF;
delay(delaytime);
LCD_Control = CS;
delay(delaytime);
EN_ON;
delay(delaytime);
LCD_Data = cmd;
delay(delaytime);
EN_OFF;
delay(delaytime);
}
/*char getchar(){
return tmp;
}*/
int putchar(data){
Write_Data(CS_ALL, data);
}
void Write_Data(char CS, char data){
//Check_BF();
delay(delaytime);
EN_OFF;
delay(delaytime);
RS_ON;
delay(delaytime);
RW_OFF;
delay(delaytime);
LCD_Control = CS;
delay(delaytime);
EN_ON;
delay(delaytime);
LCD_Data = data;
delay(delaytime);
EN_OFF;
delay(delaytime);
}
void Lcd_Clear(){
int i, j, x, y;
LCD_Control = 0x00;
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
x=0xb8;
y=0x40;
for(i=0; i<=7; i++){
Write_Control(CS_ALL, x);
Write_Control(CS_ALL, y);
for(j=0; j<64; j++){
Write_Data(CS_ALL, 0x00);}
x++;
}
}
void Lcd_init(){
RESET_OFF;
RESET_ON;
CS_ALL;
Write_Control(CS_ALL, 0x3f);
Write_Control(CS_ALL, 0xc0);
Write_Control(CS_ALL, 0xb8);
Write_Control(CS_ALL, 0x40);
}
void gotoxy(int i, int j, char data){
int x1=i%128, y1=j%8;
if(x1<64){
Write_Control(CS_ALL, x+y1);
Write_Control(CS_ALL, y+x1);
Write_Data(CS2_OFF, data);
} else {
Write_Control(CS_ALL, x+y1);
Write_Control(CS_ALL, y+x1-64);
Write_Data(CS1_OFF, data);
}
}
void PointXY(int xpoint, int ypoint){
int point=0x01, value;
int x1, y1, y2, y3;
x1=xpoint%128;
y1=ypoint%64;
y2=y1/8;
y3=y1%8;
compare[y2][x1]|=(point<<y3);
value=compare[y2][x1];
if(x1<64){
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1);
Write_Data(CS2_OFF, value);} else {
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1-64);
Write_Data(CS1_OFF, value);}
}
void Point_Del(int xpoint, int ypoint){
int point=0x01, value;
int x1, y1, y2, y3;
x1=xpoint%128;
y1=ypoint%64;
y2=y1/8;
y3=y1%8;
compare[y2][x1]&=(~(point<<y3));
value=compare[y2][x1];
if(x1<64){
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1);
Write_Data(CS2_OFF, value);} else {
Write_Control(CS_ALL, x+y2);
Write_Control(CS_ALL, y+x1-64);
Write_Data(CS1_OFF, value);}
}
void Draw_Line(int X0, int Y0, int X1, int Y1){
int x0=X0, y0=Y0, x1=X1, y1=Y1;
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
if (dy < 0) {
dy = -dy;
stepy = -1;
} else {
stepy = 1;
}
if (dx < 0) {
dx = -dx;
stepx = -1;
} else {
stepx = 1;
}
dy <<= 1;
dx <<= 1;
PointXY(x0, y0);
if (dx > dy) {
int fraction = dy - (dx >> 1);
while (x0 != x1) {
if (fraction >= 0) {
y0 += stepy;
fraction -= dx;
}
x0 += stepx;
fraction += dy;
PointXY(x0, y0);
}
} else {
int fraction = dx - (dy >> 1);
while (y0 != y1) {
if (fraction >= 0) {
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
PointXY(x0, y0);
}
}
}
void Line_Del(int X0, int Y0, int X1, int Y1){
int x0=X0, y0=Y0, x1=X1, y1=Y1;
int dy = y1 - y0;
int dx = x1 - x0;
int stepx, stepy;
if (dy < 0) {
dy = -dy;
stepy = -1;
} else {
stepy = 1;
}
if (dx < 0) {
dx = -dx;
stepx = -1;
} else {
stepx = 1;
}
dy <<= 1;
dx <<= 1;
Point_Del(x0, y0);
if (dx > dy) {
int fraction = dy - (dx >> 1);
while (x0 != x1) {
if (fraction >= 0) {
y0 += stepy;
fraction -= dx;
}
x0 += stepx;
fraction += dy;
Point_Del(x0, y0);
}
} else {
int fraction = dx - (dy >> 1);
while (y0 != y1) {
if (fraction >= 0) {
x0 += stepx;
fraction -= dy;
}
y0 += stepy;
fraction += dx;
Point_Del(x0, y0);
}
}
}
void Draw_Rect(int x1, int y1, int x2, int y2, int fill){
if(fill==1){
if(x1<x2){
for(x1; x1<=x2; x1++){
Draw_Line(x1,y1,x1,y2);}
} else {
for(x1; x1>=x2; x1--){
Draw_Line(x1,y1,x1,y2);}
}} else { Draw_Line(x1,y1,x1,y2);
Draw_Line(x1,y1,x2,y1);
Draw_Line(x2,y2,x2,y1);
Draw_Line(x2,y2,x1,y2);
}
}
void Rect_Del(int x1, int y1, int x2, int y2){
if(x1<x2){
for(x1; x1<=x2; x1++){
Line_Del(x1,y1,x1,y2);}
} else {
for(x1; x1>=x2; x1--){
Line_Del(x1,y1,x1,y2);}
}
}
void Draw_Circle(int x1, int y1, int radius, int fill){
int a, r, cond;
a = 0;
r = radius;
cond = 1 - r;
do{
if(fill==1){
Draw_Line(x1-a, y1+r, x1+a, y1+r);
Draw_Line(x1-a, y1-r, x1+a, y1-r);
Draw_Line(x1-r, y1+a, x1+r, y1+a);
Draw_Line(x1-r, y1-a, x1+r, y1-a);
} else {
PointXY(a+x1, r+y1);
PointXY(r+x1, a+y1);
PointXY(x1-a, r+y1);
PointXY(x1-r, a+y1);
PointXY(x1+r, y1-a);
PointXY(x1+a, y1-r);
PointXY(x1-a, y1-r);
PointXY(x1-r, y1-a);
}
if(cond < 0){
cond += 3 + 2*a++;
} else {cond+= 5 + 2*(a++ - r--);}
}while(a <= r);
}
void Circle_Del(int x1, int y1, int radius){
int a, r, cond;
a = 0;
r = radius;
cond = 1 - r;
do{
Line_Del(x1-a, y1+r, x1+a, y1+r);
Line_Del(x1-a, y1-r, x1+a, y1-r);
Line_Del(x1-r, y1+a, x1+r, y1+a);
Line_Del(x1-r, y1-a, x1+r, y1-a);
if(cond < 0){
cond += 3 + 2*a++;
} else {cond+= 5 + 2*(a++ - r--);}
}while(a <= r);
}
void main(void)
{
int i, j, k, on=1, off=0;
char temp;
int arr[17][4]={{13,3,29,19},{55,24,71,40},{98,45,114,61},
{55,3,71,19},{98,3,114,19},{13,24,29,40},{98,24,114,40},
{13,45,29,61},{55,45,71,61},{55,24,71,40},{13,3,29,19},
{55,24,71,40},{98,45,114,61},{55,3,71,19},{98,3,114,19},
{13,24,29,40},{98,24,114,40}};
int arr1[15][2]={{21,11},{21,32},{21,53},{63,11},{63,32},{63,53},
{106,11},{106,32},{106,53},{21,11},{21,53},{63,11},{63,53},
{106,11},{106,53}};
init_devices();
Lcd_init();
Lcd_Clear();
Draw_Line(1,0,126,0);
Draw_Line(1,21,126,21);
Draw_Line(1,42,126,42);
Draw_Line(1,63,126,63);
Draw_Line(0,0,0,63);
Draw_Line(42,0,42,63);
Draw_Line(84,0,84,63);
Draw_Line(127,0,127,63);
Draw_Circle(106,32,8,off);
Draw_Circle(106,53,8,on);
Draw_Rect(55,4,71,18,on);
Draw_Rect(55,46,71,60,off);
Draw_Rect(98,4,114,18,off);
Draw_Circle(63,32,8,off);
Draw_Rect(55,24,71,40,off);
Draw_Circle(21,11,8,off);
Draw_Circle(21,32,8,on);
Draw_Rect(13,46,29,60,on);
while(1){
for(j=0;j<100;j++){
i=j%12;
k=j%10;
Draw_Line(arr[i][0],arr[i][1],arr[i][2],arr[i][3]);
Draw_Line(arr[i][0],arr[i][3],arr[i][2],arr[i][1]);
Draw_Rect(arr[k][0],arr[k][1],arr[k][2],arr[k][3],1);
Draw_Circle(arr1[k][0],arr1[k][1],8,on);
Circle_Del(arr1[k+3][0],arr1[k+3][1],8);
Line_Del(arr[i+3][0],arr[i+3][1],arr[i+3][2],arr[i+3][3]);
Line_Del(arr[i+1][0],arr[i+1][3],arr[i+1][2],arr[i+1][1]);
Draw_Rect(arr[k+3][0],arr[k+3][1],arr[k+3][2],arr[k+3][3],1);
Draw_Circle(arr1[i][0],arr1[i][1],8,on);
Rect_Del(arr[k+5][0],arr[k+5][1],arr[k+5][2],arr[k+5][3]);
Rect_Del(arr[k+3][0],arr[k+3][1],arr[k+3][2],arr[k+3][3]);
Circle_Del(arr1[i+2][0],arr1[i+2][1],8);
}
}
}
관리자 답변
안녕하세요, 뉴티씨입니다. 문의 내용 확인하였습니다. 추가 문의사항은 newtc@newtc.co.kr 또는 02-704-4774로 연락 주시기 바랍니다. 감사합니다.
|
||||
