Q&A
| 번호 | 제목 | 작성자 | 등록일 | 조회 |
|---|---|---|---|---|
| 1098 | 답변완료스피커에 대한 질문입니다 | 오창화 | 2008-05-26 | 1,502 |
|
+,- 만 있는 스피커를 구입해서ATmega128Pro 킷트와 연결하여 소리를 내고 싶은데 +.-를 어떻게 연결을 해야하는지 모르겠습니다,그리고 +,-만 있는 스피커로도 ATmega128Pro 킷트에 연결해서 사용할 수 있는지 궁금합니다. 자세하게 가르쳐 주세요
관리자 답변
안녕하세요? 고객님,
저희 N.T.C를 이용해 주셔서 감사합니다.
스피커가 소리를 내는 원리는 판이 떨리는 것입니다.
그 떨리는 주파수에 따라 다른 소리가 나게 됩니다.
따라서, 타이머 등으로 주파수를 만들어서 떨게 만들어 주면 되겠지요?
예제가 아래에 있구요.
더 많은 예제가 자료실->기존자료실에 있으니, 사운드 관련 예제를 참고하세요.
- 아래 -
http://www.newtc.co.kr/board/view.php?id=pds&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=224
감사합니다.
>+,- 만 있는 스피커를 구입해서ATmega128Pro 킷트와 연결하여 소리를 내고 싶은데 +.-를 어떻게 연결을 해야하는지 모르겠습니다,그리고 +,-만 있는 스피커로도 ATmega128Pro 킷트에 연결해서 사용할 수 있는지 궁금합니다. 자세하게 가르쳐 주세요
|
||||
| 1097 | 답변완료후방감지기 | 정현성 | 2008-05-26 | 1,559 |
|
오늘 소스 올려주신다고 했는데 아직 안 올라와 있어서 확인차 글 남깁니다
관리자 답변
안녕하세요? 고객님,
약속드린 소스를 올려드립니다.
감사합니다.
>오늘 소스 올려주신다고 했는데 아직 안 올라와 있어서 확인차 글 남깁니다
|
||||
| 1096 | 답변완료USBISP 문의 | 정순길 | 2008-05-26 | 1,569 |
|
Fujitsu MB90F342AS 제품에 사용 가능한지 알려주시기 바랍니다
만약 USBISP가 범용제품이 아니라면 USB-UART 제품은 범용인지 확인 바랍니다.
관리자 답변
안녕하세요? 고객님,
저희 USBISP는 AVR을 위한 usb 방식의 프로그래머입니다.
따라서, 후지쯔 16LX 계열의 mcu에서는 사용하실수 없습니다.
하지만, usbuart 제품은 사용이 가능하겠네요.
저두 usbuart를 사용하여, 시리얼로 8fx 계열을 다운로드 하고 있습니다.
감사합니다.
>Fujitsu MB90F342AS 제품에 사용 가능한지 알려주시기 바랍니다
>
>만약 USBISP가 범용제품이 아니라면 USB-UART 제품은 범용인지 확인 바랍니다.
|
||||
| 1095 | 답변완료RC서보모터와 서보모터랑 다른가요?? | 권혁민 | 2008-05-26 | 1,522 |
|
두가지가 서로 다른건가요??
서보모터에 관한 예제를 실행시키면 움직임이 좀 ......
예제소스의 main에 내의 while문속의 if문이 이해가 안 됩니다.
관리자 답변
안녕하세요? 고객님,
RC 서보모터도 서보 모터의 종류중 하나입니다.
RC 서보모터 들이 서보모터 회사마다 조금씩 달라서, 소스를 조금씩 수정하셔야 합니다.
PWM 타이밍을 서보회사마다 서로 다르게 가져가서, 모든 서보에 맞게 프로그램을 짜 올려 드리기는 어렵습니다.
따라서, 서보의 특성을 파악하시기 위하여 약간씩 타이밍을 바꿔 보셔야 합니다.
MAIN문내의 WHILE문 속의 IF 문이라는 것이 어떤 소스를 말씀하시는 것인지 구체적으로 올려 주셔야 답변이 가능할 것 같습니다.
감사합니다.
>두가지가 서로 다른건가요??
>
>서보모터에 관한 예제를 실행시키면 움직임이 좀 ......
>
>예제소스의 main에 내의 while문속의 if문이 이해가 안 됩니다.
|
||||
| 1094 | 답변완료AVR 보드 과열문제 | 조현경 | 2008-05-26 | 1,515 |
|
AB-M128-B 보드에서 과열문제가 발생했습니다
소스코딩 다 하고 AVR에 집어넣은 후 구현까지 문제없었는데
몇번 한 후 하룻밤 지나고 난 뒤 보드에 전원을 공급하기만 하면
1~2초 뒤에 Atmega에서 열이 발생합니다. 제대로 작동도 안되구요
전화로 문의했더니 Q&A에 올리라고 하셔서 여기다 글 남깁니다
관리자 답변
안녕하세요? 고객님,
저희 N.T.C 제품을 이용하여 주셔서 감사드립니다.
당황하지 마시구요.
쓰시던 보드와 나머지 환경을 그대로 저희 회사로 가져와 보시는 것이 좋겠습니다.
외부 확장 보드 쪽의 문제일 수도 있으니, 가져 오시면, 어떻게 바꾸시라고 조언이 가능할 것 같네요.
A/S 처리 하셔야 할 것 같구요. FAQ에 있는 저희 회사 A/S 규정에 의해 처리됩니다.
감사합니다.
>AB-M128-B 보드에서 과열문제가 발생했습니다
>
>소스코딩 다 하고 AVR에 집어넣은 후 구현까지 문제없었는데
>
>몇번 한 후 하룻밤 지나고 난 뒤 보드에 전원을 공급하기만 하면
>
>1~2초 뒤에 Atmega에서 열이 발생합니다. 제대로 작동도 안되구요
>
>전화로 문의했더니 Q&A에 올리라고 하셔서 여기다 글 남깁니다
|
||||
| 1093 | 답변완료스테핑모터 구동드라이버 질문입니다. | 윤건호 | 2008-05-26 | 1,592 |
|
스테핑 모터 클럭 구동모듈
AM-MS2(3A용)
이거에 SE-SM9 모터를 2개달아서 사용할예정인데
아답타를 3A짜리를 써야하는지 6A 짜리를 써야하는지 문의드립니다.
그리고 모듈의 MCU와 연결하는 커넥터단자의 GND와
모듈의 12V전원이 들어가는단자의 GND가 연결이 되어있어
2개의 GND를 넣으면 커넥터 옆 드라이버 부분에 열이 어마어마하게 많이 발생합니다.
그래서 커넥터단자의 GND를 빼고 사용하였는데도 맨위의 저항이 엄청나게 뜨거워집니다.
원래 이런건가요? 왜 메뉴얼에는 이런설명이 하나도 안되어있죠?
아니면 제 스텝모터드라이버만 불량인건가요?
관리자 답변
안녕하세요? 고객님,
저희 N.T.C 제품을 이용하여 주셔서 감사드립니다.
저희 MS2에 사용된 모듈은 원래 풀토크 사용시에 방열판을 달아서, 사용하여야 합니다. 열이 많이 날 수 있기 때문이지요. 만들어진 목적이 교육용/개발용으로 만들어진 모듈이라 최대 토크시에 발생할 수 있는 열에 대비한 방열판은 별도로 부착하여 쓰셔야 합니다. 대부분은 최대 토크까지는 쓰지 않고, 저렴하게 구매하여 사용하실 수 있도록 하기 위하여 그렇게 만들어져 있습니다.
현재, 산업용으로 쓰실 수 있도록, 사용 편리성을 위한 입출력 관계 및 전류량 등의 여러가지 부분을 고려하여 제작하려고 준비하고 있으니, 가격은 좀 올라가겠지만, 더 나은 제품을 조만간에 만나실 수 있을 겁니다. 하지만, 합리적인 가격으로 제공해 드릴 것을 약속드립니다.
또한, 사용되는 전류를 예측 가능하시면, 그 만큼에 맞게 아답타를 쓰시면 되겠지만, 예측이 어려우시다면, 최대 각 포트당 24V 3A씩이므로 6A짜리를 쓰시는 것이 좋겠구요. 여유있게 효율성 등을 생각한 마진을 고려하여 8A 24V를 쓰시는 것이 이상적이겠습니다.
하지만, 그럴 경우 전원부 가격이 많이 올라가게 되므로, 가능하다면, 사용되는 토크량에 따른 전류량을 예측하여 사용하는 것이 좋겠습니다.
계속 열이 많이 나신다면, 직접 가져 오시면 테스트해봐 드릴 수도 있구요.
직접 봐야 어떻게 하시는 것이 좋겠다고 좀더 나은 조언을 해드릴 수도 있을 것 같네요.
감사합니다.
>스테핑 모터 클럭 구동모듈
>AM-MS2(3A용)
>
>이거에 SE-SM9 모터를 2개달아서 사용할예정인데
>
>아답타를 3A짜리를 써야하는지 6A 짜리를 써야하는지 문의드립니다.
>
>그리고 모듈의 MCU와 연결하는 커넥터단자의 GND와
>
>모듈의 12V전원이 들어가는단자의 GND가 연결이 되어있어
>
>2개의 GND를 넣으면 커넥터 옆 드라이버 부분에 열이 어마어마하게 많이 발생합니다.
>
>그래서 커넥터단자의 GND를 빼고 사용하였는데도 맨위의 저항이 엄청나게 뜨거워집니다.
>
>원래 이런건가요? 왜 메뉴얼에는 이런설명이 하나도 안되어있죠?
>
>아니면 제 스텝모터드라이버만 불량인건가요?
|
||||
| 1092 | 답변완료SE-SM9 모터에 맞는 바퀴는 없나요?? | 윤건호 | 2008-05-26 | 1,559 |
|
모터 축이 두꺼운데 거기에 맞는 바퀴가 있는지좀 알려주세요.
관리자 답변
안녕하세요? 고객님,
저희 N.T.C. 제품을 이용하여 주셔서 감사드립니다.
간혹 같은 질문을 하시는 고객님들이 있습니다.
헌데, 예전에 그런 제품이 있었는 데요. 지금은 없어졌습니다.
현재 구하기가 어려우실 겁니다.
조만간에 저희도 거기에 맞는 바퀴 생산을 고려 중입니다.
감사합니다.
>모터 축이 두꺼운데 거기에 맞는 바퀴가 있는지좀 알려주세요.
|
||||
| 1091 | 답변완료센서 입력 방법과 usbisp에 대해서 질문이 있습니다. | 윤동현 | 2008-05-26 | 1,534 |
|
안녕하세요^^
AVR에 대해 몇가지 물어볼 것이 있어서 이렇게 글을 씁니다.
지금 AVR로 작품을 만들려고 시도 중인데..
제가 완전 초보라서 그리 쉽지 않네요.
그래도 그럴저럭 NTC 홈피와 친구의 도움으로 잘 하고 있는데..
막막하게 절 막히게 하는 것이 있으서 이렇게 질문을 합니다.
위 첨부한 코드가 제가 만들어 볼까 생각중인 작품인데요.
거리센서나 스위치로 입력이 들어오면 서보모터가 들어온 입력값에 의해서
제가 원하는 각도로 움직이는 프로그램을 만들려 합니다.
if((KEY_IN_SENSOR & 0x10) && (DTstatus == ON)) { //거리센서를 통해 입력이 먼저 들어올 경우
KEY_IN_SW_DIR = 0xff;
motor_move(5,7);//두번째 뚜껑이 올라감.
DTstatus = OFF;
sensor = ON;
} else if((KEY_IN_SENSOR & 0x10) && (DTstatus == OFF)) {
}else{
if(sensor == ON) {
motor_move(5,15);
motor_move(2,23);
motor_init();
KEY_IN_SW_DIR = 0x00;
sensor = OFF;
}
DTstatus =ON;
}
문제는 여기서 부터 막힌다는 건데..
usbisp를 이용하여 프로그램을 AVR에 로팅하고
KEY_IN_SENSOR에 sensor를 이용하여 입력을 주면, 제가 원하는 대로 움직입니다.
그런데 여기서 usbisp를 AVR에서 빼고 작동시키는 모터가 자기 맘대로 움직입니다.
다시 usbisp를 꽂고 작동시키면 모터는 제가 원하는 대로 움직이구요..
과연 무엇이 문제인지 모르겠습니다. AVR에 잘못된건지 아님 보드가 잘못된건지, 아님 USBISP가 잘못된 건지, 제가 짠 코드가 완전 잘못된 것인지 전혀 모르겠습니다.
위와 같이 코드를 짜면 안되는 건지?
물어볼 수 있는 곳이 여기 뿐이라서 이렇게 간절히 물어봅니다.
관리자 답변
안녕하세요? 고객님,
간혹 고객님과 같은 문의를 하시는 분들이 있습니다.
답은 접지를 제대로 하시면 문제 없이 동작 할겁니다.
무슨 말이냐면요.
Safety ground라는 것이 있습니다. 안전을 위한 그라운드를 말하는 건데요.
220V 전압 공급되는 벽에 있는 커넥터를 보면, 220V용 동그란 구멍 두개 외에도 옆에 약간 누런색의 접지가 튀어나와 있습니다. 그게 SAFETY GROUND라는 것인데요. 거기에 메인보드의 GND를 연결하시면 됩니다.
또한, PC에 공급되는 전원도 마찬가지로 접지용 멀티탭을 사용하여 주시는 것이 좋겠습니다. 대부분의 PC에서는 이상이 없지만, 공장지대 근처이거나, 주변에 모터를 돌리는 곳이 있다거나, 노이즈 원인이 많은 곳에서 산다거나 할경우 그런 일이 있을 수 있습니다. 반드시 접지용 멀티탭을 사용하셔서, 안전하게 PC도 보호하시고, 장비도 이상 없이 쓰시기 바랍니다. 계속 그렇게 하지 않고 작업할 경우, 장비도 망가질 수 있을 것 같습니다. 반드시, 보호용으로 접지를 하시고 사용하시기 바랍니다.
감사합니다.
>안녕하세요^^
>AVR에 대해 몇가지 물어볼 것이 있어서 이렇게 글을 씁니다.
>
>지금 AVR로 작품을 만들려고 시도 중인데..
>제가 완전 초보라서 그리 쉽지 않네요.
>그래도 그럴저럭 NTC 홈피와 친구의 도움으로 잘 하고 있는데..
>막막하게 절 막히게 하는 것이 있으서 이렇게 질문을 합니다.
>
>위 첨부한 코드가 제가 만들어 볼까 생각중인 작품인데요.
>
>거리센서나 스위치로 입력이 들어오면 서보모터가 들어온 입력값에 의해서
>제가 원하는 각도로 움직이는 프로그램을 만들려 합니다.
>
> if((KEY_IN_SENSOR & 0x10) && (DTstatus == ON)) { //거리센서를 통해 입력이 먼저 들어올 경우
> KEY_IN_SW_DIR = 0xff;
> motor_move(5,7);//두번째 뚜껑이 올라감.
> DTstatus = OFF;
> sensor = ON;
> } else if((KEY_IN_SENSOR & 0x10) && (DTstatus == OFF)) {
> }else{
> if(sensor == ON) {
> motor_move(5,15);
> motor_move(2,23);
> motor_init();
> KEY_IN_SW_DIR = 0x00;
> sensor = OFF;
> }
> DTstatus =ON;
> }
>
>문제는 여기서 부터 막힌다는 건데..
>usbisp를 이용하여 프로그램을 AVR에 로팅하고
>KEY_IN_SENSOR에 sensor를 이용하여 입력을 주면, 제가 원하는 대로 움직입니다.
>
>그런데 여기서 usbisp를 AVR에서 빼고 작동시키는 모터가 자기 맘대로 움직입니다.
>다시 usbisp를 꽂고 작동시키면 모터는 제가 원하는 대로 움직이구요..
>
>과연 무엇이 문제인지 모르겠습니다. AVR에 잘못된건지 아님 보드가 잘못된건지, 아님 USBISP가 잘못된 건지, 제가 짠 코드가 완전 잘못된 것인지 전혀 모르겠습니다.
>
>위와 같이 코드를 짜면 안되는 건지?
>물어볼 수 있는 곳이 여기 뿐이라서 이렇게 간절히 물어봅니다.
|
||||
| 1090 | 답변완료오랜만에 질문이요^^ | 김규범 | 2008-05-25 | 1,471 |
|
다른프로젝트 때문에.... ADC쪽을 못하다가 지금에서야 잡게 되었습니다.
하는 도중에 궁금점이 있어서 이렇게 왔습니다.
//ICC-AVR application builder : 2005-05-23 오후 8:41:55
// Target : M128
// Crystal: 16Mhz
#include <iom128v.h>
#include <macros.h>
void port_init(void)
{
PORTA = 0xff;
DDRA = 0xff;
PORTB = 0xff;
DDRB = 0xff;
PORTC = 0xff; //m103 output only
DDRC = 0x00;
PORTD = 0xff;
DDRD = 0x00;
PORTE = 0xff;
DDRE = 0x00;
PORTF = 0xff;
DDRF = 0x00;
PORTG = 0x1f;
DDRG = 0x03;
}
//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 = 0x08;
}
//ADC initialize
// Conversion time: 75uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0xc7; //select adc input 7
ACSR = 0x80;
ADCSRA = 0xe7;
}
//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();
adc_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
}
// 입력으로 들어오는 채널의 ADC를 스타트 시킨다.
void startConvertion(unsigned int ch)
{
ADCSRA = ADCSRA & 0x3f;
//if( ADMUX == 0xc0) ADMUX = 0xc7;
//else ADMUX = 0xc0;
ADMUX = 0xc0;
ADCSRA = ADCSRA | 0xe0;
}
// startConvertion() 후에 수행되며 컨터팅 된 값을 리턴한다.
int readConvertData(void)
{
int value = 0x0000;
value = (ADCL)&0x00ff;
value |= (ADCH << 8);
value &= 0x03ff;
//delay(25);
return value;
}
void delay(int n)
{
volatile int i,j;
for(i=1;i<n;i++)
{
for(j=1;j<600;j++);
}
}
void main(void)
{
volatile unsigned int i;
unsigned int value1, value2;
unsigned char a;
a='<';
init_devices();
//insert your functional code here...
//printf(" \\n\\n\\rADC test program...\\n\\r");
PORTG = 0x0f;
PORTA = 0x01;
delay(1000);
PORTA = 0xff;
PORTG = 0xff;
PORTF = 0x00;
while(1){
startConvertion(0); // Left sensor Converting
value1 = readConvertData();
delay(25);
startConvertion(7); // Left sensor Converting
value2 = readConvertData();
printf("%d%c%d",value1,a,value2);
printf("\\n");
}
}
제가 원하는 체널 2개에서 오는 넘을 체크하는건 맞는거 같습니다..
그런데 원하는건 1초에 천번샘플링되게 하려고 저번에 물어봤었는데..
타이머를 쓰셔서, 1ms 간격마다 한번씩 ADC 하도록 하면 될 것 같네요.
이렇게 답변을 받았는데...
강좌부분에 타이머 쓰는 게 있더라구요....그래서 하려고하니까 거기선 20us로 설정해놨던데....
// 20us 타이머와 10ms 타이머용 변수를 만든다
int twenty_ustimer,Half_sectimer;
//TIMER0 initialize - prescale:1
// WGM: Normal
// desired value: 20uSec
// actual value: 19.984uSec (0.1%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x23; //set count
OCR0 = 0xDD;
TCCR0 = 0x01; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
twenty_ustimer++; // 20us마다 timer0 오버플로우 걸리면 20us 타이머를 하나씩 증가시킨다.
if(twenty_ustimer>=25000){ //20us 타이머가 25000보다 크면 즉,0.5초마다 1초 타이머를 하나씩 증가시킨다.
if(Half_sectimer==SETOK)
Half_sectimer = SETCANCLE;
else
Half_sectimer = SETOK;
twenty_ustimer=0; // 20us 타이머 0으로 초기화
}
TCNT0 = 0x23; //reload counter value 이 값은 실제 오실로 스코프로 찍어서, 정확한 값을 결정한다.
//이유: 실제로는 이 값대로 되어야 하나, 인터럽트 함수에서 많은 라인들로 인하여 값이 느려진다.
}
어느쪽에 20이라고 설정해줬는지 궁금합니다..
그리고 1초로 하려면 어느부분을 바꿔줘야 하나요?????
또한 강좌부분에 보니까 printf문을 같이 사용할수 없다고 하던데....
자세히쫌 가르쳐주셨으면 하네요....
관리자 답변
안녕하세요? 고객님,
timer0_init() 쪽에서 레지스터 들을 변화 시킴으로써 시간을 변경하게 됩니다.
그 중에서 TCNT0 값을 타이머 0 오버플로우가 날 때마다 다시 그 값으로 바꿔 줌으로써 다시 카운팅을 시작하게 됩니다.
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0x23;
}
AVR 기본강좌 : http://www.NewTC.co.kr/강좌/AVR기본강좌.zip
avr 기본강좌->타이머편을 참고하시기 바랍니다.
감사합니다.
//TIMER0 initialize - prescale:1
// WGM: Normal
// desired value: 20uSec
// actual value: 19.984uSec (0.1%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x23; //set count
OCR0 = 0xDD;
TCCR0 = 0x01; //start timer
}
>다른프로젝트 때문에.... ADC쪽을 못하다가 지금에서야 잡게 되었습니다.
>
>하는 도중에 궁금점이 있어서 이렇게 왔습니다.
>
>
>
>//ICC-AVR application builder : 2005-05-23 오후 8:41:55
>// Target : M128
>// Crystal: 16Mhz
>
>#include <iom128v.h>
>#include <macros.h>
>
>
>void port_init(void)
>{
> PORTA = 0xff;
> DDRA = 0xff;
> PORTB = 0xff;
> DDRB = 0xff;
> PORTC = 0xff; //m103 output only
> DDRC = 0x00;
> PORTD = 0xff;
> DDRD = 0x00;
> PORTE = 0xff;
> DDRE = 0x00;
> PORTF = 0xff;
> DDRF = 0x00;
> PORTG = 0x1f;
> DDRG = 0x03;
>}
>
>//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 = 0x08;
>}
>
>//ADC initialize
>// Conversion time: 75uS
>void adc_init(void)
>{
> ADCSRA = 0x00; //disable adc
> ADMUX = 0xc7; //select adc input 7
> ACSR = 0x80;
> ADCSRA = 0xe7;
>}
>
>//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();
> adc_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
>}
>
>// 입력으로 들어오는 채널의 ADC를 스타트 시킨다.
>void startConvertion(unsigned int ch)
>{
> ADCSRA = ADCSRA & 0x3f;
> //if( ADMUX == 0xc0) ADMUX = 0xc7;
> //else ADMUX = 0xc0;
> ADMUX = 0xc0;
> ADCSRA = ADCSRA | 0xe0;
>}
>
>// startConvertion() 후에 수행되며 컨터팅 된 값을 리턴한다.
>int readConvertData(void)
>{
> int value = 0x0000;
>
> value = (ADCL)&0x00ff;
> value |= (ADCH << 8);
> value &= 0x03ff;
> //delay(25);
> return value;
>}
>
>void delay(int n)
>{
> volatile int i,j;
> for(i=1;i<n;i++)
> {
> for(j=1;j<600;j++);
> }
>}
>
>void main(void)
>{
> volatile unsigned int i;
> unsigned int value1, value2;
> unsigned char a;
> a='<';
>
> init_devices();
> //insert your functional code here...
> //printf(" \\n\\n\\rADC test program...\\n\\r");
> PORTG = 0x0f;
> PORTA = 0x01;
> delay(1000);
> PORTA = 0xff;
> PORTG = 0xff;
> PORTF = 0x00;
> while(1){
>
> startConvertion(0); // Left sensor Converting
> value1 = readConvertData();
>
> delay(25);
> startConvertion(7); // Left sensor Converting
> value2 = readConvertData();
>
>
>
> printf("%d%c%d",value1,a,value2);
> printf("\\n");
>
> }
>}
>
>제가 원하는 체널 2개에서 오는 넘을 체크하는건 맞는거 같습니다..
>
>그런데 원하는건 1초에 천번샘플링되게 하려고 저번에 물어봤었는데..
>
>타이머를 쓰셔서, 1ms 간격마다 한번씩 ADC 하도록 하면 될 것 같네요.
>
>이렇게 답변을 받았는데...
>
>강좌부분에 타이머 쓰는 게 있더라구요....그래서 하려고하니까 거기선 20us로 설정해놨던데....
>
>// 20us 타이머와 10ms 타이머용 변수를 만든다
>int twenty_ustimer,Half_sectimer;
>
>//TIMER0 initialize - prescale:1
>// WGM: Normal
>// desired value: 20uSec
>// actual value: 19.984uSec (0.1%)
>void timer0_init(void)
>{
> TCCR0 = 0x00; //stop
> ASSR = 0x00; //set async mode
> TCNT0 = 0x23; //set count
> OCR0 = 0xDD;
> TCCR0 = 0x01; //start timer
>}
>
>#pragma interrupt_handler timer0_ovf_isr:17
>void timer0_ovf_isr(void)
>{
> twenty_ustimer++; // 20us마다 timer0 오버플로우 걸리면 20us 타이머를 하나씩 증가시킨다.
> if(twenty_ustimer>=25000){ //20us 타이머가 25000보다 크면 즉,0.5초마다 1초 타이머를 하나씩 증가시킨다.
> if(Half_sectimer==SETOK)
> Half_sectimer = SETCANCLE;
> else
> Half_sectimer = SETOK;
> twenty_ustimer=0; // 20us 타이머 0으로 초기화
> }
>
> TCNT0 = 0x23; //reload counter value 이 값은 실제 오실로 스코프로 찍어서, 정확한 값을 결정한다.
> //이유: 실제로는 이 값대로 되어야 하나, 인터럽트 함수에서 많은 라인들로 인하여 값이 느려진다.
>}
>
>
>어느쪽에 20이라고 설정해줬는지 궁금합니다..
>
>그리고 1초로 하려면 어느부분을 바꿔줘야 하나요?????
>
>또한 강좌부분에 보니까 printf문을 같이 사용할수 없다고 하던데....
>
>자세히쫌 가르쳐주셨으면 하네요....
|
||||
| 1089 | 답변완료am-cs2p 모듈 질문 | 박준석 | 2008-05-25 | 1,508 |
|
또 글 남기네요...
모듈에 왼쪽 바퀴 부분이 이상합니다...
오른쪽 모터입력부분에는 오실로스코프로 찍었을때 a,a',b,b' 파형이 나오는데요....
왼쪽 바퀴부분에는 b, b' 는 파형이 나오는데요....a,a' 는 파형이 안나오네요...
오른쪽 바퀴는 돌아가는데....왼쪽 바퀴는 소리만 나고 버벅거립니다...
관리자 답변
안녕하세요? 고객님,
저희 N.T.C는 고객님의 질문을 빠른 시간 안에 잘 처리해 드리기 위하여 늘 노력하고 있습니다. 언제든 질문 있으시면 남겨 주시면, 최선을 다하여 처리해 드리겠습니다.
모터구동 모듈에 들어가는 전원이 몇 볼트 인지가 궁금합니다.
모터 구동부에 공급되는 전류가 딸리다 보니 생긴 증상은 아닐까요?
아답타를 몇 암페어 몇볼트를 쓰셨는 지 확인해 보시기 바랍니다.
가능한 최대 토크를 내시려면 양쪽 구동시 24V, 8A 정도 짜리를 쓰시는 것이 좋겠습니다. 한 쪽 당 풀토크시 3A까지 사용될 수 있고, 효율도 생각해야 하니까요.
감사합니다.
>또 글 남기네요...
>
>모듈에 왼쪽 바퀴 부분이 이상합니다...
>오른쪽 모터입력부분에는 오실로스코프로 찍었을때 a,a',b,b' 파형이 나오는데요....
>왼쪽 바퀴부분에는 b, b' 는 파형이 나오는데요....a,a' 는 파형이 안나오네요...
>오른쪽 바퀴는 돌아가는데....왼쪽 바퀴는 소리만 나고 버벅거립니다...
|
||||
| 1088 | 답변완료128PRO칩으로 동시 동작시킬수 있는 LED개수에대해 | 박수익 | 2008-05-25 | 1,700 |
|
kd128pro 에 연결시켜 킬수 있는 최대 LED개수가 어떻게 되나요? 5파이짜리
고휘도 LED 36개정도 킬려고 하는데 버틸 수있을까요?
그리고 포트에서 출력되는 전압과 전류랴이 어느정도 되나요?
사용하고자 하는 LED의 스펙은 4V/20mA 입니다.
직렬로 하나 연결한다면 저항은 330ohm 쓰면 되는 건가요?
관리자 답변
안녕하세요? 고객님,
저희 N.T.C 제품을 이용하여 주셔서 감사드립니다.
우선, LED는 한 핀당 40mA까지 견딜 수 있구요.
최대로 견딜수 있는 용량이라 계속되면, 버티기 어렵습니다.
LED 한포트당 1개씩은 가능하겠구요. 52개까지 붙이실 수 있겠네요.
하지만, 많이 붙이시려면, 74ls244 또는 245를 이용하여 버퍼 ic를 이용하여 붙이시는 것이 좋겠습니다. 포트 IO에 5V를 쓰시면 330옴을 쓰시면 됩니다.
감사합니다.
>kd128pro 에 연결시켜 킬수 있는 최대 LED개수가 어떻게 되나요? 5파이짜리
>고휘도 LED 36개정도 킬려고 하는데 버틸 수있을까요?
>
>그리고 포트에서 출력되는 전압과 전류랴이 어느정도 되나요?
>
>사용하고자 하는 LED의 스펙은 4V/20mA 입니다.
>
>직렬로 하나 연결한다면 저항은 330ohm 쓰면 되는 건가요?
|
||||
| 1087 | 답변완료usb uart 에 관해 질문있습니다. | 박수익 | 2008-05-25 | 1,532 |
|
웹캠-컴퓨터(데스크탑)영성처리-usbuart-kd128pro-LCD(SG12864D)
위와 같이 구성하고 있는데요 입력이 웹캠이고 출력이 LCD구요
avr부분의 코딩은 아직 다하지 않았구요 LCD에 그림만 그려 놓았고 UART를 통한 시리얼 통신부분은 코딩하자 않았습니다. LCD켜면 프로그램된 그림이 출력되도록 되어있습니다.
이상태에서 USBUART를 연결했는데 전원을 키니 LCD전원만 들어오고 프로그램된 화면이 출력이 되질 않네요..
혹시나 싶어 RS232로 연결을 해봤는데 이건 연결을 해도 LCD화면이 프로그램된 그림을 나타내내요.
그리고 USBUART를 Rx,Tx,GND 만 연결했구요 Q&A게시판중 VCC를 연결해서 USBUART보드가 타 버렸다는 글이 있어서요.
그 글처럼 저도 VCC를 연결하지 않았는데도 USBUART를 꼿으면 avr칩 전원부 led에 불이 들어오구요 어댑터를 연결해서 전원을 넣었을 때보다는 어두운게 불이 들어 옵니다.
참고로 USBUAR핀 배선은
usb UART 부분 2(Tx)--------2(Rx0) AVR 칩
3 (Rx) -------3(Tx0)
4(GND)-------12V어댑터의 GND
이렇게 하였습니다.
관리자 답변
안녕하세요? 고객님,
USBUART를 쓸 경우 포트를 잘 설정하셔야 합니다.
제어판의 포트가 맞는 지 확인하시고 사용하시면 되지 않을까 싶구요.
LED에 어둡게 불이 들어온다고 했는 데, 제품 이상이 의심됩니다.
혹시 회사로 방문 가능하시면, 테스트 후에 교체해 드리겠습니다.
감사합니다.
>웹캠-컴퓨터(데스크탑)영성처리-usbuart-kd128pro-LCD(SG12864D)
>위와 같이 구성하고 있는데요 입력이 웹캠이고 출력이 LCD구요
>
>avr부분의 코딩은 아직 다하지 않았구요 LCD에 그림만 그려 놓았고 UART를 통한 시리얼 통신부분은 코딩하자 않았습니다. LCD켜면 프로그램된 그림이 출력되도록 되어있습니다.
>
>이상태에서 USBUART를 연결했는데 전원을 키니 LCD전원만 들어오고 프로그램된 화면이 출력이 되질 않네요..
>
>혹시나 싶어 RS232로 연결을 해봤는데 이건 연결을 해도 LCD화면이 프로그램된 그림을 나타내내요.
>
>그리고 USBUART를 Rx,Tx,GND 만 연결했구요 Q&A게시판중 VCC를 연결해서 USBUART보드가 타 버렸다는 글이 있어서요.
>그 글처럼 저도 VCC를 연결하지 않았는데도 USBUART를 꼿으면 avr칩 전원부 led에 불이 들어오구요 어댑터를 연결해서 전원을 넣었을 때보다는 어두운게 불이 들어 옵니다.
>
>참고로 USBUAR핀 배선은
>usb UART 부분 2(Tx)--------2(Rx0) AVR 칩
> 3 (Rx) -------3(Tx0)
> 4(GND)-------12V어댑터의 GND
>이렇게 하였습니다.
|
||||
| 1086 | 답변완료서보모터 소스에대해서요~~ | 배성욱 | 2008-05-24 | 1,545 |
|
#include <iom128v.h>
#include <macros.h>
#define SERVO_PORT PORTB
#define SERVO_PORT_DIR DDRB
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x03;
PORTB = 0x00;
DDRB = 0xff;
PORTC = 0x00; //m103 output only
DDRC = 0x03;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x03;
}
//TIMER0 initialize - prescale:32
// WGM: Normal
// desired value: 100KHz
// actual value: 100.000KHz (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0xFB; //set count
OCR0 = 0x05;
TCCR0 = 0x05; //start timer
}
//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 = 0x08;
}
#define MAX_SERVO_COUNT 8
unsigned int servo_pos[8]={100,100,100,100,100,100,100,100};
unsigned int servo_num;
unsigned char port_out;
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
if(port_out == 0){
servo_num ++;
servo_num = servo_num % MAX_SERVO_COUNT;
port_out = 1;
TCNT0 = 0xFF - servo_pos[servo_num]; //reload counter value
}else{
port_out = 0;
TCNT0 = servo_pos[servo_num]; //reload counter value
}
if(port_out==1){
SERVO_PORT = SERVO_PORT | 1<<servo_num;
}else{
SERVO_PORT = 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();
uart0_init();
timer0_init();
MCUCR = 0x00;
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 main(void)
{
unsigned int temp, i;
init_devices();
DDRF = 0x03;
printf("\\n\\rServo Motor test....\\n\\r");
delay(600);
SERVO_PORT_DIR = 0xff;
while(1){
if((PING & 0x04)){
printf("왼쪽\\n\\r");
for(i=0; i<8; i++){
servo_pos[i] = 140;
}
while((PING & 0x04));
}
if((PING & 0x08)){
printf("오른쪽\\n\\r");
for(i=0; i<8; i++){
servo_pos[i] = 240;
}
while((PING & 0x08));
}
delay(10);
}
}
void delay(int n)
{
volatile int i,j;
for(i=1;i<n;i++)
{
for(j=1;j<600;j++);
}
}
CD에 첨부되어있는 소스인데요~~
동작은 되는데 소스이해가 잘안되어서요~~
소스에 대한설명을 좀 해주실순 없는지 하고 메일 보내봅니다~~
관리자 답변
안녕하세요? 고객님,
저희 N.T.C를 방문해 주셔서 감사드립니다.
20ms 타이밍을 타이머로 만들어 내고 있구요.
또한 PWM 파형을 조절하는 것도 타이머로 하고 있습니다.
자세한 강좌는 강좌->AVR 강좌에 보시면 서보모터 강좌에 나와 있습니다.
소스 분석도 어느정도 나와 있으니, 참고하시구요.
감사합니다.
>#include <iom128v.h>
>#include <macros.h>
>
>#define SERVO_PORT PORTB
>#define SERVO_PORT_DIR DDRB
>
>void port_init(void)
>{
> PORTA = 0x00;
> DDRA = 0x03;
> PORTB = 0x00;
> DDRB = 0xff;
> PORTC = 0x00; //m103 output only
> DDRC = 0x03;
> PORTD = 0x00;
> DDRD = 0x00;
> PORTE = 0x00;
> DDRE = 0x00;
> PORTF = 0x00;
> DDRF = 0x00;
> PORTG = 0x00;
> DDRG = 0x03;
>}
>
>//TIMER0 initialize - prescale:32
>// WGM: Normal
>// desired value: 100KHz
>// actual value: 100.000KHz (0.0%)
>void timer0_init(void)
>{
> TCCR0 = 0x00; //stop
> ASSR = 0x00; //set async mode
> TCNT0 = 0xFB; //set count
> OCR0 = 0x05;
> TCCR0 = 0x05; //start timer
>}
>
>
>//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 = 0x08;
>}
>
>#define MAX_SERVO_COUNT 8
>
>unsigned int servo_pos[8]={100,100,100,100,100,100,100,100};
>unsigned int servo_num;
>unsigned char port_out;
>
>#pragma interrupt_handler timer0_ovf_isr:17
>
>void timer0_ovf_isr(void)
>{
> if(port_out == 0){
> servo_num ++;
> servo_num = servo_num % MAX_SERVO_COUNT;
> port_out = 1;
> TCNT0 = 0xFF - servo_pos[servo_num]; //reload counter value
> }else{
> port_out = 0;
> TCNT0 = servo_pos[servo_num]; //reload counter value
> }
>
> if(port_out==1){
> SERVO_PORT = SERVO_PORT | 1<<servo_num;
> }else{
> SERVO_PORT = 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();
> uart0_init();
> timer0_init();
>
> MCUCR = 0x00;
> 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 main(void)
>{
> unsigned int temp, i;
> init_devices();
>
> DDRF = 0x03;
>
>
> printf("\\n\\rServo Motor test....\\n\\r");
> delay(600);
> SERVO_PORT_DIR = 0xff;
>
> while(1){
> if((PING & 0x04)){
> printf("왼쪽\\n\\r");
> for(i=0; i<8; i++){
> servo_pos[i] = 140;
> }
> while((PING & 0x04));
> }
> if((PING & 0x08)){
> printf("오른쪽\\n\\r");
> for(i=0; i<8; i++){
> servo_pos[i] = 240;
> }
> while((PING & 0x08));
> }
> delay(10);
> }
>}
>
>void delay(int n)
>{
> volatile int i,j;
> for(i=1;i<n;i++)
> {
> for(j=1;j<600;j++);
> }
>}
>
>CD에 첨부되어있는 소스인데요~~
>동작은 되는데 소스이해가 잘안되어서요~~
>소스에 대한설명을 좀 해주실순 없는지 하고 메일 보내봅니다~~
|
||||
| 1085 | 답변완료스테핑모터 구동모듈 AM-cs2 관련 질문입니다. | 최용석 | 2008-05-24 | 1,501 |
|
1.만약에 구동모듈없이 스테핑모터를 구동시키려면 어떤식으로 해야하는지
알고싶습니다.
2.그리고 구동모듈에 대한 정확한 역활을 알고싶습니다.
3.상을 잡아준다는 말이 무슨뜻인지 알고싶습니다.
관리자 답변
안녕하세요? 고객님,
저희 N.T.C 를 방문하여 주셔서 감사드립니다.
구동 모듈의 역할을 말씀 드리면, 크게 두가지 입니다.
1. 모터가 돌 때 생기는 기전력의 전류 유입을 막아준다.
2. 모터가 구동될 수 있도록 적절한 전류를 공급하여 준다.
따라서, 구동 모듈 없이 스테핑 모터를 구동하기는 어렵겠습니다.
구동 모듈의 역할을 하는 뭔가를 만들어 주셔야 겠지요.
또한, 상을 만들어서 넣어 주셔야 합니다. 상에 관해서는 강좌->로봇강좌->라인트레이서에서 스테핑모터 강좌를 참고하세요.
감사합니다.
>1.만약에 구동모듈없이 스테핑모터를 구동시키려면 어떤식으로 해야하는지
> 알고싶습니다.
>
>2.그리고 구동모듈에 대한 정확한 역활을 알고싶습니다.
>
>3.상을 잡아준다는 말이 무슨뜻인지 알고싶습니다.
>
>
|
||||
| 1084 | 답변완료am-cs2p 포트 연결 관련.. | 박준석 | 2008-05-24 | 1,560 |
|
AVR 포트 C0-> 모듈 데이터 입력 1,
C1---> 입력2
C2 ---> 입력3
C3 ---> 입력4
연결했구요...
모터 연결은 블랙, 노랑 초록 빨강 흰색 파랑...순으로 a, com, a', b, com, b'
로 연결했습니다....
혹시 C1과 C2 연결을 바꿔야 되는가요??
모듈에 보니깐..
1번 A, 2번 B, 3번 A', 4번 B' 이라고 되어있거든요...
소스는 기존자료실에 있는 그대로 썼습니다...
관리자 답변
안녕하세요? 고객님,
고객님이 말씀하신 부분은 주신 부분만 가지고는 이해가 잘 안가서요.
왼쪽 모터 1번 A, 2번 B, 3번 A', 4번 B'
오른쪽 모터 5번 A, 6번 B, 7번 A', 8번 B'
로 연결 하셔야 합니다.
또한, 모터 연결은 a, com, a', b, com, b' 순서대로 하셔야 합니다.
감사합니다.
>AVR 포트 C0-> 모듈 데이터 입력 1,
>C1---> 입력2
>C2 ---> 입력3
>C3 ---> 입력4
>연결했구요...
>
>모터 연결은 블랙, 노랑 초록 빨강 흰색 파랑...순으로 a, com, a', b, com, b'
>로 연결했습니다....
>
>혹시 C1과 C2 연결을 바꿔야 되는가요??
>모듈에 보니깐..
>1번 A, 2번 B, 3번 A', 4번 B' 이라고 되어있거든요...
>
>소스는 기존자료실에 있는 그대로 썼습니다...
>
|
||||
