Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Проблемы с отправкой данных с COM-порта в МК

Отправлено techmike 28 июля 2008 г. 16:26


Появилась проблема с COM- портом при работе с mega16+8МГц кварц.
Mega подключена через классическую схему на MAX232 к COM-порту и с определенного момента, не зависит от прошивки или внешний условий, МК перестает принимать команды по USART.
Причем закорачиваю перемычкой RX-TX на шнурке от COM-порта, но в терминали(Hyper Terminal, ZOC и т.д.) все равно не приходит посылаемый символ. Тоже самое делаю после MAX-232, результат тот же. От МК при этом RX-TX отключаю.
Пробовал обрабатывать данные от USART не по прерыванию, а просто в цикле, все равно не возвращает посылаемый с терминала символы.
Текс программы с прерыванием:


void USART_Init(unsigned int baud )
{
#define UBRRVAL ((F_CPU/(baud*16UL))-1)
//Set baud rate
UBRRL=UBRRVAL; //low byte
UBRRH=(UBRRVAL>>8); //high byte
//Set data frame format: asynchronous mode,no parity, 1 stop bit, 8 bit size
UCSRC=(1<<URSEL)|(0<<UMSEL)|(0<<UPM1)|(0<<UPM0)| (0<<USBS)|(0<<UCSZ2)|(1<<UCSZ1)|(1<<UCSZ0);
//Enable Transmitter and Receiver
UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE);
}

void USART_Send( unsigned int Txt )
{
while (!(UCSRA&(1<<UDRE))){};
UDR=Txt; //send number to USART
}

SIGNAL (SIG_USART_RECV)
{
char status,data;
status=UCSRA;
data=UDR;
led2_test_on;
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
led2_test_off;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
rx_wr_index ++; // инкремент индекса
if (rx_wr_index == RX_BUFFER_SIZE)
{
rx_wr_index=0;
};

++rx_counter;
if (rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};

if (data==13){
EnterPress=1;
}
USART_Send(data);
};
}
int main(void)
{
// настраиваем порты(ножки)

DDRB=0b11111110; //делаем выходами все порты PINB кроме 0.
PINB=0b00000001; //выводим на все выходы PORTB 0, кроме 0
PORTB=0b00000001; // и подягиваем на +питания.
//задержка для включения
//dial_nums(DialNumber);

sei(); //разрешаем прерывания глобально
//настраиваем UART
USART_Init(9600);
//настроили UART

while(1)
{ //начало бесконечного цикла
};// конец бесконечного цикла
}// конец main

Без прерывания:

int main(void)
{
// настраиваем порты(ножки)

DDRB=0b11111110; //делаем выходами все порты PINB кроме 0.
PINB=0b00000001; //выводим на все выходы PORTB 0, кроме 0
PORTB=0b00000001; // и подягиваем на +питания.
//задержка для включения
//dial_nums(DialNumber);

sei(); //разрешаем прерывания глобально
//настраиваем UART
USART_Init(9600);
//настроили UART
while(1)
{ //начало бесконечного цикла
/*for (;;) // Loop forever
{
while ((UCSRA & (1 << RXC)) == 0) {}; // Do nothing until data have been recieved and is ready to be read from UDR
ReceivedByte = UDR; // Fetch the recieved byte value into the variable "ByteReceived"
led2_test_on;
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
led2_test_off;
while ((UCSRA & (1 << UDRE)) == 0) {}; // Do nothing until UDR is ready for more data to be written to it
UDR = ReceivedByte; // Echo back the received byte back to the computer
}
};// конец бесконечного цикла
}// конец main



Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
что получится, если сложить 4 и 4 ?

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru