BASIC4MCU | 질문게시판 | atmega2560에 관하여 질문드립니다.
페이지 정보
작성자 희안 작성일2018-02-07 11:43 조회5,574회 댓글0건본문
수신기(RX701)를 ATmega2560에 연결하여 조종기(DEVO7)에서 입력을 넣어준 후,
수신기로부터 받아오는 값을 UART를 통해 확인하고자 합니다.
헌데 TCNT1H와 TCNT1L를 합치는 부분에서 문제가 발생하는 것인지
출력되는 값이 안정되지 않고 지속적으로 변동됩니다.
레지스터 설정은 계속해서 확인해 봤지만 틀린 부분이 보이지 않았습니다.TCNT1이 없어서 TCNT1H,TCNT1L을 사용하는데 아래와 같이 쓰면 안되는건가요? ㅠㅠ
MCU는 ATmega2560이고 코딩은 Codevision을 통해서 하고 있으며 UART를 통한 확인은 ComPortMaster란 프로그램을 통해 하고 있습니다.
#include <mega2560.h>
#include <stdio.h>
#include <stdlib.h>
#include <delay.h>
#include <string.h>
#include <math.h>
typedef unsigned char byte;
volatile long int cnt_rising = 0;
volatile long int cnt_falling = 0;
volatile long int cnt_elev = 0;
volatile long int cnt_aile = 0;
volatile long int cnt_thro = 0;
volatile long int cnt_rudd = 0;
//Receiver Port Setting
void Port_init()
{
DDRD = 0b00000000; //입력 설정
PORTD = 0b00001100; //INT2, 3
DDRE = 0b00000000; //입력 설정
PORTE = 0b11000000; //INT6, 7
EIMSK = 0b11001100; //INT2, 3, 6, 7
EICRA = 0b11110000; //INT2, 3 rising edge
EICRB = 0b11110000; //INT6, 7 rising edge
}
interrupt [EXT_INT2] void ext_int2_isr(void) //ELEV Channel
{
if(EICRA == 0b11110000){
cnt_rising = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
EICRA = 0b11100000;
}
else{
cnt_falling = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
cnt_elev = (40000 - cnt_rising + cnt_falling) %40000;
EICRA = 0b11110000;
}
}
interrupt [EXT_INT3] void ext_int3_isr(void) //AILE Channel
{
if(EICRA == 0b11110000){
cnt_rising = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
EICRA = 0b10110000;
}
else{
cnt_falling = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
cnt_aile = (40000 - cnt_rising + cnt_falling) %40000;
EICRA = 0b11110000;
}
}
interrupt [EXT_INT6] void ext_int6_isr(void) //THRO Channel
{
if(EICRB == 0b11110000){
cnt_rising = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
EICRB = 0b11100000;
}
else{
cnt_falling = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
cnt_thro = (40000 - cnt_rising + cnt_falling) %40000;
EICRB = 0b11110000;
}
}
interrupt [EXT_INT7] void ext_int7_isr(void) //RUDD Channel
{
if(EICRB == 0b11110000){
cnt_rising = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
EICRB = 0b10110000;
}
else{
cnt_falling = (unsigned long)((unsigned long)TCNT1H << 8 | (unsigned long)TCNT1L);
cnt_rudd = (40000 - cnt_rising + cnt_falling) %40000;
EICRB = 0b11110000;
}
}
//Timer
void Timer1_init()
{
DDRB |= 0b11111111;
TCCR1A = 0b10100010;
TCCR1B = 0b00011001;
ICR1H = 39999 >> 8;
ICR1L = 39999 & 0xFF;
}
void Timer3_init()
{
DDRE |= 0b00110000;
TCCR3A = 0b10100010;
TCCR3B = 0b00011001;
ICR3H = 39999 >> 8;
ICR3L = 39999 & 0xFF;
}
void main(void)
{
Port_init();
Timer1_init();
Timer3_init();
DDRE |= 0x02;
UCSR0A |= 0x00;
UCSR0B |= 0x18;
UCSR0C |= 0x06;
UBRR0H = 0x00;
UBRR0L = 0x67;
UDR0 = 0x00;
SREG |= 0x80;
while(1)
{
printf("ELEV : %6ld / AILE : %6ld / THRO : %6ld / RUDD : %6ld\n", cnt_elev, cnt_aile, cnt_thro, cnt_rudd);
}
}
댓글 0
조회수 5,574등록된 댓글이 없습니다.