Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Микроконтроллеры (MCU) и микропроцессоры (MPU) > atmega128 и UART


Автор: Vilandrew 23.11.2008, 22:56
В программировании контроллеров я пока новичок. Написал программу для МК Atmega128. Проверял в протеусе, программа мигает светодиодами и передает число в порт. Как только прошиваю, вообще ноль эмоций. Пробывал все тоже самое но без порта UART, все в норме, светодиоды горят. Подскажите в чем может быть проблема.
Код

#include <avr/io.h>
#include <avr/iom128.h>
#include <util/delay.h>
#define F_CPU 8000000UL  // 8 MHz

//================================================================================
void Init_UART0(void)
{
UCSR0A = 0x0;        //    0000 0000
UBRR0H=0x0;
UBRR0L=0x33;               // скорость 9600 при 8MHz
UCSR0B |= (1<<RXEN0) | (1<<TXEN0);    //    0001 1000 - разрешены только прием и передача 9-бит данных
UCSR0C |= (1<<UCSZ01) | (3<<UCSZ00);    //    0000 0110 бит 8, стоп бит 1
}
//================================================================================
// Выводит один символ data в последовательный порт channel
void _put(char data)
{
while ( !( UCSR0A & (1<<UDRE0)) );    // Ждем,если предыдущий символ не передался.
        UDR0 = data;                        // Кладем данные в регистр UDR    
}
//================================================================================

int main (void)
{
Init_UART0();
DDRD = 0xff;
DDRC = 0xff;
DDRB = 0Xff;

    while (1)
    {
    PORTD = 0xff;
    PORTC = 0x00;
    PORTB = 0x00;
    _delay_ms(1000);
    _put('1');
    PORTD = 0x00;
    PORTC = 0xff;
    PORTB = 0xff;
 _delay_ms(1000);
    }
}

Автор: cardinal 24.11.2008, 00:30
Посмотри тут примеры
http://g24-tec.com/files/G24-ATM8-Examples-RevA.pdf
не думаю, что эта часть сильно отличается от ATmega128 (с ним я не работал)...

Автор: Mazzi 24.11.2008, 10:32
Скорее всего у тебя неправильно установлены Fuses. 
По умолчанию ATmega128 настроена на работу со встроеным тактовым генератором(т.е. твой кварц не используется) см. даташит стр.288, и включена аппаратная совместимость с ATmega103(т.е. необходимо выключить эту совместимость).
Неплохое описание fuses вот здесь http://ulei.by.ru/Fuses_Ru.htm хотя и для 64 атмеги но там эти моменты совпадают с 128 атмегой.

Удачи!

Автор: Vilandrew 24.11.2008, 19:10
Mazzi, спасибо, действительно проблема была во фьюзах smile

Автор: Mazzi 25.11.2008, 12:21
Vilandrew,  рад за тебя.

Автор: Vilandrew 14.12.2008, 23:03
Столкнулся с новой проблемой. Данные передаются на компьютер, дальше уже программа обрабатывает эти значения и отправляет результат обратно на контроллер. Но, контроллер никак не реагирует. Вот собственно кусок кода который у меня не хочет работать:
Код

#include <avr/io.h>
#include <avr/iom128.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL  // 8 MHz

void Init_UART0(void)
{
UCSR0A = 0x0;        //    0000 0000
UBRR0H=0x0;        // скорость 9600 при 8MHz
UBRR0L=0x33;
UCSR0B |= (1<<RXEN0) | (1<<TXEN0);    //    0001 1000 - разрешены только прием и передача 9-бит данных
UCSR0C |= (1<<UCSZ01) | (3<<UCSZ00);    //    0000 0110 бит 8, стоп бит 1
}

char _get(void)        
{
    while ( !(UCSR0A & (1<<RXC0)) );
    return UDR0;

}

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

}

int main (void)
{
unsigned char received_data;
Init_UART0();
DDRC = 0xff;

while (1)
{
received_data = _get();
    if(received_data == 'a')
    {
    PORTC = 0x08;
    _delay_ms(1000);
    PORTC = 0x00;
    }
    else
    {
    PORTC = 0x20;
    _delay_ms(1000);
    PORTC = 0x00;
    }
_put(received_data);
}

}

Автор: Mazzi 15.12.2008, 11:31
Причина в том, что у тебя не используются прерывания. 

Нужно написать обработчики прерывания по приёму и передаче через Uart и разрешить процессору работать по прерываниям, тогда код заработает.

Автор: Vilandrew 15.12.2008, 21:10
Mazzi, спасибо, буду двигаться в этом направлении.

Автор: rmise 11.4.2009, 22:10
Уважаемые форумчане!
Помогите пожалуйста.
Схемка на ATMega8535, он отправляет команду телефону, а телефон молчит.
Подключал к компу (схемку) работает, телефон с компом тоже общается (правда только на 19 200). Думаю что дело в скорости.
Почитал на форумах, говорят что кварц надо ставить на 7,3728 Мг. Может можно без него?
Если да, то как?
Если нет, то скажите пожалуйста, что нужно в коде изменить, что бы контроллер от кварца работал?

\\\\\\\\\\\\\\\\\\\\\\\\\
uart_init:;
.equ XTAL = 8000000; частота процессора.
.equ baudrate = 19200
.equ bauddivider = XTAL/(16*baudrate)-1
outi UBRRL , low(bauddivider)
outi UBRRH , high(bauddivider)
outi UCSRA , 0
outi UCSRC , 1<<URSEL|3<<UCSZ0
outi UCSRB , 1<<RXEN|1<<TXEN|1<<RXCIE|1<<TXCIE
\\\\\\\\\\\\\\\\\

Автор: Mazzi 13.4.2009, 09:05
Цитата(rmise @ 11.4.2009,  22:10)
Подключал к компу (схемку) работает, телефон с компом тоже общается (правда только на 19 200). Думаю что дело в скорости.

Ты сначала точно определись на каких скоростях что работает, а потом уже ищи решение.

Автор: rmise 15.4.2009, 19:37
Я уже нашел решение smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)