CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Saadov
Нашел транзистор. Понюхал.
Сообщения: 155
Зарегистрирован: Вт авг 19, 2008 23:39:59
Откуда: г.Смоленск

Сообщение Saadov »

Найдите отличие

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

void itoa(int n, char *str)


      converts the integer n to characters in string str.


void ltoa(long int n, char *str)


      converts the long integer n to characters in string str.


Исправте

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

 itoa(chislo, B);

на

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

 ltoa(chislo, B);

У вас же число long int, а не int
Аватара пользователя
Sannex
Открыл глаза
Сообщения: 73
Зарегистрирован: Чт июн 26, 2008 19:21:24

Сообщение Sannex »

Вновь попадаюсь на своей невнимательности. Спасибо, что ткнули носом в правильном направлении :lol:
Все будет хорошо... Или нет... Но тогда все будет очень плохо
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

Подскажите пожалуйста:
есть данные счётчика, скажем unsigned int A=3021 (16 бит)
надо передать в uart сначала старший байт, потом младший.
догадываюсь что это можно сделать просто, но вот упёрся и всё...
:)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

rlc писал(а):Подскажите пожалуйста:
есть данные счётчика, скажем unsigned int A=3021 (16 бит)
надо передать в uart сначала старший байт, потом младший.
догадываюсь что это можно сделать просто, но вот упёрся и всё...
:)

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

UDR = A >> 8; // старший байт
UDR = A; // младший байт
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

Спасибо, ARV!
Avatar

Сообщение Avatar »

ARV приколол ! :)) :)) :))

МК наверно сам должен догадаться когда начать исполнять вторую строку кода.

Посмотрите в даташите примеры на Си.
Saadov
Нашел транзистор. Понюхал.
Сообщения: 155
Зарегистрирован: Вт авг 19, 2008 23:39:59
Откуда: г.Смоленск

Сообщение Saadov »

В чем тут прикол?
Просто показана реализация...
Если человек работает с УАРТ то, наверно уже знает что есть

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

void putchar(char c)

После компиляции контроллер сделает то, что ему предписали...
Avatar

Сообщение Avatar »

Saadov писал(а):В чем тут прикол?
Просто показана реализация...

Она и есть прикол. Может попробовать в железе и повеселиться на Новый год.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Avatar писал(а):ARV приколол ! :)) :)) :)) ...

В данном случае вообще никакого прикола нет. У AVR 8 bit буферизироанный передатчик UART. Это значит, что если передатчик пуст, то при первой записи, число поместится в сдвиговый регистр и начнется передача. При второй записи число поместится в буферный регистр (т.е. в сам UDR), а как только закончится передача первого байта, второе число сразу переместится в сдвиговый регистр. Собственно я согласен, что показана только реализация и в общем случае нужно сначала убедиться в том что буфер передатчика пуст, но чтобы советовать заглянуть в даташит, нужно сначала самому его основательно изучить.
Avatar

Сообщение Avatar »

Дак изучите - в чем же дело ?

Зачем же проверять что он пуст если вы сам пишите что там буфер есть ?

Неучи из Атмел еще и приведение типов рекомендуют делать

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

UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char) ubrr;


Во лабусы !

Ну и уже полная бредятина Атмеловская

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

/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;


Это ж надо так извращаться ! Когда решение то вот оно - на поверхности !
пихай все в UDR да нехай молотит.
Avatar

Сообщение Avatar »

smac писал(а):Это значит, что если передатчик пуст

А если не пуст ?
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

всё вроде в порядке.. :)
работает через void putchar(char c)

при отладке в AVR Studio 4 с HapSim в uart выдаётся старший а потом младший байты...
в железе попробую :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Avatar, я тебя знаю!!! :)))

С возрождением. феникс вы наш негасимый!
Если я привел в одном блоке кода 2 строчки, это не означает, что я рекомендовал их подряд всегда писать - я показал, как выделяются байты. в принципе, все поняли, что я хотел, и лишь вы, въедливый наш, решили в очередной раз взбаламутить воду :)))
что касается лабухов из атмела, то приведение типов можно делать даже тогда, когда в этом нет никакого смысла - но это не означает, что его нужно делать. при простом присваивании переменных signed char или unsigned char ни при каких услдовиях никакой роли не сыграет!!! (если обе переменные, конечно, одинакового размера char)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Avatar

Сообщение Avatar »

ARV писал(а):Avatar, я тебя знаю!!! :)))

И я тебя знаю - потому и написал про прикол :lol:

С Новым годом !
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

Всех с наступающим Новым Годом!
Такой вопрос:
определяю переменную chet_adr как:
extern unsigned int chet_adr;

в main видится и читается нормально, но в вызываемой функции видится как переменная со значением 0

переменная определена до описания функции, сразу после #define
как сделать так, чтоб переменная виделась из любого места программы?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

rlc писал(а):Всех с наступающим Новым Годом!
Такой вопрос:
определяю переменную chet_adr как:
extern unsigned int chet_adr;

в main видится и читается нормально, но в вызываемой функции видится как переменная со значением 0

переменная определена до описания функции, сразу после #define
как сделать так, чтоб переменная виделась из любого места программы?
а сама-то переменная где? и функция сама какова?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

#include <mega8535>
#include <stdio>
#define RX_COMPLETE (1<<RXC)
extern unsigned int ukaz_schet=0;
void TX250()
{
putchar(0xAA);// ответ
putchar(0x30);// 250 байт
putchar(ukaz_schet>>8);// старший байт адреса озу
putchar(ukaz_schet);// младший байт адреса озу
putchar(0x00);// резерв
}
вызов:

void main(void)
{
while (1)
{
if(rx_buf_counter==1)
{
rx_buf_counter=0;
if(rx_buffer[0]==0x55){TX250();}//собственно сам вызов
ukaz_schet++;
}
}
}

если ukaz_schet передавать в функцию как параметр - всё работает
если считать как внешнюю (extern) то в функции она видна со значением 0 - вроде как переназначается
Последний раз редактировалось rlc Ср дек 30, 2009 23:37:10, всего редактировалось 4 раза.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

я не увидел ни самой переменной, ни extern, ни функции... какой-то странный кусок или куски кода - ничего не понять.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
rlc
Открыл глаза
Сообщения: 67
Зарегистрирован: Сб мар 10, 2007 12:50:43

Сообщение rlc »

чего то из куска кода пропала середина...:)
щас вроде поправил...очень торопился..
Avatar

Сообщение Avatar »

Наверно просто глобальная имелась ввиду и "экстерн" не нужно.
Ответить

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