atmega8 UART (Ошибки передачи)

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Вт фев 19, 2013 14:52:42

Сообщение kraftu »

Добрый день.
Имеется Atmega8 подключенный к компьютеру по UART(Переходник UART-USB 100% работает, т.к (Брал у друга) Atmega8 все отлично передает без ошибок)
Atmega8 (Собрал сам) каторый работает на кварце 7,3728 МГц и 2 Конденсатора 22пФ (Все по даташиту)

Прошил фьюзы:
avrdude.exe -p m8 -c ftbb -P ft0 -B 4800 -U hfuse:w:154:m -U lfuse:w:228:m -U lock:w:63:m

После чего, залил прошивку на CodeVisionAVR:

Предварительно в настройках проекта указал частоту 7,3728 МГц
------------------------------------------------------------------
#include <mega8.h>
#include <delay.h>

void initUART()
{
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN )|(1<<RXCIE);

UBRRH=0;
UBRRL=47; // Передача на 9600 бит/сек

}

void uart_putc( char c )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
UDR = c;
}

void main(void){

DDRD=0b00100000; // Просто статусный светодиод, показывающий работу МК
PORTD=0b00100000; //

initUART();
delay_ms(500);

PORTD=0b00000000;

while(1)
{
delay_ms(500);
PORTD=0b00000000;
uart_putc('A'); // Отправка символа.

delay_ms(500);
PORTD=0b00100000;
}
}

------------------------------------------------------------------
Все перепробовал, но присылает совсем не то, другой символ по номеру 161, причем все время,
если
char i;
for(i=0;i<251;i++){
uart_putc('A');
}
Приходят символы с 150-151-152...-224-225; Что то подобное.

Что может быть? помогите пожалуйста!
(До этого, я работал с UART на другом Atmega8, все отлично принималось и передавалось, без ошибок)
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Сообщение passer_by »

uart_putc('A'); // Отправка символа.
'A' - это не символ, это литерал. Символ - "A"
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Реклама
Родился
Сообщения: 2
Зарегистрирован: Вт фев 19, 2013 14:52:42

Сообщение kraftu »

passer_by писал(а):
uart_putc('A'); // Отправка символа.
'A' - это не символ, это литерал. Символ - "A"
Ок
Помоги fuse поставить для кварца 7.3728Мгц http://avr.roboforum...l?part=ATmega8A какой выбрать Crystal/Resonator?
vek
Вымогатель припоя
Аватара пользователя
Сообщения: 563
Зарегистрирован: Чт апр 16, 2009 04:53:41

Сообщение vek »

Если не отрываю вас от важных дел,то немного разъясните пожалуйста:
void uart_putc( char c )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
UDR = c;
}
Мои мысли вслух:
Переменная должна быть объявлена раньше чем использована.
Строки выше говорят о функции void uart_putc( char c ) ,а это значит что при упоминании в главной функции main такой строчки - uart_putc( ) мы сразу визуально отправляемся вверх исходника и ищем такую-же строчку с описанием функции,т.е. того что она делает,а формально вместо этого можно было-бы вписать эти строки непосредственно в main .
правда с предварительным объявлением "с" - в нашем случае char.ЗАПИНКА:мне ненужно объявлять отдельно о переменной "с" типа char? или она уже считается объявленной в этих скобках : void uart_putc( char c )?????????

uart_putc('A'); // Отправка символа.


Здесь я так понимаю просто присваевается начальное значение "с"? |
|

///////////////////////////////////////////// |
В общем вышеприведенные строки должны работать так: /___
\
при лбъявлении uart_putc('A') происходит просто объявление локальной : char c = 'A' (вместо "А" двоичный код по табличке ASCII составляется компилятором) ,
Которая действует лишь пару строк.
Правильно понял?
В первый раз меня ударило током - и я подумал что ни черта не соображаю в электричестве. Во второй раз был аккуратнее и меня не ударило - теперь я возомнил из себя крутого микроэлектронщика.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 42
Зарегистрирован: Сб янв 05, 2013 21:03:05

Сообщение passer_by »

1.
void uart_putc( char c )
Это функция, по результату работы которой, возвращает переменную типа char. При использовании функции переменная уже объявлена в заголовке функции. Если писать в теле функции main, объявление переменной нужно.
2.
uart_putc('A');
Никаких объявлений не происходит. uart_putc(); - функция отправки символа по USART, где в скобках указывается переменная (судя по всему типа char). Разница между 'A' и "A" - в первом случае передается код строкового литерала, во втором случае передается код символа + завершающий строку литерал '\0'.
В обще это азы СИ. Почитайте, к примеру, это: Шпак Ю.А. - Программирование на языке С для AVR и PIC микроконтроллеров - 2011 Ну и гугл вам в помощь
Если птичка уже в одном прыжке от тебя, всё-таки побереги свой нос, может она за оконным стеклом???
Реклама
Ответить

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