Q&A
| 번호 | 제목 | 작성자 | 등록일 | 조회 |
|---|---|---|---|---|
| 5678 | 답변완료AVR MEGA 128pro 개발키트관련질문입니다. | 염태호 | 2010-09-10 | 1,421 |
|
AVR MEGA 128pro 개발키트에서 PORTG는 발광다이오드2개와 스위치2개로 연결되어있는데
다른포트처럼 따로 커넥터를 이용해 쓸수있는지 알고 싶습니다.
관리자 답변
안녕하세요
외부로 확장용 포트(10핀 박스컨넥터)로는 G포트는 나가지 않습니다.
G포는 IO 수는 일반포트(8개)보다 적어서 (5개)보드에 바로 사용됩니다. (스위치나 LED 용)
수고하세요
>AVR MEGA 128pro 개발키트에서 PORTG는 발광다이오드2개와 스위치2개로 연결되어있는데
>다른포트처럼 따로 커넥터를 이용해 쓸수있는지 알고 싶습니다.
|
||||
| 5677 | 답변완료11775 답변 다음글. JTAG 관련 핀들이네요. | 김용훈 | 2010-09-09 | 1,298 |
|
ab-m16-b의 회로도에는 안 나와 있던데, 데이터시트를 보니
JTAG 관련 핀들이네요. 퓨즈비트에서 Disable(0xD1EF)로 설정했는데도
왜 이 핀들이 JTAG에 연관하여 동작을 하죠?
퓨즈비트 말고도 설정해야할 부분이 있나요?
- 앞에서 당연히 DDRC = 0xFF;는 들어가 있죠.
관리자 답변
밑에 11775 다음 글입니다.
|
||||
| 5676 | 답변완료usb isp v03 질문입니다. | 윤동진 | 2010-09-09 | 1,303 |
|
현재 mega8L에 프로그램을 다운하려고 하는데
계속 칩 시그니쳐 미스매치가 납니다
그래서 usbisp만 꼽고 칩 시그니쳐를 읽어봤는데
사진처럼 나오는데 usbisp에 들어간 mcu로 보여지는 데 이게 맞는지 궁금하구요
mega8L과 이 칩에 시그니쳐가 겹쳐서 프로그램이 다운이 안되는거 같은데 어떻게 하면 좋을지 알고 싶습니다.
OS는 win7 ultimate 이고 컴파일러는 codevision을 사용했습니다.
관리자 답변
안녕하세요
하드웨어를 정상적으로 연결했다고 ,하면
FUSE 셋팅 잘못해서 칩을 사용할수없게 만들는 경우가 대부분입니다.
특히 코드비젼에서 자주 실수 하시던군요.
아래링크를 참조하세요
http://www.newtc.co.kr/board/view.php?id=qna&page=2&sn1=&divpage=3&sn=off&ss=on&sc=on&keyword=퓨즈&select_arrange=headnum&desc=asc&no=14070
mega8L 일경우 퓨즈비트값이 다릅니다. 데이터시트를 보시고 수정하시길 바랍니다.
0xD9EF < 아마 이것로 하시면 됩니다.
수고하세요
>현재 mega8L에 프로그램을 다운하려고 하는데
>
>계속 칩 시그니쳐 미스매치가 납니다
>
>그래서 usbisp만 꼽고 칩 시그니쳐를 읽어봤는데
>
>사진처럼 나오는데 usbisp에 들어간 mcu로 보여지는 데 이게 맞는지 궁금하구요
>
>mega8L과 이 칩에 시그니쳐가 겹쳐서 프로그램이 다운이 안되는거 같은데 어떻게 하면 좋을지 알고 싶습니다.
>
>OS는 win7 ultimate 이고 컴파일러는 codevision을 사용했습니다.
|
||||
| 5675 | 답변완료LCD 데이터 시트 알려주세요. | 박준성 | 2010-09-09 | 1,268 |
|
Serial LCD 420 모듈 (4*20)
AM-SLCD420
의 제품 구입했는데요.
모듈 이용하지 않고..
LCD 땜질해서.. 128에 물려 제작하는 거를 연습하고 싶습니다.
그래서 데이터 시트 요청합니다.
[email protected]
관리자 답변
안녕하세요
아래 링크를 참조하세요
http://www.newtc.co.kr/board/view.php?id=pds&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=lcd&select_arrange=headnum&desc=asc&no=51
수고하세요
>Serial LCD 420 모듈 (4*20)
>AM-SLCD420
>
>의 제품 구입했는데요.
>
>모듈 이용하지 않고..
>
>LCD 땜질해서.. 128에 물려 제작하는 거를 연습하고 싶습니다.
>
>그래서 데이터 시트 요청합니다.
>
>[email protected]
|
||||
| 5674 | 답변완료atmega128키트 이용 물수위 측정 | 신일권 | 2010-09-09 | 1,263 |
|
안녕하세요~
그림과 같이 페트 병에 구리조각을 꽂아서 물이 점점 줄어 들어서 물과 구리조각이 일치하게 되면
신호가 들어 오는것을 pc로 출력하는것이 가능 한가요???가능 하다면 어떤 방식으로 해야 하고
atmega128키트에서 포트및 설정을 어떻게 하는 건지 조언 부탁 드립니다. 참고로 물 이 줄어들어서
물의 양을 측정을 하는 실습입니다. 따로 센서 파는것은 가격이 너무 비싸서~
또한 가능하지 않다면 어떤 방법으로 하는게 좋을까요??
e-mail = [email protected]
관리자 답변
그림 훌륭합니다.짝짝짝.
|
||||
| 5673 | 답변완료Altera ByteBlaster II (FM-BB2) 제품 문의입니다. | 한대용 | 2010-09-09 | 1,286 |
|
1. 이제품을 보면 페러럴포트 연결부와 10핀 커넥터로 구성이 되있는데, 페러럴포트 연결부 내부에 바이트블러스터 관련 IC 회로들이 내장이 되있는건가요? 아니면 단순히 25핀 페러럴포트를 10핀으로 바꿔주는 역할만 하는건가요?
2. 이 제품을 다른 Altera FPGA(Cyclone III) 보드에서도 사용할 수 있나요?
관리자 답변
안녕하세요
1. 안에 신호레벨을 맞쳐주는 칩이 들어있습니다.
2. 이미지를 보시면 관련 디바이스들 입니다.
수고하세요
>1. 이제품을 보면 페러럴포트 연결부와 10핀 커넥터로 구성이 되있는데, 페러럴포트 연결부 내부에 바이트블러스터 관련 IC 회로들이 내장이 되있는건가요? 아니면 단순히 25핀 페러럴포트를 10핀으로 바꿔주는 역할만 하는건가요?
>
>2. 이 제품을 다른 Altera FPGA(Cyclone III) 보드에서도 사용할 수 있나요?
>
|
||||
| 5672 | 답변완료PORTC 출력에러 | 김용훈 | 2010-09-09 | 1,379 |
|
Atmega16을 이용하여 디지털 전압계를 만드는 중입니다. (ab-m16-b, icc-avr v7)
PORTC를 이용하여 FND(4401CSR)에 숫자를 표시하려는 데,
2 - 5번의 출력이 이상합니다.
2, 3, 5번은 1.5 - 2V, 4번은 0V 만을 출력합니다.
PORTC = 0x00; 이면
FND의 2,3,5번만 희미하게 불이 들어오고,
PORTC = 0xFF; 이면
FND의 2, 3, 4, 5번에 불이 불어오지 않습니다.
무엇이 문제일까요?
선의 연결, 프로그램을 단순화해서 테스트해보고, MCU를 바꿔봐도
마찬가지입니다.
해결방법 좀 알려주세요.
관리자 답변
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.
우선, 가지고 계신 ATMEGA16 킷트에 TL8과 같은 LED 8개 있는 보드를 연결하여, 본사에서 제공하는 예제로 포트 출력의 이상 유무를 테스트 하는 것이 좋겠습니다.
그렇게 하면 16킷트 포트의 이상 유무를 테스트 하실 수 있겠구요.
포트로 출력하려면, DDRC = 0xff로 두셔야 합니다. 그 이후에, PORTC에 값을 출력하셔야 하지요.
혹시 그 부분이 안된건 아닌지 체크 바랍니다.
그런 이후에, 부가하신 세븐세그먼트 회로를 검사하는 게 좋겠습니다.
수고하세요.
>Atmega16을 이용하여 디지털 전압계를 만드는 중입니다. (ab-m16-b, icc-avr v7)
>
>PORTC를 이용하여 FND(4401CSR)에 숫자를 표시하려는 데,
>
>2 - 5번의 출력이 이상합니다.
>
>2, 3, 5번은 1.5 - 2V, 4번은 0V 만을 출력합니다.
>
>PORTC = 0x00; 이면
>FND의 2,3,5번만 희미하게 불이 들어오고,
>
>PORTC = 0xFF; 이면
>FND의 2, 3, 4, 5번에 불이 불어오지 않습니다.
>
>무엇이 문제일까요?
>
>선의 연결, 프로그램을 단순화해서 테스트해보고, MCU를 바꿔봐도
>
>마찬가지입니다.
>
>해결방법 좀 알려주세요.
>
>
|
||||
| 5671 | 답변완료AM-CS2P (3A용) 궁금한게 있습니다. | 박경환 | 2010-09-08 | 1,310 |
|
안녕하세요
귀하의 AM-CS2P(3A) 스텝모터 제어모듈을 구입한 사람입니다.
스텝모터 2개를 구동하려고 하는 데요.
저희는 엘리베이터 2기의 스텝모터를 우선순위를 이용하여 구동할 계획인데..
가능할까요?
관리자 답변
안녕하세요? 고객님,
반갑습니다.
하드웨어적으로 충분히 지원됩니다.
다만, 소스만 잘 짜시면 되겠습니다.
본사의 예제를 참고하여 소스를 작성하면 편리합니다.
다만, 엘리베이터에 사용할 스텝모터의 토크 계산을 잘 하고, 그에 적절한 전압 전류를 충분히 모듈에 공급해 주어야 합니다.
수고하세요.
>안녕하세요
>
>귀하의 AM-CS2P(3A) 스텝모터 제어모듈을 구입한 사람입니다.
>
>스텝모터 2개를 구동하려고 하는 데요.
>
>저희는 엘리베이터 2기의 스텝모터를 우선순위를 이용하여 구동할 계획인데..
>
>가능할까요?
>
>
|
||||
| 5670 | 답변완료자이로센서 각도에 관련된 질문요 | 황경빈 | 2010-09-08 | 1,399 |
|
안녕하세요^^
위드로봇사의 mygyro300spi제품을 사용하고 있는 동양공전 2학년입니다.
위 제품을 사용해서 spi통신을 이용해서 16진수로 각가속도를 받는것까지는 구현 했는데요
지금 필요한건 각 가속도가 아니라 현재 각도에요
그러려면 샘플링을 해야하는데, 샘플링을 하려고 타이머 인터럽트를 쓰려고 합니다
근데 SREG의 I비트를 사용해야 타이머 인터럽트를 사용할 수 있는데
'sei()'를 써서 전체 인터럽트를 허용 하니까 spi때문인지 마이컴이 계속 리셋 되버리네요
그래서 'cli()'를 사용해서 다시 비허용을 해도 효과가 없네요
아래는 제 개발 환경입니다
MCU : Atmega128
C program : WinAvr에서 제공하는 programmer's notepad
UART : 'uart to usb'제품을 이용한 하이퍼 터미널
이하는 여기서 제공해준 소스에 타이머 인터럽트를 적용한 소스 입니다
아래 소스의 문제점은 문자'r'을 입력했을때 MCU가 계속 리셋 되는 것 입니다.
#include <avr/io.h>
#include <avr/interrupt.h>
// PC와의 통신을 위해 사용하는 UART를 위한 핀 설정.
// 사용하는 AVR 칩셋에 따라 IO 핀이 다르며, 이 소스는 ATMega8535를 기준으로
// 작성되어있다. 다른 칩셋을 사용하고자하는 경우 이곳에서 적절히 설정하면
// 소스 내부에서 일괄 적용된다.
#define UART_PORT_DIR_R DDRD
#define UART_TX_DIR DDD1
#define UART_RX_DIR DDD0
// SPI 통신에 사용되는 핀 설정.
#define SPI_PORT_DIR_R DDRB
#define SPI_PORT_R PORTB
#define SPI_CS_DIR DDB4
#define SPI_CS PB4
#define SPI_SCLK_DIR DDB7
#define SPI_SCLK PB7
#define SPI_TX_DIR DDB5
#define SPI_TX PB5
#define SPI_RX_DIR DDB6
#define SPI_RX PB6
// bit mask macro
#define BM(n) (1 << n)
// PC와의 통신을 위한 UART를 초기화한다.
// 사용하는 칩셋과 clock에 따라 수정해야할 필요가 있다.
void UART_Init(void)
{
UCSRA = 0;
UCSRB = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
UCSRC = _BV(UCSZ1)|_BV(UCSZ0);
UBRRL = (F_CPU/(9600*16L))-1;
UBRRH = 0;
}
// UART에서 한 바이트의 데이터를 수신하기까지 대기하며 기다린다.
unsigned char UART_GetChar(void)
{
while((UCSRA & BM(RXC)) == 0);
return UDR;
}
// UART를 통하여 한 바이트의 데이터를 송신한다.
void UART_PutChar(char data)
{
while((UCSRA & BM(UDRE)) == 0x00);
UDR = data;
}
void UART_Putstring(char *data)
{
while(*data)
{
UART_PutChar(*data);
data++;
}
}
#define SPI_CS_ASSERT() SPI_PORT_R &= ~BM(SPI_CS)
#define SPI_CS_DEASSERT() SPI_PORT_R |= BM(SPI_CS)
// SPI 통신 초기화.
void SPI_Init(void)
{
// CS, SCLK, TX - output, RX - input
SPI_PORT_DIR_R = BM(SPI_CS_DIR) | BM(SPI_SCLK_DIR) | BM(SPI_TX_DIR);
// CS 핀을 high로 설정한다 -> mygyro300SPI의 SPI 모듈 초기화.
SPI_CS_DEASSERT();
// SPI enable with master mode, CPOL=1, CPHA=0, clk=Fosc/8=1MHz
SPCR = BM(SPE) | BM(MSTR) | BM(CPOL) | BM(SPR0);
// clk=Fosc/8
SPSR = BM(SPI2X);
}
// 16비트로 구성된 명령을 송신하고, 그에따른 return 값을 읽어온다.
void SPI_Cmd(unsigned int cmd, unsigned int *data)
{
SPDR = cmd >> 8; // high byte를 먼저 송신.
while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
*data = SPDR << 8; // 수신된 데이터를 저장. 이 데이터는 high byte이다.
SPDR = cmd & 0xff; // low byte를 송신.
while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
*data |= SPDR; // 수신된 low byte를 저장.
}
void Tx_Hex1(char bSentData) //16진수 출력을 위한 함수
{
char bTmp;
bTmp =((char)(bSentData>>4)&0x0f) + 0X30;
if(bTmp > '9') bTmp += 7;
UART_PutChar(bTmp);
bTmp =(char)(bSentData & 0x0f) + 0X30;
if(bTmp > '9') bTmp += 7;
UART_PutChar(bTmp);
}
//
ISR(TIMER0_OVF_vect)
{
TCNT0 = 0X83; //256-125=131
cli();
}
void timer_init()
{
TCCR0 = 0x0B; //CTC mode, CK/64
OCR0 = 0xff; //255까지 카운터 후 리셋
TIMSK = 0x01; //오버 플로우 인터럽트 허용
}
//
int main(void)
{
unsigned char c, wait_cnt = 0, bTmp;
int data, temp;
UART_Init(); // UART 초기화.
SPI_Init(); // SPI 모듈 초기화.
UART_PutChar('\\f');
UART_Putstring("통신시작!!!\\n\\r");
timer_init();
sei();
while(1)
{
c = UART_GetChar(); // PC에서 명령이 들어올 때 까지 대기.
if (c == 'r') // 수신된 명령이 'r'이면
{
SPI_CS_ASSERT(); // CS를 low로 떨어트려서 SPI 통신 시작.
SPI_Cmd(0x8310, &data); // myGyro300SPI에서 각속도 값을 읽어온다.
SPI_CS_DEASSERT(); // CS를 high로 올려주면서 SPI 통신 종료.
data -= (0x800-0x1B);//0x1B는 실측을 통한 오차 보정용 상수
UART_Putstring("각속도 값 : ");
if(data < 0)
{
data = ~data;
UART_PutChar('-');
}
else
{
UART_PutChar('+');
}
Tx_Hex1(data>>8);
Tx_Hex1(data);
c=0;
}
}
}
어떻게 해야 두개의 인터럽트를 동시에 사용 할 수 있을까요?
제품 이상은 아니지만 그래도 성실한 답변 부탁드립니다
관리자 답변
안녕하세요?
본사에도 판매중인 자이로 센서가 있습니다. 타사 제품은 저희가 예제가 없어서, 도와드리기 어렵구요. 본사 제품 기준으로 각도를 계산해 내는 예제를 올려드립니다.
타사 제품은 아무래도 제조사에 문의하여 보시는 것이 좋겠습니다.
각속도를 뽑아내는 데 성공하셨다면, 아래의 본사 소스를 이용하여 각도로 환산해 내면 될 것 같습니다. 다만, 본사에서 소스 디버깅을 직접 해 드리지는 않음을 양해 해 주시기 바랍니다.
( 소스의 목적)
아래소스는 3.3V 기준 전압으로 0~3.3V 사이를 AD하여 계산하는 자이로센서로 각도 구하는 소스입니다. 5V 기준 전압시는 아래 소스 설명을 참고하여, 수정하여 사용하세요.
( 소스 설명 )
1. AVR adc 전압 스케일이 3.3 볼트 일때 vref(계산을 위해 mV 로변경)기준으로 계산합니다.
- 1024는 adc의 1024단계의 분해능을 의미
- 3300mV adc의 vref인 3.3V를 의미함
2. 1024 분해능에서 1 변동할때의 전압값(Vref = 3.3V) : 3300mV / 1024 = 3.22265625mV
* 참고적으로 1024 분해능에서 1 변동할때의 전압값(Vref = 5V)
( 0~5V 사이를 AD 하고, 실제로는 0~3.3V를 사용하므로, 분해능의 단계수를 다시 계산해야합니다. 즉, 3.3/(5/1024) = 675.84 단계 약 676 값이 3.3 볼트입니다. 0~3.3V의 값을 보려면, 0~676의 값으로 계산하면 됩니다.
1024 분해능에서 1 변동할때의 전압값(Vref = 5V) : 3300mV / 676 = 4.8816568mV
)
3. 감도(Sensitivity) 값 관련
AM-GYRO V01 ( 즉, IDG300)의 감도(Sensitivity) 2mV/degree/sec
AM-GYRO V02 (즉, IDG650)의 감도(Sensitivity) 0.5mV/degree/sec
4. 최종적인 각도 계산을 위한 Scale Vector 값 관련
AM-GYRO V01 ( 즉, IDG300) 이용시,
- 1024 분해능에서 1 변동할때의 각속도 값(Vref = 3.3V) :
3.22265625 mV / ( 2mV/degree/sec) = 1.611328125 degree/sec
- 1024 분해능에서 1 변동할때의 각속도 값(Vref = 5V) :
4.8816568mV / ( 2mV/degree/sec) = 2.4408284 degree/sec
AM-GYRO V02 ( 즉, IDG650) 이용시,
- 1024 분해능에서 1 변동할때의 각속도 값(Vref = 3.3V) :
3.22265625 mV / ( 0.5mV/degree/sec) = 6.4453125 degree/sec
- 1024 분해능에서 1 변동할때의 각속도 값(Vref = 5V) :
4.8816568mV / ( 0.5mV/degree/sec) = 9.7533136 degree/sec
5. 즉, 정리하여 보면, 각속도 구하는 기본식은
( 각속도 초기 adc값 - 센서 회전된 adc 값 ) * scale vector
여기서 adc 샘플링 시간을 누적시키면 각도가 됩니다.(적분)
adc 샘플링 주기가 예로 0.01초이면
degree += (( 각속도 초기 adc값 - 센서 회전된 adc 값 ) * scale vector ) * 0.01sec
수고하세요~
- 아래 -
#include <iom128v.h>
#include <macros.h>
#include <stdio.h>
#define SCALE_FACTOR 1.611328125
#define TIME 0.01
#define OFF_SET 458
//590.5611
int value = 0;
float value_sum = 0;
float offset;
float angular_acceleration[50];
float angular_average = 0;
float before_angle = 0;
float after_angle = 0;
float angle_factor = 0;
char adc_flag = 0;
char time_flag = 0;
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;
}
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1KHz
// actual value: 1.000KHz (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT0 = 0x06; //set count
OCR0 = 0xFA;
TCCR0 = 0x04; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0 = 0x06; //reload counter value
PORTG ^= 1;
ADCSRA |= 0x40;
}
//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 100Hz
// actual value: 100.000Hz (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xB1; //setup
TCNT1L = 0xE0;
OCR1AH = 0x4E;
OCR1AL = 0x20;
OCR1BH = 0x4E;
OCR1BL = 0x20;
OCR1CH = 0x4E;
OCR1CL = 0x20;
ICR1H = 0x4E;
ICR1L = 0x20;
TCCR1A = 0x00;
//TCCR1B = 0x02; //start Timer
}
#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xB1; //reload counter high value
TCNT1L = 0xE0; //reload counter low value
//PORTG ^= 2;
time_flag = 1;
}
//UART0 initialize
// desired baud rate: 115200
// actual: baud rate:111111 (3.7%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x08; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0x18;
}
// printf ?
int putchar(char c)
{
while (((UCSR0A>>UDRE0)&0x01) == 0) ; // UDRE, data register empty
UDR0 = c;
return c;
}
// scanf
int getchar(void)
{
while ((UCSR0A & 0x80) == 0);
return UDR0;
}
//ADC initialize
// Conversion time: 104uS
void adc_init(void)
{
ADCSRA = 0x00; //disable adc
ADMUX = 0x00; //select adc input 0
ACSR = 0x80;
ADCSRA = 0x8F;
}
#pragma interrupt_handler adc_isr:iv_ADC
void adc_isr( void )
{
//conversion complete, read value (int) using...
value = ADCL; //Read 8 low bits first (important)
value |= ( int )ADCH << 8; //read 2 high bits and shift into top byte
adc_flag++;
value_sum += value;
if(adc_flag >=1 )
TCCR0 = 0x00; //stop
//printf( "\\r\\n ADC = %d", value );
}
//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();
timer0_init();
timer1_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EICRB = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK = 0x01; //timer interrupt sources
TIMSK = 0x04; //timer interrupt sources
TIMSK = 0x05; //timer interrupt sources
ETIMSK = 0x00; //extended timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
void delay ( unsigned int cnt )
{
unsigned int i,j;
for( i=0 ; i< cnt ; i++ )
for( j=0 ; j< 1000 ; j++ );
}
void main (void)
{
int i;
int temp;
init_devices();
printf( "\\r\\n GYRO..QQ");
printf( "\\r\\n ADCSRA = 0x%x", ADCSRA );
printf( "\\r\\n ADMUX = 0x%x", ADMUX );
printf( "\\r\\n ACSR = 0x%x", ACSR );
delay( 1000 );
for( i=0 ; i<100 ; i ++ )
angular_acceleration[i] = 0;
ADMUX = 0x00;
ADCSRA |= 0x40;
offset = 0;
for( i=0 ; i<50 ; )
{
if ( adc_flag )
{
temp = value;
offset += value;
adc_flag = 0;
ADCSRA |= 0x40;
//printf( "\\r\\n $$ = %d", value );
i ++ ;
}
}
offset = (int)(offset / 50);
printf( "\\r\\n offset = %f", offset );
//for( i=0 ; i<50 ; i ++ )
// angular_acceleration[i] = offset;
delay( 2000 );
delay( 2000 );
TCCR1B = 0x02; //start Timer
TCCR0 = 0x05; //start timer
value_sum = 0;
adc_flag = 0;
while(1)
{
//delay( 1000 );
if( time_flag )
{
PORTG |= 0x02;
value_sum = value_sum / adc_flag;
angular_acceleration[0] = (( float )( (int)(value_sum) - offset )) * SCALE_FACTOR;
after_angle = before_angle + ( angular_acceleration[9] + angular_acceleration[8] + angular_acceleration[7] + angular_acceleration[6] + angular_acceleration[5] + angular_acceleration[4] + angular_acceleration[3] + angular_acceleration[2] + angular_acceleration[1] + angular_acceleration[0] ) / 10;
angle_factor = after_angle * TIME;
before_angle = after_angle;
for( i=0 ; i<9 ; i ++ )
{
angular_acceleration[i+1] = angular_acceleration[i];
//printf ( " nangle = %.2f", angular_acceleration[i]);
}
printf ( "\\r\\n X_angle = %.2f", angle_factor);
angular_average = 0;
adc_flag = 0;
value_sum = 0;
time_flag = 0;
TCCR0 = 0x05;
}
PORTG &= 0xfd;
}
}
>안녕하세요^^
>
>위드로봇사의 mygyro300spi제품을 사용하고 있는 동양공전 2학년입니다.
>
>위 제품을 사용해서 spi통신을 이용해서 16진수로 각가속도를 받는것까지는 구현 했는데요
>
>지금 필요한건 각 가속도가 아니라 현재 각도에요
>
>그러려면 샘플링을 해야하는데, 샘플링을 하려고 타이머 인터럽트를 쓰려고 합니다
>
>근데 SREG의 I비트를 사용해야 타이머 인터럽트를 사용할 수 있는데
>
>'sei()'를 써서 전체 인터럽트를 허용 하니까 spi때문인지 마이컴이 계속 리셋 되버리네요
>
>그래서 'cli()'를 사용해서 다시 비허용을 해도 효과가 없네요
>
>아래는 제 개발 환경입니다
>
>MCU : Atmega128
>
>C program : WinAvr에서 제공하는 programmer's notepad
>
>UART : 'uart to usb'제품을 이용한 하이퍼 터미널
>
>이하는 여기서 제공해준 소스에 타이머 인터럽트를 적용한 소스 입니다
>
>아래 소스의 문제점은 문자'r'을 입력했을때 MCU가 계속 리셋 되는 것 입니다.
>
>#include <avr/io.h>
>#include <avr/interrupt.h>
>
>// PC와의 통신을 위해 사용하는 UART를 위한 핀 설정.
>// 사용하는 AVR 칩셋에 따라 IO 핀이 다르며, 이 소스는 ATMega8535를 기준으로
>// 작성되어있다. 다른 칩셋을 사용하고자하는 경우 이곳에서 적절히 설정하면
>// 소스 내부에서 일괄 적용된다.
>#define UART_PORT_DIR_R DDRD
>#define UART_TX_DIR DDD1
>#define UART_RX_DIR DDD0
>
>// SPI 통신에 사용되는 핀 설정.
>#define SPI_PORT_DIR_R DDRB
>#define SPI_PORT_R PORTB
>#define SPI_CS_DIR DDB4
>#define SPI_CS PB4
>#define SPI_SCLK_DIR DDB7
>#define SPI_SCLK PB7
>#define SPI_TX_DIR DDB5
>#define SPI_TX PB5
>#define SPI_RX_DIR DDB6
>#define SPI_RX PB6
>
>// bit mask macro
>#define BM(n) (1 << n)
>
>// PC와의 통신을 위한 UART를 초기화한다.
>// 사용하는 칩셋과 clock에 따라 수정해야할 필요가 있다.
>void UART_Init(void)
>{
>UCSRA = 0;
>UCSRB = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
>UCSRC = _BV(UCSZ1)|_BV(UCSZ0);
>UBRRL = (F_CPU/(9600*16L))-1;
>UBRRH = 0;
>}
>
>// UART에서 한 바이트의 데이터를 수신하기까지 대기하며 기다린다.
>unsigned char UART_GetChar(void)
>{
>while((UCSRA & BM(RXC)) == 0);
>return UDR;
>}
>
>// UART를 통하여 한 바이트의 데이터를 송신한다.
>void UART_PutChar(char data)
>{
>while((UCSRA & BM(UDRE)) == 0x00);
>UDR = data;
>}
>
>void UART_Putstring(char *data)
>{
>while(*data)
>{
>UART_PutChar(*data);
>data++;
>}
>}
>
>#define SPI_CS_ASSERT() SPI_PORT_R &= ~BM(SPI_CS)
>#define SPI_CS_DEASSERT() SPI_PORT_R |= BM(SPI_CS)
>
>// SPI 통신 초기화.
>void SPI_Init(void)
>{
>// CS, SCLK, TX - output, RX - input
>SPI_PORT_DIR_R = BM(SPI_CS_DIR) | BM(SPI_SCLK_DIR) | BM(SPI_TX_DIR);
>
>// CS 핀을 high로 설정한다 -> mygyro300SPI의 SPI 모듈 초기화.
>SPI_CS_DEASSERT();
>
>// SPI enable with master mode, CPOL=1, CPHA=0, clk=Fosc/8=1MHz
>SPCR = BM(SPE) | BM(MSTR) | BM(CPOL) | BM(SPR0);
>
>// clk=Fosc/8
>SPSR = BM(SPI2X);
>}
>
>// 16비트로 구성된 명령을 송신하고, 그에따른 return 값을 읽어온다.
>void SPI_Cmd(unsigned int cmd, unsigned int *data)
>{
>SPDR = cmd >> 8; // high byte를 먼저 송신.
>while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
>*data = SPDR << 8; // 수신된 데이터를 저장. 이 데이터는 high byte이다.
>
>SPDR = cmd & 0xff; // low byte를 송신.
>while(!(SPSR & 0x80)); // 송신 완료될때까지 대기.
>*data |= SPDR; // 수신된 low byte를 저장.
>}
>
>void Tx_Hex1(char bSentData) //16진수 출력을 위한 함수
>{
>char bTmp;
>
>bTmp =((char)(bSentData>>4)&0x0f) + 0X30;
>if(bTmp > '9') bTmp += 7;
>UART_PutChar(bTmp);
>bTmp =(char)(bSentData & 0x0f) + 0X30;
>if(bTmp > '9') bTmp += 7;
>UART_PutChar(bTmp);
>}
>//
>ISR(TIMER0_OVF_vect)
>{
>TCNT0 = 0X83; //256-125=131
>cli();
>}
>
>void timer_init()
>{
>TCCR0 = 0x0B; //CTC mode, CK/64
>OCR0 = 0xff; //255까지 카운터 후 리셋
>TIMSK = 0x01; //오버 플로우 인터럽트 허용
>}
>//
>int main(void)
>{
>unsigned char c, wait_cnt = 0, bTmp;
>int data, temp;
>
>UART_Init(); // UART 초기화.
>SPI_Init(); // SPI 모듈 초기화.
>UART_PutChar('\\f');
>UART_Putstring("통신시작!!!\\n\\r");
>timer_init();
>sei();
>while(1)
>{
>c = UART_GetChar(); // PC에서 명령이 들어올 때 까지 대기.
>if (c == 'r') // 수신된 명령이 'r'이면
>{
>SPI_CS_ASSERT(); // CS를 low로 떨어트려서 SPI 통신 시작.
>SPI_Cmd(0x8310, &data); // myGyro300SPI에서 각속도 값을 읽어온다.
>SPI_CS_DEASSERT(); // CS를 high로 올려주면서 SPI 통신 종료.
>
>data -= (0x800-0x1B);//0x1B는 실측을 통한 오차 보정용 상수
>
>UART_Putstring("각속도 값 : ");
>if(data < 0)
>{
>data = ~data;
>UART_PutChar('-');
>}
>else
>{
>UART_PutChar('+');
>}
>
>Tx_Hex1(data>>8);
>Tx_Hex1(data);
>
>c=0;
>}
>}
>}
>
>어떻게 해야 두개의 인터럽트를 동시에 사용 할 수 있을까요?
>
>제품 이상은 아니지만 그래도 성실한 답변 부탁드립니다
|
||||
| 5669 | 답변완료스테핑 라인트레이서 키트 소스 문의 | 박종원 | 2010-09-08 | 1,134 |
|
안녕하십니까?
AVR 공부를 위해서 스테핑 라인트레이서 키트(KR-SL16)관련 부품 구매를 했습니다.
뉴티씨 부품을 따로 구매를 해서 조립을 했는데 초보라서 프로그램작성 실력 부족으로
사용을 못하고 있습니다. 죄송하지만 소스를 메일로 부탁드립니다.
[email protected]
관리자 답변
안녕하세요? 고객님,
죄송하지만, 현재 판매되는 제품의 예제 소스는 구매시에만 CD에 담겨서 나가고 있습니다.
하지만, 참고하실 수 있는 예제 소스를 보내드리오니, 참고하셔서 작업하시면 되겠습니다.
- 아래 -
http://www.newtc.co.kr/board/zboard.php?id=pds&page=1&select_arrange=headnum&desc=asc&category=&sn=off&ss=on&sc=off&keyword=16&sn1=&divpage=1
수고하세요.
>안녕하십니까?
>AVR 공부를 위해서 스테핑 라인트레이서 키트(KR-SL16)관련 부품 구매를 했습니다.
>뉴티씨 부품을 따로 구매를 해서 조립을 했는데 초보라서 프로그램작성 실력 부족으로
>사용을 못하고 있습니다. 죄송하지만 소스를 메일로 부탁드립니다.
>
>[email protected]
>
|
||||
| 5668 | 답변완료죄송하지만 winavr 4버젼 사용법좀 갈켜주시면 감사하겟습니다. | 제어인 | 2010-09-08 | 1,254 |
|
계속 오류가 떠서 미치겟습니다. 사진은 이러와 같습니다. 씨치고 빌드시키면 이렇게 뜹니다.
관리자 답변
안녕하세요
착각하시듯한데요
winavr 4 << 이런한 툴을 없습니다.
winavr + avr studio 2개툴을 깔아서 사용해야 합니다.
에러내용 컴파일러(winavr)가 없다는 내용같아 보입니다.
winavr + avr studio 깔아서 사용하는 방법은 검색엔진에서 찾아보시면 많이 나와있습니다.
http://search.naver.com/search.naver?where=nexearch&query=winavr+%2B+avr+studio&sm=top_hty&fbm=1
수고하세요
>계속 오류가 떠서 미치겟습니다. 사진은 이러와 같습니다. 씨치고 빌드시키면 이렇게 뜹니다.
|
||||
| 5667 | 답변완료usb-isp 관련 질문입니다. | 강신영 | 2010-09-07 | 1,237 |
|
제 컴퓨터에 프린트 포트가 없어서 usb-isp 살려고하는데
atmega8535랑 호환이 되는지 궁금합니다. 그리고 안된다면 호환되는 제품 추천해주시면 안될까요?
관리자 답변
안녕하세요
USBISP은 8비트 avr 코어를 적용된 모든 디바이스를 지원합니다.
atmega8535도 당연히 적용됩니다.
AD-USBISP-L
AD-USBISP
두제품의 차이는 뉴얼을 보시면 자세히 나와있습니다.
동일한제품이고 변환보드가 추가된 제품이 AD-USBISP입니다.
변환보드가 필요 없으면 AD-USBISP-L 로 사용하시면 됩니다.
수고하세요
>제 컴퓨터에 프린트 포트가 없어서 usb-isp 살려고하는데
>
>atmega8535랑 호환이 되는지 궁금합니다. 그리고 안된다면 호환되는 제품 추천해주시면 안될까요?
|
||||
| 5666 | 답변완료USB미니 모튤사용법. | 윤종혁 | 2010-09-07 | 1,478 |
|
USB 미니 모듈을 구입하였습니다.
홈페이지에서 제공하는 예제로는 사용이 가능한데
Agilent I/O나 National I/O아니면 Agilnet VEE 같은 프로그램으로
GPIO채널을 컨트롤 하고 싶은데 가능한가요??.
혹시 가능하다면 어떻게 사용해야 하는지 알려주세요...
P.s
이 쪽은 문외안이라..
좀 자세한 설명이나 강좌 있으면 알려주세요..
부탁드립니다.
수고하세요..
관리자 답변
안녕하세요
제공되는 예제는 그칩의 드라이버가 있어 i/o 콘트롤이 가능한것입니다.
죄송하지만 칩사에서도 그툴에 제공되는 예제가 없습니다.
그 툴사에 usb 관련된 문의를 해보세요
수고하세요
>USB 미니 모듈을 구입하였습니다.
>홈페이지에서 제공하는 예제로는 사용이 가능한데
>
>Agilent I/O나 National I/O아니면 Agilnet VEE 같은 프로그램으로
>GPIO채널을 컨트롤 하고 싶은데 가능한가요??.
>혹시 가능하다면 어떻게 사용해야 하는지 알려주세요...
>
>P.s
>이 쪽은 문외안이라..
>좀 자세한 설명이나 강좌 있으면 알려주세요..
>부탁드립니다.
>
>수고하세요..
|
||||
| 5665 | 답변완료usbisp요! | 한희주 | 2010-09-05 | 1,281 |
|
아 뉴티시에서 파는 usbisp모듈 사서 avr 실험하다가요
uart4개핀에다가 모르고 6개핀잭을 잘못연결해버렸는데
다시 뺴긴했는데 그 이후로 usbisp에 파랑색불이 안들어오네요...
전원연결하고 컴터에 연결하면 그저 노랑색불만 깜빡깜빡...
그리고 컴퓨터에서도 연결은해도 인식을 못하네요...
어떻게해야하나요;; 아예고장난건가요?
관리자 답변
안녕하세요
ISP 선 6개 를 잘못 연결하면 망기질수도 있습니다.
데에터선인 (SCK,reset,MISO,MOSI) 잘못연결해도 망가지지는 않습니다. 그러나
특히 전원 관련 2선을 잘못연결하면 바로 망가집니다...
A/S 관련링크 입니다.
http://www.newtc.co.kr/board/view.php?id=faq&page=1&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=5
수고하세요
>아 뉴티시에서 파는 usbisp모듈 사서 avr 실험하다가요
>
>uart4개핀에다가 모르고 6개핀잭을 잘못연결해버렸는데
>
>다시 뺴긴했는데 그 이후로 usbisp에 파랑색불이 안들어오네요...
>
>전원연결하고 컴터에 연결하면 그저 노랑색불만 깜빡깜빡...
>
>그리고 컴퓨터에서도 연결은해도 인식을 못하네요...
>
>어떻게해야하나요;; 아예고장난건가요?
|
||||
| 5664 | 답변완료atmega128 pro 와 LCD 에 관해서 | 김동환 | 2010-09-03 | 1,314 |
|
안녕하십니까.
이제 atmega128 pro로 시작하는 초보입니다.
LCD를 연결하고 싶은데 호환되는 LCD는 어떤 것들이 있는지 가르켜 주십시오.
AM-SLCD216, AM-SLCD420, AM-SLCD420BL (Serial LCD 4*20 블루 모듈),
Grahpic LCD 모듈 [AM-GLCD-P], TEXT LCD 플러스 모듈 (AM-TLCD-P)
이 모든게 다 되는 것인지 아니면 호환되는 LCD가 따로 있는지요
수고하십시오.
관리자 답변
안녕하세요? 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.
아래에 말씀하신 LCD는 모두 다 사용이 가능합니다.
그리고, 특별히 호환된다 라고 말하는 것은 아닙니다. 어떤 LCD이든지 128로 사용은 가능합니다.
다만, 신호 레벨이나 이런 것들을 맞춰줘야 하는 경우가 있는 것이지요.
텍스트 LCD(또는 Character LCD) 나 STN과 같은 것들은 128 등으로 충분히 제어 가능합니다.
TFT LCD 같은 경우는 컨트롤러를 내장한 모델은 직접 제어 가능하지만,
그렇지 않은 것은 직접 제어하는 것은 쉽지가 않습니다. 좀 더 빠른 클럭을 사용하는 암 프로세서 정도 사용하는 것이 좋겠지요.
본사의 제대로 LCD를 공부해 보고 싶다면, 본사의 128 킷트나 보드를 사용하고, AM-GLCD-P와 AM-TLCD-P 등을 이용하여 공부하는 것을 추천해 드립니다.
수고하세요.
>안녕하십니까.
>
>이제 atmega128 pro로 시작하는 초보입니다.
>
>LCD를 연결하고 싶은데 호환되는 LCD는 어떤 것들이 있는지 가르켜 주십시오.
>
>AM-SLCD216, AM-SLCD420, AM-SLCD420BL (Serial LCD 4*20 블루 모듈),
>Grahpic LCD 모듈 [AM-GLCD-P], TEXT LCD 플러스 모듈 (AM-TLCD-P)
>이 모든게 다 되는 것인지 아니면 호환되는 LCD가 따로 있는지요
>
>수고하십시오.
|
||||
