Mega64 uart1

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Добрый день уважаемые коты. Первый раз разбираюсь с мегой 64. Не могу включить uart1.
В протеусе все работает. А на железе ничего. Выставил фьюзы такие: -U lfuse:w:0xe4:m -U hfuse:w:0x99:m -U efuse:w:0xff:m Частота 8 Mhz, отключен режим совместимости Mega103. В терминал ничего не приходит. Проверил пины RX TX, изменял напряжение, высокое, низкое, все норм. Да и ешо уменя питание только на одной паре vcc gnd, вторая пара vcc gnd весит в воздухе.

Код: Выделить всё

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


volatile char command=2;
void uart1_orange_init(void)
{
    UBRR1H=0;
    UBRR1L=51;
	UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
    UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}

void uart1_orange_transmit (unsigned char data)
{
    while (!( UCSR1A & (1<<UDRE1)));                
    UDR1 = data;  
                                   
}


int main(void)
{
	
	uart1_orange_init();
	sei();
    while(1)
    {
        uart1_orange_transmit('D');
		_delay_ms(100);
    }
}

Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Порт, на котором UART TX весит, как выход настроили? Это у Вас не весь код?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Блин весь код.

Добавлено after 6 minutes 26 seconds:
Z_h_e писал(а):Порт, на котором UART TX весит, как выход настроили? Это у Вас не весь код?
Настроил выход
DDRD=0xFF;
Все равно ничего.
Встал на лапы
Сообщения: 82
Зарегистрирован: Чт мар 22, 2012 20:28:49

Сообщение ddimochka »

Во-первых попробуйте идентичные настройки для USART0. Если все работает, то, скорее всего не отключен режим совместимости с ATmega 103. Убедитесь еще раз.

Добавлено after 2 minutes 37 seconds:
И еще вот что попробуйте. Уберите while из функции для передачи данных. Просто ради эксперимента
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

На uart0 летит стабильная 'D', как и нужно. Фьюз биты проверил. Extended fuses = FF; Удалил sei(); Вместе с ней летят кракозябры.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Может со схемой что не так? Например у Вас на RX весит внешняя 1, а Вы весь порт Д как выход настраиваете. С питанием может что не так, из-за того что где-то что-то ошибочно подключено.
Можете проверить не перезагружается ли МК, "мигнув" каким-нибудь пином при старте МК.

---------------
Вы разрешили прерывания как по приему, так и при передаче. А где обработчики прерываний?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Z_h_e писал(а): Вы разрешили прерывания как по приему, так и при передаче. А где обработчики прерываний?
Да прерывания пока не нужны. Я ж отправляю только. Может правда изза того что подключена одна пара vcc gnd?
Да нет RX TX весят свободны, к ним только конвертер цепляется uart-usb.

Добавлено after 7 minutes 22 seconds:
Z_h_e писал(а): Можете проверить не перезагружается ли МК, "мигнув" каким-нибудь пином при старте МК.
Я уже целым свободным портом мигал. все норм.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Но МК перейдет по вектору прерывания, если оно разрешено.
Компилятор какую-нибудь заглушку скомпиллит, раз обработчик не назначен.

Вот например такой будет обработчик по умолчанию

Код: Выделить всё

0000004F  RJMP PC-0x004F
, т.е. Ваш обработчик прерывания уйдет на адрес 0, но это не будет сбросом. Это будет хуже.

Добавлено after 4 minutes 49 seconds:
Вот такую хоть затычку поставте, если прерывания зачем то разрешили.

Код: Выделить всё

ISR (BADISR_vect)
{
// как то просемафорить об ошибочном прерывании
}
Такая вещь иногда может быть нужна при отладке (мне ни разу не понадобилась).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Сейчас код немного изменился. Прерывания запретил.

Код: Выделить всё

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile char command=2;
void uart1_orange_init(void)
{
    UBRR1H=0;
    UBRR1L=51;
	UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
    UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}

void uart1_orange_transmit (unsigned char data)
{
    while (!( UCSR1A & (1<<UDRE1)));                
    UDR1 = data;                  
}

void uart0_orange_init(void)
{
    UBRR0H =0;
    UBRR0L=51;
	UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE1);
    UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
}

void uart0_orange_transmit (unsigned char data)
{
    while (!( UCSR0A & (1<<UDRE0)));                
    UDR0 = data;                 
}

int main(void)
{
	uart0_orange_init();
	uart1_orange_init();
    while(1)
    {
        uart0_orange_transmit('D');
		uart1_orange_transmit('D');
		_delay_ms(100);
    }
}

Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Ну попробуйте "помигать" портом G. Если и им не получится, то точно мега103.

Добавлено after 2 minutes 51 second:
Али777 писал(а):Сейчас код немного изменился.
Ну а где настройка портов как выход?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Без настроек на выход uart0 отравляет норм.
Сейчас проверил atmega103 совместимость. Поменял фьюзы. Отключился uart0. Вернул обратно.
Все. Тупиковая ситуация. Пойду спрошу на атмеловском форуме, avrfreaks.com
Может быть ножки подгорели внутри именно там где они управляются от uarta :)))
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Нашел причину. Отходили контакты контроллера. Придавил пальцем заработало. Тут же мультиметром прозвонил. Все звониться а сигнала небыло. Перепоял.

Теперь другая проблема. Когда объявляю sei(), после инициализации. Чип сразу перестает выполнять функции. В чем может быть дело?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1368
Зарегистрирован: Вс мар 28, 2010 12:52:22
Откуда: Беларусь

Сообщение dr.doc »

Z_h_e писал(а):
СпойлерISR (BADISR_vect)
{
// как то просемафорить об ошибочном прерывании
}
У Вас не видно в коде выхода из прерывания. Контроллер улетает в него и отсюда все проблемы...
«Еще я хотел бы, чтобы наши ученые изобрели какой-то новый источник энергии, чтобы мы на коленях не ползали даже перед нашими братьями, умоляя их и выпрашивая тонну нефти или кубометр газа», — рассказал белорусский президент.
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Вот в этом коде как ставишь sei() ничего не работает. Без него значения обрабатываются.

Код: Выделить всё

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

volatile char command=2;
void uart1_orange_init(void)
{
    UBRR1H=0;
    UBRR1L=51;
   UCSR1B |= (1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1)|(1<<TXCIE1);
    UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
}

void uart1_orange_transmit (unsigned char data)
{
    while (!( UCSR1A & (1<<UDRE1)));                
    UDR1 = data;                  
}

void uart0_orange_init(void)
{
    UBRR0H =0;
    UBRR0L=51;
   UCSR0B |= (1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0)|(1<<TXCIE1);
    UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00);
}

void uart0_orange_transmit (unsigned char data)
{
    while (!( UCSR0A & (1<<UDRE0)));                
    UDR0 = data;                 
}

unsigned char uart1_getc(void)
{
    while((UCSR1A&(1<<RXC1))==0);
    return UDR1;
}
int main(void)
{
DDRB|=(1<<1);
   uart0_orange_init();
   uart1_orange_init();
	sei();
   char c;
    while(1)
    {
		c = uart1_getc();
		if(c=='A') {PORTB|=(1<<0); }
		if(c=='B') {PORTB&=~(1<<0);}
	
    }
}
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Я же Вам писал, что у Вас происходит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Z_h_e писал(а):Я же Вам писал, что у Вас происходит.
Я действительно не знал что если я установил rxcie и txcie то необходимо их обрабатывать, Вы ведь про это писали?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Почитайте о прерываниях вообще. Что это и как на них реагирует МК на физическом уровне. Это не так сложно и литературы полно.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

Я не понял вот этого
Али777 писал(а):Может правда изза того что подключена одна пара vcc gnd?
Вы подали питание не на все выводы VCC и GND?
Если так, то МК и не обязан корректно работать. Вы что, экономите на чем-то, что-ли?
Питание должно быть подано на ВСЕ выводы VCC, а "земля" должна быть подведена КО ВСЕМ выводам GND. Более того, питание должно быть подано даже на вывод AVCC, даже если Вы не используете аналоговую периферию МК.
Ответить

Вернуться в «AVR»