Q&A
| 번호 | 제목 | 작성자 | 등록일 | 조회 |
|---|---|---|---|---|
| 5183 | 답변완료AM-CSVP 출력 전압 관련 문의 드립니다. | 조현수 | 2010-05-20 | 1,403 |
|
AM-CSVP 로 SE-A410 8개를 제어하고 있습니다.
8관절 4족 로봇인데 토크가 약간 딸려서 걷는것이 불안불안 합니다.
아답터 전류가 1000mA 라서 전류가 부족한건가요??
전에 본사로 직접 구입하러 갔을 때 8개 제어하는데 300mA짜리를 주셔서
집에 있는 1000mA 로 바꿨는데도..
전류 부족이 아니라면, 전압을 증가시켜서라도 토크를 더 내고 싶은데요,
AM-CSVP의 기본 출력은 5V로 SE-A410은 6V에서 더 큰 토크를 낼 수 있는 것으로 알고
있는데요, 출력을 5V에서 6V로 증가시키는 방법이 없을까요?
관리자 답변
안녕하세요
A410 는 무부하시 180mA 입니다.
8개이면 1440mA 입니다.
부하시 더큰 소모전류 올라 갑니다.
아탑터 용량을 변경하여 사용하시길를 권장합니다.
수고하세요
>AM-CSVP 로 SE-A410 8개를 제어하고 있습니다.
>
>8관절 4족 로봇인데 토크가 약간 딸려서 걷는것이 불안불안 합니다.
>
>아답터 전류가 1000mA 라서 전류가 부족한건가요??
>
>전에 본사로 직접 구입하러 갔을 때 8개 제어하는데 300mA짜리를 주셔서
>
>집에 있는 1000mA 로 바꿨는데도..
>
>전류 부족이 아니라면, 전압을 증가시켜서라도 토크를 더 내고 싶은데요,
>
>AM-CSVP의 기본 출력은 5V로 SE-A410은 6V에서 더 큰 토크를 낼 수 있는 것으로 알고
>
>있는데요, 출력을 5V에서 6V로 증가시키는 방법이 없을까요?
|
||||
| 5182 | 답변완료문의드립니다. | 천대성 | 2010-05-20 | 1,380 |
|
안녕하십니까 AB-M128-B보드와 관련해 질문 드릴 것이 있습니다.
프로젝트 진행과 관련해 atmega128 - pc간 통신으로 모터를 제어하는 프로그램을 만들었습니다.
처음 작성한 코드를 사용해 직렬 유선 통신을 해보고 잘 동작하는 것을 확인한 후에 무선 통신을 하기 위해 패킷의 처음과 끝을 구분하는 부분을 추가한 코드를 타겟보드로 다운로드 한 뒤부터 타겟보드가 정상 동작을 하지 않습니다. 여분의 타겟보드에 정상적으로 동작하는 코드를 라이팅하고 확인해보니 잘 동작했고, 다시 무선 통신용으로 약간 수정한 코드를 라이팅하고 확인해보니 동작하지 않습니다.
문제는 두 보드 모두 정상 작동 하던 코드를 다시 라이팅해도 동작하지 않고 있습니다.
다른 코드들도 라이팅 해보고 erase device도 해서 다시 라이팅도 해보고 일주일째 여러 방법을 찾아봤는데 허사였습니다.
글로 설명드리자니 어려운데 우선 아래에 정상 동작하던 코드와 문제가 된 코드를 첨부하겠습니다. 두 코드엔 큰차이가 없고 패킷을 구분하는 0xC0를 추가하고 pc에서 명령을 받을 시 0xC0 다음부터만 받도록 구현했습니다.
사용한 장비(?)들은 AB-M128-B, AD-USBISP V03, AM-DC2-4C입니다. 전원 공급은 DC12V, 500mA어댑터 또는 리튬폴리머 DC11.1V, 100mA를 사용했습니다.
개발 환경은 AVRStudio 4.15버젼을 사용했습니다.
바쁘신데 시간 내어주셔서 감사드립니다.
---------------------정상 동작 코드---------------------
#include <avr/io.h>
#include <avr/signal.h>
char rec=0;
void delay(void)
{
unsigned int i=0,j=0;
for(i=0; i<10000; i++)
{
for(j=0; j<5000; j++);
}
}
void TX0_char(unsigned char data)
{
while((UCSR0A & 0x20) == 0x00);
UDR0 = data;
}
void TX0_string(unsigned char *string)
{
while(*string !='\\0')
{
TX0_char(*string);
string++;
}
TX0_char(0x0d);
TX0_char(0x0a);
delay();
}
SIGNAL(SIG_UART0_RECV)
{
rec= UDR0;
switch(rec)
{
case 'w' : PORTD = 0x00; //모터 정방향
break;
case 's' : PORTD = 0x02; //모터 역방향
break;
case 'a' : OCR0 = 0x70; //속도 느리게
break;
case 'd' : OCR0 = 0xff; //속도 빠르게
break;
case ' ' : PORTD = 0x01; //모터 정지
break;
default : break;
}
}
int main(void)
{
DDRD = 0xff;
DDRB = 0XFF;
UBRR0H = 0; //9600 baud
UBRR0L = 103;
UCSR0A = 0X00; // asynchronous normal mode
UCSR0B = 0X98; // RX/TX enable, RX interrupt enable, 8 data
UCSR0C = 0X06; // No Parity, 1 stop, 8data
TIMSK = 0x03; //Enable OCR Interrupt & Overflow Interrupt
TCCR0 = 0x6B; //Nornal mode, CLK/32 -> f=1953Hz
TCNT0 = 0x00;
OCR0 = 0x60; //Duty 50% ->모터 속도조절
SREG = 0X80;
PORTD = 0x00;
while(1)
{
TX0_string("Pig Huf");
}
}
---------------------------문제 코드----------------------------
#include <avr/io.h>
#include <avr/signal.h>
#define FEND 0xC0
char rec=0;
void delay(void)
{
unsigned int i=0,j=0;
for(i=0; i<10000; i++)
{
for(j=0; j<5000; j++);
}
}
void TX0_char(unsigned char data)
{
while((UCSR0A & 0x20) == 0x00);
UDR0 = data;
}
void TX0_string(unsigned char *string)
{
while(*string !='\\0')
{
TX0_char(*string);
string++;
}
TX0_char(0x0d);
TX0_char(0x0a);
delay();
}
SIGNAL(SIG_UART0_RECV)
{
static enum {READY, START} RxSeq = READY;
rec= UDR0;
switch(RxSeq)
{
case READY:
if(rec == FEND)
RxSeq = START;
break;
case START:
switch(rec)
{
case 'w' : PORTD = 0x01; //모터 정방향
break;
case 's' : PORTD = 0x02; //모터 역방향
break;
case 'a' :
OCR0 = 0x70; //속도 느리게
break;
case 'd' :
OCR0 = 0xff; //속도 빠르게
break;
case ' ' : PORTD = 0x03; //모터 정지
break;
default :
if(rec == FEND)
RxSeq = READY;
break;
}
break;
default: RxSeq = READY; break;
}
}
int main(void)
{
DDRD = 0xff;
DDRB = 0XFF;
UBRR0H = 0; //9600 baud
UBRR0L = 103;
UCSR0A = 0X00; // asynchronous normal mode
UCSR0B = 0X98; // RX/TX enable, RX interrupt enable, 8 data
UCSR0C = 0X06; // No Parity, 1 stop, 8data
TIMSK = 0x03; //Enable OCR Interrupt & Overflow Interrupt
TCCR0 = 0x6B; //Nornal mode, CLK/32 -> f=1953Hz
TCNT0 = 0x00;
OCR0 = 0x60; //Duty 50% ->모터 속도조절
SREG = 0X80;
while(1)
{
TX0_string("ICU_TX");
}
}
관리자 답변
안녕하세요
잘 동작하던 코드 안하는 경우는 설정이나 변경되거나 퓨즈를 변경시켜 칩이 망가진 경우가 있습니다.
칩의 퓨즈비트가 정상적인지 확인 보시길 바랍니다. 0xff19ef 나 xffd9ef 로 나오는지
확인해 보시길 바랍니다.
수고하세요
>안녕하십니까 AB-M128-B보드와 관련해 질문 드릴 것이 있습니다.
>
>프로젝트 진행과 관련해 atmega128 - pc간 통신으로 모터를 제어하는 프로그램을 만들었습니다.
>
>처음 작성한 코드를 사용해 직렬 유선 통신을 해보고 잘 동작하는 것을 확인한 후에 무선 통신을 하기 위해 패킷의 처음과 끝을 구분하는 부분을 추가한 코드를 타겟보드로 다운로드 한 뒤부터 타겟보드가 정상 동작을 하지 않습니다. 여분의 타겟보드에 정상적으로 동작하는 코드를 라이팅하고 확인해보니 잘 동작했고, 다시 무선 통신용으로 약간 수정한 코드를 라이팅하고 확인해보니 동작하지 않습니다.
>문제는 두 보드 모두 정상 작동 하던 코드를 다시 라이팅해도 동작하지 않고 있습니다.
>다른 코드들도 라이팅 해보고 erase device도 해서 다시 라이팅도 해보고 일주일째 여러 방법을 찾아봤는데 허사였습니다.
>글로 설명드리자니 어려운데 우선 아래에 정상 동작하던 코드와 문제가 된 코드를 첨부하겠습니다. 두 코드엔 큰차이가 없고 패킷을 구분하는 0xC0를 추가하고 pc에서 명령을 받을 시 0xC0 다음부터만 받도록 구현했습니다.
>
>사용한 장비(?)들은 AB-M128-B, AD-USBISP V03, AM-DC2-4C입니다. 전원 공급은 DC12V, 500mA어댑터 또는 리튬폴리머 DC11.1V, 100mA를 사용했습니다.
>개발 환경은 AVRStudio 4.15버젼을 사용했습니다.
>
>바쁘신데 시간 내어주셔서 감사드립니다.
>
>---------------------정상 동작 코드---------------------
>#include <avr/io.h>
>#include <avr/signal.h>
>
>char rec=0;
>
>void delay(void)
>{
> unsigned int i=0,j=0;
> for(i=0; i<10000; i++)
> {
> for(j=0; j<5000; j++);
> }
>}
>
>void TX0_char(unsigned char data)
>{
> while((UCSR0A & 0x20) == 0x00);
> UDR0 = data;
>}
>
>void TX0_string(unsigned char *string)
>{
> while(*string !='\\0')
> {
> TX0_char(*string);
> string++;
> }
> TX0_char(0x0d);
> TX0_char(0x0a);
> delay();
>}
>
>SIGNAL(SIG_UART0_RECV)
>{
> rec= UDR0;
> switch(rec)
> {
> case 'w' : PORTD = 0x00; //모터 정방향
> break;
> case 's' : PORTD = 0x02; //모터 역방향
> break;
> case 'a' : OCR0 = 0x70; //속도 느리게
> break;
> case 'd' : OCR0 = 0xff; //속도 빠르게
> break;
> case ' ' : PORTD = 0x01; //모터 정지
> break;
> default : break;
> }
>}
>
>
>int main(void)
>{
> DDRD = 0xff;
> DDRB = 0XFF;
> UBRR0H = 0; //9600 baud
> UBRR0L = 103;
> UCSR0A = 0X00; // asynchronous normal mode
> UCSR0B = 0X98; // RX/TX enable, RX interrupt enable, 8 data
> UCSR0C = 0X06; // No Parity, 1 stop, 8data
>
> TIMSK = 0x03; //Enable OCR Interrupt & Overflow Interrupt
> TCCR0 = 0x6B; //Nornal mode, CLK/32 -> f=1953Hz
> TCNT0 = 0x00;
> OCR0 = 0x60; //Duty 50% ->모터 속도조절
> SREG = 0X80;
>
> PORTD = 0x00;
>
>
> while(1)
> {
> TX0_string("Pig Huf");
> }
>}
>
>
>---------------------------문제 코드----------------------------
>#include <avr/io.h>
>#include <avr/signal.h>
>
>
>#define FEND 0xC0
>
>
>char rec=0;
>
>void delay(void)
>{
> unsigned int i=0,j=0;
> for(i=0; i<10000; i++)
> {
> for(j=0; j<5000; j++);
> }
>}
>
>void TX0_char(unsigned char data)
>{
> while((UCSR0A & 0x20) == 0x00);
> UDR0 = data;
>}
>
>void TX0_string(unsigned char *string)
>{
> while(*string !='\\0')
> {
> TX0_char(*string);
> string++;
> }
> TX0_char(0x0d);
> TX0_char(0x0a);
> delay();
>}
>
>SIGNAL(SIG_UART0_RECV)
>{
> static enum {READY, START} RxSeq = READY;
>
> rec= UDR0;
>
> switch(RxSeq)
> {
> case READY:
> if(rec == FEND)
> RxSeq = START;
> break;
> case START:
> switch(rec)
> {
> case 'w' : PORTD = 0x01; //모터 정방향
> break;
> case 's' : PORTD = 0x02; //모터 역방향
> break;
> case 'a' :
> OCR0 = 0x70; //속도 느리게
> break;
> case 'd' :
> OCR0 = 0xff; //속도 빠르게
> break;
> case ' ' : PORTD = 0x03; //모터 정지
> break;
> default :
> if(rec == FEND)
> RxSeq = READY;
> break;
> }
> break;
> default: RxSeq = READY; break;
> }
>}
>
>
>int main(void)
>{
> DDRD = 0xff;
> DDRB = 0XFF;
> UBRR0H = 0; //9600 baud
> UBRR0L = 103;
> UCSR0A = 0X00; // asynchronous normal mode
> UCSR0B = 0X98; // RX/TX enable, RX interrupt enable, 8 data
> UCSR0C = 0X06; // No Parity, 1 stop, 8data
>
>
> TIMSK = 0x03; //Enable OCR Interrupt & Overflow Interrupt
> TCCR0 = 0x6B; //Nornal mode, CLK/32 -> f=1953Hz
> TCNT0 = 0x00;
> OCR0 = 0x60; //Duty 50% ->모터 속도조절
> SREG = 0X80;
>
> while(1)
> {
> TX0_string("ICU_TX");
> }
>}
>
>
|
||||
| 5181 | 답변완료스테핑모터9kg (SE-SM) 속도제어할때 8051로 .. | 최유미 | 2010-05-20 | 1,318 |
|
스테핑모터9kg (SE-SM2)에 AM-MS2(모터 구동보드)를 연결하여 속도제어할때 8051로 제어하려하는데 모터 구동 예제소스좀 구할수 없을까요?
관리자 답변
안녕하세요
89s52로 ms2를 구동시키는 코드는 현재는 없습니다.
avr용으로 있는 기본 코드를 분석후 8051로 변환하여 작성해야 할것같네요
하지만, 8051용 CS2P 컨트롤러용 예제 소스는 있습니다. 아래를 참고하세요.
- 아래 -
http://www.newtc.co.kr/board/view.php?id=pds&page=1&sn1=&divpage=1&sn=off&ss=on&sc=off&keyword=89S52&select_arrange=headnum&desc=asc&no=311
수고하세요
>스테핑모터9kg (SE-SM2)에 AM-MS2(모터 구동보드)를 연결하여 속도제어할때 8051로 제어하려하는데 모터 구동 예제소스좀 구할수 없을까요?
|
||||
| 5180 | 답변완료질문이요. 서보모터 스텝모터관련 | 정영 | 2010-05-20 | 1,449 |
|
이번에 cds로 광량을 받아서
블라인드 각도를 조절하는걸 해볼려고 하는데요.
밝으면 블라인드 슬릿이 닫히고 어두우면 열리는~
키트는 kt m128을 사용하고 컴파일러는 iccavr입니다.
막 공부를 시작하면서 막막함을 느끼는데요.
스테핑모터가 좋을까요 아니면 서보모터가 좋을까요.
예제소스로 스테핑모터는 구동시켜 봤는데요.
생각해보니까 스테핑 모터로 특정 광량에 따라 기준점으로 부터 모터회전각을 지정해서
움직이게 할 수 있을까요?
예를들면 광량이 500일때는 60도. 200일때는 30도.
30도 만큼 회전이 아니라 기준점에대해서 30도 혹은 60도 회전한 '상태'인거죠.
이걸 스테핑모터로 구현할 수 있나요?
피드백 제어가 아니라 가능할까라는 생각이 들어서 ...
서보모터로 바꿔야 하나 고민중입니다. (지금까지 일단 스테핑만 공부했거든요 ㅠ;;)
만약 할 수 있다면 어떤 방식으로 코딩을 해야하는지
힌트좀 주세요. 다 가르쳐달라는 말이 아닙니다. ㅠㅠ;
관리자 답변
안녕하세요
rc서보는 움직일수있는 각도 제한이 있습니다.
범위각안에만 움직일수 있죠
스텝은 정확히 클럭준 만큼만 이동하기 떄문에 구동토크에 문제가 없으면
제어가 가능합니다.
cds는 전압을 adc로 받는것, 스텝모터 각도 제어 따로 구현해서
합치는 방식을 나을것 같네요
기본 소스예제는 자료실 >기존자료실에 찾아보시면 있습니다.
수고하세요
>
>이번에 cds로 광량을 받아서
>블라인드 각도를 조절하는걸 해볼려고 하는데요.
>밝으면 블라인드 슬릿이 닫히고 어두우면 열리는~
>
>키트는 kt m128을 사용하고 컴파일러는 iccavr입니다.
>
>막 공부를 시작하면서 막막함을 느끼는데요.
>스테핑모터가 좋을까요 아니면 서보모터가 좋을까요.
>예제소스로 스테핑모터는 구동시켜 봤는데요.
>생각해보니까 스테핑 모터로 특정 광량에 따라 기준점으로 부터 모터회전각을 지정해서
>움직이게 할 수 있을까요?
>예를들면 광량이 500일때는 60도. 200일때는 30도.
>30도 만큼 회전이 아니라 기준점에대해서 30도 혹은 60도 회전한 '상태'인거죠.
>이걸 스테핑모터로 구현할 수 있나요?
>피드백 제어가 아니라 가능할까라는 생각이 들어서 ...
>서보모터로 바꿔야 하나 고민중입니다. (지금까지 일단 스테핑만 공부했거든요 ㅠ;;)
>만약 할 수 있다면 어떤 방식으로 코딩을 해야하는지
>힌트좀 주세요. 다 가르쳐달라는 말이 아닙니다. ㅠㅠ;
>
>
|
||||
| 5179 | 답변완료에러 나오기전 설정상태입니다/ | 김광록 | 2010-05-20 | 1,299 |
|
ㅇ
관리자 답변
이미지를 확인해 본결과 퓨즈비트를 설정해 사용해서 망가진 상태입니다.;;;
퓨즈를 변경할때만 program fuse bit 체크를한후
아래 세부내역에 있는 비트를 체크해야합니다.
제품 출하시 사용할수 있도록 미리 셋팅되어 나가기 떄문에 따로 퓨즈 변경해서 사용할일을
잘 없습니다.
출하시 셋팅된값을 0xffd9ef
BOOTZ1, BOOTZ0, SUT0 이 3개 비트가 체크 되어 나갑니다.
사용안할때는 program fuse bit 체크 하지 않고 일반적으로 사용합니다.
보드 점검을 받아 보시길 바랍니다..
수고하세요
>ㅇ
|
||||
| 5178 | 답변완료질문있습니다 | 김재영 | 2010-05-20 | 1,291 |
|
질문있습니다. ad-usbisp-l 여기에 있는 설명대로 avr studio 를 이용해서 다운로드를 했는데
다운로딩상에는 에러나 그런것이 아무것도 없고 다운로드가 잘되는데 cpu 칩에는 아무반응이 없습니다 cpu를 새걸로 바꾸어 보아도 똑같습니다 왜그럴까요?
cpu는 89s51 을 사용합니다
관리자 답변
안녕하세요
ad-usbisp로는 AT89s51 AT89s52 다운로드가 가능합니다.
타겟보드가 어떤것가요 ? 직접 자작한것면 외부램관련 app핀을 설정을 하셔야 합니다.
ISP 핀번호는 정확히 맞추어 사용하셔는지요
자료실에 기존 자료실에 보시면 89s52 관련 도면이라고 있습니다.
그 도면에 기본적인 구성회로가 비슷한지를 확인하시길 바랍니다.
수고하세요
>질문있습니다. ad-usbisp-l 여기에 있는 설명대로 avr studio 를 이용해서 다운로드를 했는데
>다운로딩상에는 에러나 그런것이 아무것도 없고 다운로드가 잘되는데 cpu 칩에는 아무반응이 없습니다 cpu를 새걸로 바꾸어 보아도 똑같습니다 왜그럴까요?
>cpu는 89s51 을 사용합니다
|
||||
| 5177 | 답변완료에러사진 올려드릴게요 | 김광록 | 2010-05-20 | 1,431 |
|
저게 밑에 체크이레이저랑 베리파이를 체크를 해놓으면 이런 에러가 나네요
그리고 소스를 올린후에 확인 할수 있는 방법이 잇나요?
관리자 답변
저기 체크하는 곳에 체크를 하지 않고 프로그래올을 하면 에러는 발생하지 않네요
|
||||
| 5176 | 답변완료질문있습니다 | 황선민 | 2010-05-20 | 1,455 |
|
밑에서 가속도 센서 예제 코드로 질문했었는데요
소스를 보면 ADCH 와 ADCL의 값을 각각 전송하는데요
데이터를 degree로 받으려면 ADCH와 ADCL의 값을 합한 후,
공식 적용, 다시 분할하면 출력 데이터가 degree로 나오나요?
이게 안되면 어떤 식으로 해야하나요?
관리자 답변
안녕하세요
어디다가 출력하다는 말인지 이해를 못하겠네요?
저희쪽에서 제공하는 예제프로그램과 윈도우 응용 프로그램를 애기하시는지요 ?
윈도우응용프로그램에서 기울기각도를 계산됩니다.
mega128에 올라가는 코드는 ADC값만 받아서 uart 로 날리는 역활만 합니다.
mega128에서 각도를 구하시려면 저번에 첨부해드린 문서에 구하는 공식이 있습니다.
각도를 구할려면 adc 2바이트를 int 형태로 합쳐서 계산해야 됩니다
UART로 데이터를 날리면 byte 단위로 쪼깨서 보내야합니다.;;
아래글은 동일한 글이라 지우도록 하겠습니다.
수고하세요
>밑에서 가속도 센서 예제 코드로 질문했었는데요
>
>소스를 보면 ADCH 와 ADCL의 값을 각각 전송하는데요
>
>데이터를 degree로 받으려면 ADCH와 ADCL의 값을 합한 후,
>
>공식 적용, 다시 분할하면 출력 데이터가 degree로 나오나요?
>
>이게 안되면 어떤 식으로 해야하나요?
|
||||
| 5175 | 답변완료코드비전 사용중인데요 질문있습니다. | 김광록 | 2010-05-20 | 1,473 |
|
에러사진 올려드렸고요
책에 보면 컴파일을 하고 빌드를 하면 롬파일이 생겨야 한다고 하는데
안생기는 이유를 잘 모르겠고요
그리고 sck frequency 랑 flash랑 eeprom start end 설정을 잘 못한거 같은데
어떻게 해야할까요 --
관리자 답변
안녕하세요
어떤에러 사진을 말하는 것지요 ?
예전에 올린 eeprom 라이트 에러 말하는것가요 ?
그것은 에러 아니라고 답변을 했습니다.
eeprom 에는 코드를 올리지 않습니다.
일반 데이터 저장용으로 사용하는곳입니다.
프로그램코드는 프래쉬메모리에 올라갑니다.
sck frequency는 최대속도로 맟추어 놓고 사용하면 됩니다. 다운로더 속도입니다.
eeprom start end
eeprom 영역은 픽스된 값입니다. 건들 필요가 없습니다.
수고하세요
>에러사진 올려드렸고요
>
>책에 보면 컴파일을 하고 빌드를 하면 롬파일이 생겨야 한다고 하는데
>안생기는 이유를 잘 모르겠고요
>
>그리고 sck frequency 랑 flash랑 eeprom start end 설정을 잘 못한거 같은데
>
>어떻게 해야할까요 --
|
||||
| 5174 | 답변완료AVR mega 128 개발보드 - 소형 | 김대봉 | 2010-05-20 | 1,469 |
|
AVR mega128 개발보드 소형을 살려고 하는데 제가 아직 초보이기에 문의 좀 할려고 합니다.
주변장치와 통신을 3가지를 쓸려고 하는데 ATmega128이 UART 통신 2개를 지원하는것으로
알고 있습니다.
그래서 나머지 1개를 어떻게 통신해야할지 고민중에 있습니다.
첫번쨰 질문은 혹시 제가 알기로는 ATmega128에서 USB 통신을 지원하지 않는것으로 알고
있는데 혹시 지원 가능한지 궁금합니다.
두번째 질문은 만약 USB통신이 지원하지 않는다면 UART 통신을 3개 지원 할 수 있는 지
궁금합니다
세번째 질문은 만약 UART 통신이 2개뿐이 지원하지 않는다며 UART통신 2개 와 그리고 SPI 통신
1개를 같이 사용할 수 있는지 궁금합니다.
관리자 답변
안녕하세요
-mega128은 usb를 지원하지않습니다.
-mega128은 uart 2개입니다. mega1280 또는 2560 이 uart가 4개입니다.
- mega128의 uart2개 spi 포트는 별개 포트 입니다.
즉 동시에 사용가능하다는 말입니다.
atmel 사에서 제공하는 mega128 데이터 시트를 보시길 바랍니다.
수고하세요
>
>AVR mega128 개발보드 소형을 살려고 하는데 제가 아직 초보이기에 문의 좀 할려고 합니다.
>
>
>주변장치와 통신을 3가지를 쓸려고 하는데 ATmega128이 UART 통신 2개를 지원하는것으로
>
>알고 있습니다.
>
>그래서 나머지 1개를 어떻게 통신해야할지 고민중에 있습니다.
>
>첫번쨰 질문은 혹시 제가 알기로는 ATmega128에서 USB 통신을 지원하지 않는것으로 알고
>
>있는데 혹시 지원 가능한지 궁금합니다.
>
>두번째 질문은 만약 USB통신이 지원하지 않는다면 UART 통신을 3개 지원 할 수 있는 지
>
>궁금합니다
>
>세번째 질문은 만약 UART 통신이 2개뿐이 지원하지 않는다며 UART통신 2개 와 그리고 SPI 통신
>
>1개를 같이 사용할 수 있는지 궁금합니다.
>
>
|
||||
| 5173 | 답변완료TN_901비접촉식 온도센서와 ATmega128을 통해서 구동을 하려는데요 | oysworld | 2010-05-19 | 1,302 |
|
개발모듈의 어느 포트를 사용해야 하는지를 모르겠습니다.
그리구 코딩같은 경우 자료를 찾는게 쉬운게 아니더군요;;
혹시 방법이 있다면 좀 알려주실수 있는지요?
관리자 답변
안녕하세요
TN_901 통신 방법을 통신 클럭의 주파수에 관련 max ~min 값이 없더군요
한클럭 500us 만 존재 하더군요
TN_901 통신클럭이 좀 높으면 spi 통신으로 가능해 보이나
클럭 주파수 값의 범위가 존재 하지 않았어 ...;
일반 io로 데이터 클럭을 생성해서 데이터를 읽어야 합니다.
포트는 아무것나 사용해서 만들어야 하다는 말입니다.
수고하세요
>개발모듈의 어느 포트를 사용해야 하는지를 모르겠습니다.
>그리구 코딩같은 경우 자료를 찾는게 쉬운게 아니더군요;;
>혹시 방법이 있다면 좀 알려주실수 있는지요?
|
||||
| 5172 | 답변완료알려주세요 ㅜㅜ | 정혜현 | 2010-05-19 | 1,228 |
|
일부로 소스 주요부분은 엔터를 많이 쳐서 구별해놨습니다.
우선 맨 아래 왜 주석표시되어있어서 그 소스는 여기 예제소스입니다.
저걸 돌렸을씨 AM-DC2-2D모터 모듈로 돌렸을시에 같은 원하는데로 동시에 두개가 구현이되었습니다.
속도도 제가 원하는대로 나왔구요.
그런데 제가 코딩한소스에서 온도값에따라 모터를 구동하고자합니다.
메인함수에서 motor 함수를 호출하는것입니다.
근데 그 모터함수 보시면 제가 그 주석처리했던 부분을 if문에 그대로 넣었습니다. ㅜㅜ
그리고 그 PWM 속도부분도 똑같이 지정해주었는데
이상하게;; 속도가 빠르게 돕니다.
같은소스인데 속도가 엄청빠르게 돕니다.
그리고 같은소스같은데 motor함수에 놓고 하니까 두개가 동시에 안돌더라구요 ㅜㅜ
정말 죄송합니다 그런데 물어볼 곳이 없어서 이렇게 또 질문을 합니다. ㅜㅜ
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#include <math.h>
#define noACK 0
#define ACK 1
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
#define MOTOR_PORT PORTD
#define MOTOR_DDR DDRD
#define PWM1_ON (MOTOR_PORT|=0x01)
#define PWM1_OFF (MOTOR_PORT&=0xFE)
#define DIR1_ON (MOTOR_PORT|=0x02)
#define DIR1_OFF (MOTOR_PORT&=0xFD)
#define ENABLE1_OFF (MOTOR_PORT|=0x04)
#define ENABLE1_ON (MOTOR_PORT&=0xFB)
#define PWM2_ON (MOTOR_PORT|=0x10)
#define PWM2_OFF (MOTOR_PORT&=0xEF)
#define DIR2_ON (MOTOR_PORT|=0x20)
#define DIR2_OFF (MOTOR_PORT&=0xDF)
#define ENABLE2_ON (MOTOR_PORT|=0x40)
#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
typedef union
{
unsigned int i;
float f;
}value;
value temp_val, humi_val;
enum{TEMP,HUMI};
unsigned int us =0;
const float C1= -4.0; //for 12 Bit
const float C2= +0.0405; //for 12 Bit
const float C3= -0.0000028; //for 12 Bit
const float T1= +0.01; //for 14 Bit @ 5V
const float T2= +0.00008; //for 14 Bit @ 5V
void delay_us(unsigned int);
int putchar(char c);
int getchar(void);
char GET_SDA(void);
void SDA(char);
void SCK(char);
char s_write_byte(unsigned char);
char s_read_byte(unsigned char);
void s_transstart(void);
void s_connectionreset(void);
char s_measure(char *p_value, char *p_checksum, char mode);
void calc_sth75(float *p_humidity ,float *p_temperature);
void port_init(void)//포트 미리 지정
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x03;
PORTC = 0x00;
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
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;
}
void timer0_init(void)//
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0xFC; //set count
OCR0 = 0x04;
TCCR0 = 0x01; //start timer
}
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80; //comparator off & 노이즈부분에서 향상시킴
ADCSRA = 0xC6; //11000110
//ADC활성화 및 ADC변환 시작 &단일모드 &64division
}
void timer1_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x06; //set count
OCR0 = 0xFA;
TCCR0 = 0x04; //start timer
}
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();
adc_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints // 00:low level, 01: 논리변화 ,10:falling, 11:rising
EIMSK = 0x00;
TIMSK = 0x01; //timer interrupt sources : timer0
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void startConvertion(int ch)
{
ADCSRA = ADCSRA & 0x3f;
//11000110*00111111=00000110 즉 우선 ADC OFF
ADMUX = 0x40;
//01000000 내부 Avcc를 Reference전압으로 이용
//ADC변환 data왼쪽 정렬하지않음 & ADC0 을 input 핀으로 사용함
ADCSRA = ADCSRA | 0xC0;
//00000110+11000000=11000110 -> 다시 ADC켜고 시작
}
unsigned int readConvertData(void)
{
unsigned int temp,cl,ch;
while((ADCSRA & 0x10)==0);
ADCSRA = ADCSRA | 0x10;
cl = ADCL; //변환결과 저장 낮은 ADC7~ADC0
ch = ADCH; //변환 결과저장 ADC9~ADC8
temp = cl + ch*256; // 밑에 그림에서 보듯이 저런 식으로 저장
//출력은 10bit인데 8bit씩 나누어서 저장해야 하므로 ch에 256을 곱해줍니다.
ADCSRA = ADCSRA | 0x10;
return temp;
}
void delay(int n)
{
volatile int i,j;
for(i=1;i<n;i++)
{
for(j=1;j<600;j++);
}
}
char GET_SDA(void) //ACK 값 변경확인 부분
{
DDRB &= 0xFE;
if(PINB&0X01) return 1;
else return 0;
}
void SDA(char data) //DATA 펄스 설정부분
{
DDRB |=0X01;
PORTB = (PINB&0XFE)|data;
}
void SCK(char data) //SCK 펄스 설정 부분
{
PORTB =((PINB&0XFD)|(data<<1));
}
void s_transstart() //TANSMISSON 펄스 주는 부분
{
SDA(1);
SCK(0);
delay_us(1);
SCK(1);
delay_us(1);
SDA(0);
delay_us(1);
SCK(0);
delay_us(5);
SCK(1);
delay_us(1);
SDA(1);
delay_us(1);
SCK(0);
}
char s_write_byte(unsigned char value) //명
{
//value is MEASURE_TEMP = 0X03; or MEASURE_HUMI = 0X05;
//그림과 같이 명령어를 출력 할수 있도록 설정
unsigned char i, error=0;
for(i=0x80; i>0; i/=2) { //shift bit for masking
if(i & value) SDA(1); //masking value with i, write to SENSI-BUS
else SDA(0);
SCK(1); //clk for SENSI-BUS
delay_us(5); //pulswith approx. 5 us
SCK(0);
}
SDA(1); //release DATA-line
SCK(1); //clk #9 for ack
error=GET_SDA(); //check ack (DATA will be pulled down by SHT11)
SCK(0);
return error; //error=1 in case of no acknowledge
}
char s_read_byte(unsigned char ack) // ack값 변경 후 data 받는 부분
{ // 그림처럼 데이터를 입력 받는다.
unsigned char i, val=0;
SDA(1); //release DATA-line
for(i=0x80; i>0; i/=2) { //shift bit for masking
SCK(1); //clk for SENSI-BUS
if(GET_SDA()) val=(val | i); //read bit
SCK(0);
}
SDA(!ack); //in case of "ack==1" pull down DATA-Line
SCK(1); //clk #9 for ack
delay_us(5); //pulswith approx. 5 us
SCK(0);
SDA(1); //release DATA-line
return val;
}
void s_connectionreset() //처음-->start
{ //그림처럼 처음 시작 시그널을 보낸다
char i;
SDA(1); SCK(0);
for(i=0; i<9; i++) { //9 SCK cycles
SCK(1);
SCK(0);
}
s_transstart();
}
char s_measure(char *p_value, char *p_checksum, char mode)
{
unsigned error=0;
unsigned int i;
s_transstart(); //transmission start
switch(mode) { //send command to sensor
case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //MEASURE_TEMP = 0X03;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //MEASURE_HUMI = 0X05;
default : break;
}
delay_us(50000);
delay_us(50000);
while(GET_SDA()); //wait until sensor has finished the measurement
if(GET_SDA()) error+=1;
*(p_value+1) = s_read_byte(ACK); //read the first byte (MSB)
*(p_value) = s_read_byte(ACK); //read the second byte (LSB)
*p_checksum = s_read_byte(noACK); //read checksum
return error;
}
void fan(unsigned int average)
{
if(average>=29)
{
DDRC=0x01;
PORTC=0x01;
}
else
{
DDRC=0x00;
PORTC=0x00;
}
}
int motor_flag=3;
int motor(unsigned average)
{
int i,d;
MOTOR_DDR = 0xff;
if(average>=27 && (motor_flag==0 || motor_flag==3) )
{
ENABLE1_ON;
ENABLE2_ON;
DIR1_ON;
DIR2_ON;
for(i=0; i<5; i++){
PWM1_ON;
PWM2_ON; // PWM1 신호 1
delay(2);
PWM1_OFF;
PWM2_OFF; // PWM1 신호 0
delay(10000);
}
ENABLE1_OFF;
ENABLE2_OFF;
MOTOR_DDR = 0x00;
motor_flag = 1;
}
else if(average<27 && (motor_flag==1 || motor_flag==3))
{
ENABLE1_ON;
ENABLE2_ON;
DIR1_OFF;
DIR2_OFF;
for(i=0; i<5; i++){
PWM1_ON; // PWM1 신호 1
PWM2_ON; // PWM1 신호 1
delay(10000);
PWM1_OFF;
PWM2_OFF; // PWM1 신호 0
delay(2);
}
ENABLE1_OFF;
ENABLE2_OFF;
MOTOR_DDR = 0x00;
motor_flag =0;
}
else
{}
return 0;
}
void main(void)
{
char error=0,checksum;
unsigned int i,te,hu,average;
unsigned int temp;
DDRB=0x03;
init_devices();
PORTF = 0x00;
s_connectionreset(); // 시작 시그널을 보낸다.
while (1)
{
error += s_measure((char*) &temp_val.i,&checksum,TEMP); //measure temperature(온도) 측정
error += s_measure((char*) &humi_val.i,&checksum,HUMI); //measure humidity(습도) 측정
startConvertion(0);
temp = readConvertData();
temp = (temp*5*10)/1024;
if(error != 0)
{
s_connectionreset(),printf("error =%d \\n\\r",error); //오류가 있을시 오류문구 출력
}
else { //측정에 오류가 없을 경우 측정값을 계산하여 출력
humi_val.f=(float)humi_val.i; //converts integer to float
temp_val.f=(float)temp_val.i; //converts integer to float
calc_sth75(&humi_val.f, &temp_val.f); //calculate humidity, temperature
te=(int)temp_val.f;
hu=(int)humi_val.f;
average=(te+temp)/2;
printf("%d C,%d%%\\n\\r",average,hu);
fan(average);
}
motor(average);
delay_us(1000);
}
}
void calc_sth75(float *p_humidity ,float *p_temperature)
{
float rh; //rh: Humidity [Ticks] 12 Bit
float t; //t: Temperature [Ticks] 14 Bit
float rh_lin; //rh_lin: Humidity linear
float rh_true; //rh_true: Temperature compensated humidity
float t_C; //t_C : Temperature [.C]
rh= *p_humidity; //rh: Humidity [Ticks] 12 Bit
t = *p_temperature; //t: Temperature [Ticks] 14 Bit
t_C= t*0.01 - 40-1.2; //calc. Temperature from ticks to [.C]
rh_lin= C3*rh*rh + C2*rh + C1 ; //calc. Humidity from ticks to [%RH]
rh_true= (t_C-25)*(T1+T2*rh)+rh_lin; //calc. Temperature compensated humidity [%RH]
if(rh_true > 100) rh_true=100; //cut if the value is outside of
if(rh_true < 0.1) rh_true=0.1; //the physical possible range
*p_temperature= t_C; //return temperature [.C]
*p_humidity= rh_true; //return humidity[%RH]
}
void delay_us(unsigned int t) //딜레이함수
{
us =0;
while(us<t);
}
#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)
{
TCNT0 = 0xFC; //reload counter value
us++;
}
int putchar(char c) //통신을 위한 설정
{
while (((UCSR0A>>UDRE0)&0x01) == 0) ; // UDRE, data register empty
UDR0 = c;
return c;
}
int getchar(void) //통신을 위한 설정
{
while ((UCSR0A & 0x80) == 0);
return UDR0;
}
/*
//ICC-AVR application builder : 2005-05-06 오후 10:36:45
// Target : M128
// Crystal: 16Mhz
#include <iom128v.h>
#include <macros.h>
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 = 0x03;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
// UBRR0L = 0x2F; //set baud rate lo 7.3728 MHz
// UBRR0L = 0x47; //set baud rate lo 11.0592 Mhz
UBRR0L = 0x67; //set baud rate lo 16Mhz
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x08;
}
//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(); // UART 0 초기화
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
}
#define MOTOR_PORT PORTD
#define MOTOR_DDR DDRD
#define PWM1_ON (MOTOR_PORT|=0x01)
#define PWM1_OFF (MOTOR_PORT&=0xFE)
#define DIR1_ON (MOTOR_PORT|=0x02)
#define DIR1_OFF (MOTOR_PORT&=0xFD)
#define ENABLE1_OFF (MOTOR_PORT|=0x04)
#define ENABLE1_ON (MOTOR_PORT&=0xFB)
#define PWM2_ON (MOTOR_PORT|=0x10)
#define PWM2_OFF (MOTOR_PORT&=0xEF)
#define DIR2_ON (MOTOR_PORT|=0x20)
#define DIR2_OFF (MOTOR_PORT&=0xDF)
#define ENABLE2_ON (MOTOR_PORT|=0x40)
#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
void main (void)
{
int i;
init_devices();
MOTOR_DDR = 0xff; // 모터포트 초기화
ENABLE1_ON;
while(1){
DIR1_ON; // Ch1 정방향
DIR2_ON; // Ch2 정방향
for(i=0; i<5; i++){ // 100 번 PWM 발생
PWM1_ON; // PWM1 신호 1
PWM2_ON; // PWM2 신호 1
delay(200);
PWM1_OFF; // PWM1 신호 0
PWM2_OFF; // PWM2 신호 0
delay(10000);
}
DIR1_OFF; // Ch1 역방향
DIR2_OFF; // Ch2 역방향
for(i=0; i<5; i++){ // 100 번 PWM 발생
PWM1_ON; // PWM1 신호 1
PWM2_ON; // PWM2 신호 1
delay(100000);
PWM1_OFF; // PWM1 신호 0
PWM2_OFF; // PWM2 신호 0
delay(200);
}
}
}
// 시간 지연 함수
void delay(int n)
{
volatile int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<100;j++);
}
}
*/
관리자 답변
안녕하세요
짜신 코드를 확인해 드릴수는 없습니다.
짜신코드를 돌려보고 테스트를 해야하기 때문입니다. 거기에 소모되는 시간을 무시할수가 없습니다.
그래서 본사에서는 짜신코드에 대해 써포트를 하지않습니다.
motor()함수가 main함수에 넣고 나머지는 주석 처리 한후 모터가 원하는 동작을 하는지
하나씩 주석처리된 코드를 풀면서 확인해 보시길 바랍니다.
수고하세요
>일부로 소스 주요부분은 엔터를 많이 쳐서 구별해놨습니다.
>우선 맨 아래 왜 주석표시되어있어서 그 소스는 여기 예제소스입니다.
>저걸 돌렸을씨 AM-DC2-2D모터 모듈로 돌렸을시에 같은 원하는데로 동시에 두개가 구현이되었습니다.
>
>속도도 제가 원하는대로 나왔구요.
>
>그런데 제가 코딩한소스에서 온도값에따라 모터를 구동하고자합니다.
>메인함수에서 motor 함수를 호출하는것입니다.
>근데 그 모터함수 보시면 제가 그 주석처리했던 부분을 if문에 그대로 넣었습니다. ㅜㅜ
>그리고 그 PWM 속도부분도 똑같이 지정해주었는데
>이상하게;; 속도가 빠르게 돕니다.
>같은소스인데 속도가 엄청빠르게 돕니다.
>그리고 같은소스같은데 motor함수에 놓고 하니까 두개가 동시에 안돌더라구요 ㅜㅜ
>정말 죄송합니다 그런데 물어볼 곳이 없어서 이렇게 또 질문을 합니다. ㅜㅜ
>
>
>
>
>
>#include <iom128v.h>
>#include <macros.h>
>#include <stdio.h>
>#include <math.h>
>
>#define noACK 0
>#define ACK 1
>#define STATUS_REG_W 0x06 //000 0011 0
>#define STATUS_REG_R 0x07 //000 0011 1
>#define MEASURE_TEMP 0x03 //000 0001 1
>#define MEASURE_HUMI 0x05 //000 0010 1
>#define RESET 0x1e //000 1111 0
>
>#define MOTOR_PORT PORTD
>#define MOTOR_DDR DDRD
>#define PWM1_ON (MOTOR_PORT|=0x01)
>#define PWM1_OFF (MOTOR_PORT&=0xFE)
>#define DIR1_ON (MOTOR_PORT|=0x02)
>#define DIR1_OFF (MOTOR_PORT&=0xFD)
>#define ENABLE1_OFF (MOTOR_PORT|=0x04)
>#define ENABLE1_ON (MOTOR_PORT&=0xFB)
>#define PWM2_ON (MOTOR_PORT|=0x10)
>#define PWM2_OFF (MOTOR_PORT&=0xEF)
>#define DIR2_ON (MOTOR_PORT|=0x20)
>#define DIR2_OFF (MOTOR_PORT&=0xDF)
>#define ENABLE2_ON (MOTOR_PORT|=0x40)
>#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
>
>
>typedef union
>{
> unsigned int i;
> float f;
>}value;
>
>value temp_val, humi_val;
>
>enum{TEMP,HUMI};
>unsigned int us =0;
>
>const float C1= -4.0; //for 12 Bit
>const float C2= +0.0405; //for 12 Bit
>const float C3= -0.0000028; //for 12 Bit
>const float T1= +0.01; //for 14 Bit @ 5V
>const float T2= +0.00008; //for 14 Bit @ 5V
>
>void delay_us(unsigned int);
>int putchar(char c);
>int getchar(void);
>char GET_SDA(void);
>void SDA(char);
>void SCK(char);
>char s_write_byte(unsigned char);
>char s_read_byte(unsigned char);
>void s_transstart(void);
>void s_connectionreset(void);
>char s_measure(char *p_value, char *p_checksum, char mode);
>void calc_sth75(float *p_humidity ,float *p_temperature);
>
>void port_init(void)//포트 미리 지정
>{
> PORTA = 0x00;
> DDRA = 0x00;
> PORTB = 0x00;
> DDRB = 0x03;
> PORTC = 0x00;
> DDRC = 0x00;
> PORTD = 0x00;
> DDRD = 0x00;
> PORTE = 0x00;
> DDRE = 0x00;
> PORTF = 0x00;
> DDRF = 0x00;
> PORTG = 0x00;
> DDRG = 0x00;
>}
>
>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;
>}
>
>void timer0_init(void)//
>{
> TCCR0 = 0x00; //stop
> ASSR = 0x00; //set async mode
> TCNT0 = 0xFC; //set count
> OCR0 = 0x04;
> TCCR0 = 0x01; //start timer
>}
>
>void adc_init(void)
>{
> ADCSRA = 0x00; //disable adc
> ADMUX = 0x00; //select adc input 0
> ACSR = 0x80; //comparator off & 노이즈부분에서 향상시킴
> ADCSRA = 0xC6; //11000110
>//ADC활성화 및 ADC변환 시작 &단일모드 &64division
>}
>
>void timer1_init(void)
>{
> TCCR0 = 0x00; //stop
> ASSR = 0x00; //set async mode
> TCNT0 = 0x06; //set count
> OCR0 = 0xFA;
> TCCR0 = 0x04; //start timer
>}
>
>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();
> adc_init();
>
> MCUCR = 0x00;
> EICRA = 0x00; //extended ext ints
> EICRB = 0x00; //extended ext ints // 00:low level, 01: 논리변화 ,10:falling, 11:rising
> EIMSK = 0x00;
> TIMSK = 0x01; //timer interrupt sources : timer0
> ETIMSK = 0x00; //extended timer interrupt sources
> SEI(); //re-enable interrupts
> //all peripherals are now initialized
>}
>void startConvertion(int ch)
>{
> ADCSRA = ADCSRA & 0x3f;
>//11000110*00111111=00000110 즉 우선 ADC OFF
> ADMUX = 0x40;
>//01000000 내부 Avcc를 Reference전압으로 이용
>//ADC변환 data왼쪽 정렬하지않음 & ADC0 을 input 핀으로 사용함
> ADCSRA = ADCSRA | 0xC0;
>//00000110+11000000=11000110 -> 다시 ADC켜고 시작
>}
>
>unsigned int readConvertData(void)
>{
> unsigned int temp,cl,ch;
> while((ADCSRA & 0x10)==0);
> ADCSRA = ADCSRA | 0x10;
> cl = ADCL; //변환결과 저장 낮은 ADC7~ADC0
> ch = ADCH; //변환 결과저장 ADC9~ADC8
> temp = cl + ch*256; // 밑에 그림에서 보듯이 저런 식으로 저장
>//출력은 10bit인데 8bit씩 나누어서 저장해야 하므로 ch에 256을 곱해줍니다.
> ADCSRA = ADCSRA | 0x10;
> return temp;
>}
>
>void delay(int n)
>{
> volatile int i,j;
> for(i=1;i<n;i++)
> {
> for(j=1;j<600;j++);
> }
>}
>
>
>char GET_SDA(void) //ACK 값 변경확인 부분
>{
> DDRB &= 0xFE;
> if(PINB&0X01) return 1;
> else return 0;
>}
>
>void SDA(char data) //DATA 펄스 설정부분
>{
> DDRB |=0X01;
> PORTB = (PINB&0XFE)|data;
>}
>
>void SCK(char data) //SCK 펄스 설정 부분
>{
> PORTB =((PINB&0XFD)|(data<<1));
>}
>
>void s_transstart() //TANSMISSON 펄스 주는 부분
>{
> SDA(1);
> SCK(0);
> delay_us(1);
> SCK(1);
> delay_us(1);
> SDA(0);
> delay_us(1);
> SCK(0);
> delay_us(5);
> SCK(1);
> delay_us(1);
> SDA(1);
> delay_us(1);
> SCK(0);
>}
>
>char s_write_byte(unsigned char value) //명
>{
>//value is MEASURE_TEMP = 0X03; or MEASURE_HUMI = 0X05;
>//그림과 같이 명령어를 출력 할수 있도록 설정
>
>unsigned char i, error=0;
>
> for(i=0x80; i>0; i/=2) { //shift bit for masking
> if(i & value) SDA(1); //masking value with i, write to SENSI-BUS
> else SDA(0);
> SCK(1); //clk for SENSI-BUS
> delay_us(5); //pulswith approx. 5 us
> SCK(0);
> }
> SDA(1); //release DATA-line
> SCK(1); //clk #9 for ack
> error=GET_SDA(); //check ack (DATA will be pulled down by SHT11)
> SCK(0);
> return error; //error=1 in case of no acknowledge
>}
>
>
>char s_read_byte(unsigned char ack) // ack값 변경 후 data 받는 부분
>{ // 그림처럼 데이터를 입력 받는다.
> unsigned char i, val=0;
> SDA(1); //release DATA-line
> for(i=0x80; i>0; i/=2) { //shift bit for masking
> SCK(1); //clk for SENSI-BUS
> if(GET_SDA()) val=(val | i); //read bit
> SCK(0);
> }
> SDA(!ack); //in case of "ack==1" pull down DATA-Line
> SCK(1); //clk #9 for ack
> delay_us(5); //pulswith approx. 5 us
> SCK(0);
> SDA(1); //release DATA-line
> return val;
>}
>
>void s_connectionreset() //처음-->start
>{ //그림처럼 처음 시작 시그널을 보낸다
> char i;
> SDA(1); SCK(0);
> for(i=0; i<9; i++) { //9 SCK cycles
> SCK(1);
> SCK(0);
> }
> s_transstart();
>}
>
>char s_measure(char *p_value, char *p_checksum, char mode)
>{
> unsigned error=0;
> unsigned int i;
>
> s_transstart(); //transmission start
>
> switch(mode) { //send command to sensor
> case TEMP : error+=s_write_byte(MEASURE_TEMP); break; //MEASURE_TEMP = 0X03;
>
> case HUMI : error+=s_write_byte(MEASURE_HUMI); break; //MEASURE_HUMI = 0X05;
>
> default : break;
> }
>
> delay_us(50000);
> delay_us(50000);
>
> while(GET_SDA()); //wait until sensor has finished the measurement
>
> if(GET_SDA()) error+=1;
> *(p_value+1) = s_read_byte(ACK); //read the first byte (MSB)
> *(p_value) = s_read_byte(ACK); //read the second byte (LSB)
> *p_checksum = s_read_byte(noACK); //read checksum
> return error;
>}
>
>void fan(unsigned int average)
>{
>if(average>=29)
>{
>DDRC=0x01;
>PORTC=0x01;
>}
>else
>{
>DDRC=0x00;
>PORTC=0x00;
>}
>}
>
>
>
>
>
>
>int motor_flag=3;
>
>int motor(unsigned average)
>{
>int i,d;
>MOTOR_DDR = 0xff;
> if(average>=27 && (motor_flag==0 || motor_flag==3) )
> {
> ENABLE1_ON;
> ENABLE2_ON;
> DIR1_ON;
> DIR2_ON;
> for(i=0; i<5; i++){
> PWM1_ON;
> PWM2_ON; // PWM1 신호 1
> delay(2);
> PWM1_OFF;
> PWM2_OFF; // PWM1 신호 0
> delay(10000);
> }
> ENABLE1_OFF;
> ENABLE2_OFF;
> MOTOR_DDR = 0x00;
> motor_flag = 1;
> }
>
> else if(average<27 && (motor_flag==1 || motor_flag==3))
> {
> ENABLE1_ON;
> ENABLE2_ON;
> DIR1_OFF;
> DIR2_OFF;
> for(i=0; i<5; i++){
> PWM1_ON; // PWM1 신호 1
> PWM2_ON; // PWM1 신호 1
> delay(10000);
> PWM1_OFF;
> PWM2_OFF; // PWM1 신호 0
> delay(2);
> }
> ENABLE1_OFF;
> ENABLE2_OFF;
> MOTOR_DDR = 0x00;
> motor_flag =0;
> }
> else
> {}
> return 0;
>}
>
>
>
>
>
>
>
>
>
>void main(void)
>{
> char error=0,checksum;
> unsigned int i,te,hu,average;
> unsigned int temp;
> DDRB=0x03;
> init_devices();
> PORTF = 0x00;
> s_connectionreset(); // 시작 시그널을 보낸다.
> while (1)
> {
> error += s_measure((char*) &temp_val.i,&checksum,TEMP); //measure temperature(온도) 측정
> error += s_measure((char*) &humi_val.i,&checksum,HUMI); //measure humidity(습도) 측정
> startConvertion(0);
> temp = readConvertData();
> temp = (temp*5*10)/1024;
> if(error != 0)
> {
> s_connectionreset(),printf("error =%d \\n\\r",error); //오류가 있을시 오류문구 출력
> }
> else { //측정에 오류가 없을 경우 측정값을 계산하여 출력
> humi_val.f=(float)humi_val.i; //converts integer to float
> temp_val.f=(float)temp_val.i; //converts integer to float
> calc_sth75(&humi_val.f, &temp_val.f); //calculate humidity, temperature
> te=(int)temp_val.f;
> hu=(int)humi_val.f;
> average=(te+temp)/2;
> printf("%d C,%d%%\\n\\r",average,hu);
> fan(average);
> }
>
>
>
>
>
>motor(average);
>
>
>
>
> delay_us(1000);
> }
>}
>
>void calc_sth75(float *p_humidity ,float *p_temperature)
>{
> float rh; //rh: Humidity [Ticks] 12 Bit
> float t; //t: Temperature [Ticks] 14 Bit
> float rh_lin; //rh_lin: Humidity linear
> float rh_true; //rh_true: Temperature compensated humidity
> float t_C; //t_C : Temperature [.C]
>
> rh= *p_humidity; //rh: Humidity [Ticks] 12 Bit
> t = *p_temperature; //t: Temperature [Ticks] 14 Bit
> t_C= t*0.01 - 40-1.2; //calc. Temperature from ticks to [.C]
> rh_lin= C3*rh*rh + C2*rh + C1 ; //calc. Humidity from ticks to [%RH]
> rh_true= (t_C-25)*(T1+T2*rh)+rh_lin; //calc. Temperature compensated humidity [%RH]
> if(rh_true > 100) rh_true=100; //cut if the value is outside of
> if(rh_true < 0.1) rh_true=0.1; //the physical possible range
> *p_temperature= t_C; //return temperature [.C]
> *p_humidity= rh_true; //return humidity[%RH]
>}
>
>
>
>void delay_us(unsigned int t) //딜레이함수
>{
> us =0;
> while(us<t);
>}
>
>#pragma interrupt_handler timer0_ovf_isr:17
>void timer0_ovf_isr(void)
>{
> TCNT0 = 0xFC; //reload counter value
> us++;
>}
>
>int putchar(char c) //통신을 위한 설정
>{
> while (((UCSR0A>>UDRE0)&0x01) == 0) ; // UDRE, data register empty
> UDR0 = c;
> return c;
>}
>
>int getchar(void) //통신을 위한 설정
>{
> while ((UCSR0A & 0x80) == 0);
> return UDR0;
>}
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>/*
>
>//ICC-AVR application builder : 2005-05-06 오후 10:36:45
>// Target : M128
>// Crystal: 16Mhz
>
>#include <iom128v.h>
>#include <macros.h>
>
>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 = 0x03;
>}
>
>//UART0 initialize
>// desired baud rate: 9600
>// actual: baud rate:9600 (0.0%)
>// char size: 8 bit
>// parity: Disabled
>void uart0_init(void)
>{
> UCSR0B = 0x00; //disable while setting baud rate
> UCSR0A = 0x00;
> UCSR0C = 0x06;
>// UBRR0L = 0x2F; //set baud rate lo 7.3728 MHz
>// UBRR0L = 0x47; //set baud rate lo 11.0592 Mhz
> UBRR0L = 0x67; //set baud rate lo 16Mhz
>
> UBRR0H = 0x00; //set baud rate hi
> UCSR0B = 0x08;
>}
>
>//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(); // UART 0 초기화
>
> 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
>}
>
>#define MOTOR_PORT PORTD
>#define MOTOR_DDR DDRD
>#define PWM1_ON (MOTOR_PORT|=0x01)
>#define PWM1_OFF (MOTOR_PORT&=0xFE)
>#define DIR1_ON (MOTOR_PORT|=0x02)
>#define DIR1_OFF (MOTOR_PORT&=0xFD)
>#define ENABLE1_OFF (MOTOR_PORT|=0x04)
>#define ENABLE1_ON (MOTOR_PORT&=0xFB)
>#define PWM2_ON (MOTOR_PORT|=0x10)
>#define PWM2_OFF (MOTOR_PORT&=0xEF)
>#define DIR2_ON (MOTOR_PORT|=0x20)
>#define DIR2_OFF (MOTOR_PORT&=0xDF)
>#define ENABLE2_ON (MOTOR_PORT|=0x40)
>#define ENABLE2_OFF (MOTOR_PORT&=0xBF)
>
>
>void main (void)
>{
> int i;
> init_devices();
>
> MOTOR_DDR = 0xff; // 모터포트 초기화
> ENABLE1_ON;
>
> while(1){
> DIR1_ON; // Ch1 정방향
> DIR2_ON; // Ch2 정방향
>
> for(i=0; i<5; i++){ // 100 번 PWM 발생
> PWM1_ON; // PWM1 신호 1
> PWM2_ON; // PWM2 신호 1
> delay(200);
> PWM1_OFF; // PWM1 신호 0
> PWM2_OFF; // PWM2 신호 0
> delay(10000);
>
>
> }
>
> DIR1_OFF; // Ch1 역방향
> DIR2_OFF; // Ch2 역방향
>
> for(i=0; i<5; i++){ // 100 번 PWM 발생
> PWM1_ON; // PWM1 신호 1
> PWM2_ON; // PWM2 신호 1
> delay(100000);
> PWM1_OFF; // PWM1 신호 0
> PWM2_OFF; // PWM2 신호 0
> delay(200);
>
> }
> }
>
>}
>
>// 시간 지연 함수
>void delay(int n)
>{
> volatile int i,j;
> for(i=0;i<n;i++)
> {
> for(j=0;j<100;j++);
> }
>}
>
>*/
>
|
||||
| 5171 | 답변완료KR-SL16 | 오성석 | 2010-05-19 | 1,329 |
|
키트에서 쓰지 않는 포트를 이용해서
IR리모콘 제어나 할수 있습니까?
관리자 답변
안녕하세요
사용않는 포트로 연결해서 사용이 가능합니다.
수고하세요
>키트에서 쓰지 않는 포트를 이용해서
>IR리모콘 제어나 할수 있습니까?
|
||||
| 5170 | 답변완료예제소스질문 | 황선민 | 2010-05-19 | 1,410 |
|
가속도 센서 예제 소스에서 degree를 구하기 위해
while((ADCSRA & 0x10) != 0x10);
X[LOW] = ADCL;
X[HIGH] = ADCH;
X[HIGH] = X[HIGH]<<8;
X[3] = X[LOW] + X[HIGH];
X[3] = X[3] * ((3300/676)/2);
buf[2] = (X[3] & 0x3f00)>>8;
buf[3] = (X[3] & 0x00ff);
코드를 이렇게 수정했습니다 atmega128을 쓰고 있습니다
제대로 한건가요? 아니면 어떻게 해야하나요?
그리고
X[HIGH] = buf[2] = ADCH & 0x3f;
여기서 & 0x3f 는 왜 한건지 모르겠습니다
관리자 답변
>가속도 센서 예제 소스에서 degree를 구하기 위해
안녕하세요
>X[HIGH] = buf[2] = ADCH & 0x3f;
& 앤드 비트 연산자 입니다.
보통 필요한 비트만 골라낼때 사용합니다.
가속도 틸트 (기울기) 구하는 방법은 업로드된 문서를 참조 하시길 바랍니다.
수고하세요
>
>while((ADCSRA & 0x10) != 0x10);
>X[LOW] = ADCL;
>X[HIGH] = ADCH;
>X[HIGH] = X[HIGH]<<8;
>X[3] = X[LOW] + X[HIGH];
>X[3] = X[3] * ((3300/676)/2);
>buf[2] = (X[3] & 0x3f00)>>8;
>buf[3] = (X[3] & 0x00ff);
>
>코드를 이렇게 수정했습니다 atmega128을 쓰고 있습니다
>제대로 한건가요? 아니면 어떻게 해야하나요?
>
>그리고
>
>X[HIGH] = buf[2] = ADCH & 0x3f;
>
>여기서 & 0x3f 는 왜 한건지 모르겠습니다
|
||||
| 5169 | 답변완료AB-M128-B 전원관련 문의 입니다. | 문승모 | 2010-05-19 | 1,398 |
|
제가 이 제품을 LED제어로 사용하려고하는데요
LED를 대략 16~32개를 사용하려고 합니다.
DC 12V 어댑터를 사려는데 허용 전류가 어느정도인 것을 사용해야 할까요?
또 이렇게 LED를 사용하더라도 AVR에 무리는 가지않을지
궁금합니다~!
관리자 답변
안녕하세요
보통 일반LED 에서 소모하는 전류는 10~20mA 정도입니다.
최대소모량으로 계산하면 10개당 200mA 입니다.
12볼트에 1A사용하시면 될것 같네요
수고하세요
>제가 이 제품을 LED제어로 사용하려고하는데요
>
>LED를 대략 16~32개를 사용하려고 합니다.
>
>DC 12V 어댑터를 사려는데 허용 전류가 어느정도인 것을 사용해야 할까요?
>
>또 이렇게 LED를 사용하더라도 AVR에 무리는 가지않을지
>
>궁금합니다~!
|
||||
