Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMEGA64 глюк с UASR1
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
arttab
перенес проект с меги8 (отлажиный - рабочий) на 64. но нет прерывания по приему в usart1
fuse - запрограм. только SUT0
настройка
// USART1

UCSR1A = 0x00; // U2X нет, MPCM нет

UCSR1B = 0x98; // RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8
// 1, 0, 0, 1, 1, 0, 0, 0
// включ. приемник и передач.

UCSR1C = 0x0E; // xxx,UMSEL,UPM1:0:, USBS, UCSZ1:0, UCPOL
// 0, 0, 00, 1, 11, 0
// рез.,ас., без парит., 2 стопа, 8 бит

UBRR1H = 0x00; //URSEL,UBRR11:8:
//

UBRR1L = 0x19; // 19200 bod

преревание
#pragma vector=USART1_RXC_vect
__interrupt void my_USART1_RXC_vect(void)
{
temp=UDR1;
UDR1='s';
my_FLAGS_A.FEF2 = 1;
if (my_FLAGS_A.FRST==0)
{
if (count_res==255)
{count_res=0;}
Resiv(temp);
}//if (my_FLAGS_A.FRST==0)


ответа нет, в прерывание не заходит, но передатчик работает (вставлял переобически посылать байт по прерыванию таймера 1). Флаг по приему выставляется (опять же вставлял код для проверки)
Ни чего не понимаю. Ну чего ей надо?
Хелп...!!!!
MALLOY2
Да вроде все правельно, а какая частота проца ?, может трабл с 2 стоп битами, я всегда использую 1 стоп бит и все работает нормально.
Блин а глобальные прерывание разрешено ? с стеками все нормально ?
damir2
А в другие прерывания входит? ( ...глобальное прерывание установлено?)
arttab
кварц на 8 МГц (передатчик передает. я в терминале принемаю).
2 стоп бита? флаг ставит, а в прерывание не входит!?
глобальное прерывание вкл. за стеком IAR следит
прерывание по таймеру1 входит

колдунство требуется...
Alex11
Два дурацких вопроса: вектор изменен правильно при переносе на Mega64? - он там другой. И что там с битиком IVSEL в MCUCR?
arttab
Цитата(Alex11 @ Sep 6 2005, 02:36)
Два дурацких вопроса: вектор изменен правильно при переносе на Mega64? - он там другой. И что там с битиком IVSEL в MCUCR?
*


Дык, ИАР. файлик определений цеплять не забываю по конкретный мк. да и ругаться он без него будет.
А битик не трогаю. прерывания по таймеру1 есть.... вектора не прыгнули

Вчера мучил мк и мозги. Вот к чему пришел:

#define ENABLE_BIT_DEFINITIONS
//#define IAR_SYSTEMS_ASM__

#include "inavr.h"
#include "iom64.h"
#include "stdio.h"

void main(void);

unsigned char temp = 0;
/*
#pragma vector=RESET_vect
__interrupt void my_RESET_vect()
{
}
*/
#pragma vector=USART1_RXC_vect
__interrupt void my_USART1_RXC_vect(void)
{
temp=UDR1;
UDR1='s';

__enable_interrupt();
}//#pragma vector=USART_RXC_vect

void main(void)
{


__disable_interrupt(); //CLI

__watchdog_reset(); //сброс дога

WDTCR |= (1<<WDCE) | (1<<WDE); // Write logical one to WDCE and WDE
WDTCR = 0x00;

// USART1

UCSR1A = 0x00; // U2X нет, MPCM нет

UCSR1B = 0x98; // RXCIE,TXCIE,UDRIE,RXEN,TXEN,UCSZ2,RXB8,TXB8
// 1, 0, 0, 1, 1, 0, 0, 0
// включ. приемник и передач.

UCSR1C = 0x06; // xxx,UMSEL,UPM1:0:, USBS, UCSZ1:0, UCPOL
// 0, 0, 00, 0, 11, 0
// рез.,ас., без парит., 1стопа, 8 бит, полярн

UBRR1H = 0x00; //URSEL,UBRR11:8:
//

UBRR1L = 0x19; // 33 - 9600 bod

UDR1='k';
met:

//||||||||||||||||\\\\\\\\\\\\\\//
if (UCSR1A_Bit7) //& 0x80)//(1<<RXC1))
{
// temp=UDR1;
UDR1='z';
}//if (UCSRA & (1<<RXC))
/////////////|||||||||||||\\\\\\\\\\\\//


goto met;
}//void main(void)

сначала отсылает 'k' , а по приему 'z'. Значит прерывание не работает.
пробовал в сою прогу вставить по флагу - фиг вам.
arttab
Есть у кого отлаженый код на М64 с уарт1? может сомпил. глючит. EWR3.10C
ValeraVi
2 arttab
че-то не совсем ясно smile.gif, выше вы говорили что глобальные прерывания вы разрешили, а в примере они у вас запрещаются при инициализации:
void main(void)
{


__disable_interrupt(); //CLI
и больше нигде не разрешаются кроме как в прерывании по получению байта из ком порта, которое никогда не произойдет smile.gif
Поставте перед
UDR1='k';
разрешение прерываний:
__enable_interrupt();
и все должно заработать.
arttab
Цитата(ValeraVi @ Sep 6 2005, 22:06)
2 arttab
че-то не совсем ясно :), выше вы говорили что глобальные прерывания вы разрешили, а в примере они у вас запрещаются при инициализации:
*


в проге было разрешение - при копировании в форум ложанулся

Загадку вчера разгадал - программно-аппаратная фигня:
по RXD1 поставил защитный резистор 20к и включил резистор подтяжки... Уровня сигнала не хватало, а оссилом не собрался глянкть.
И опыт, сын ошибок трудных....
Всем спасибо за участие
IgorKossak
Оказывается, что программирование - это наука о контактах! wink.gif
arttab
Программирование на железо это наука и о контактах, о задержках, о сигналах и их обработки....
Есть на что напороться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.