Atmega64

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Atmega64

Сообщение H5Grey »

Приветствую! Есть у меня одна проблемка. Решил модернизировать одно устройство под управление Atmega64. Цель модернизации - научить общаться с компом + софт да компа. Собрал переходник USB-RS232 на FT232RL, но саму Atmega64 победить пока не получается. Быстренько (соответственно немного) освоил протеус, собрал там стенд с этой амегой... стал слать на виртуальный терминал данные... все было отлично - на команды амега реагировала отлично принимала и отпровляла коректные данные. Однако это все на внутреннем кварце амеги, а в устройстве используется внешний кварц на 16МГц. Так вот нужна помощь в понимании того как заставить амегу работать с внешним кварцем... Ломал голову ломал... так об стену и разбился :) Модернизация данного устройства идет у меня как диплом в институте :) Особого опыта в работе с МК не имеется. Помогите чем можете. Надеюсь на ваш опыт и ум. :)
Реклама
Аватара пользователя
AI_Disable
Сверлит текстолит когтями
Сообщения: 1116
Зарегистрирован: Чт окт 15, 2009 14:16:18
Откуда: Екб
Контактная информация:

Re: Atmega64

Сообщение AI_Disable »

Откройте даташит на мегу, раздел "System Clock and Clock Options".
Реклама
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Atmega64

Сообщение radio-kot »

H5Grey писал(а): как заставить амегу работать с внешним кварцем... :)
Вам надо изменить установку фьюзов на кварц 16 МГц - подробно это описано на страничке http://www.proavr.narod.ru/07.htm

Даташит ATmega на русском языке на страничке - http://www.proavr.narod.ru/02.htm
H5Grey писал(а):Быстренько (соответственно немного) освоил протеус
Это хорошо.

Там в свойствах процессора вы можете посмотреть как установить фьюзы.

PROTEUS это еще и справочник по компонентам и настройкам.
Будете проходить мимо- проходите!
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Если я правильно понимаю, то нужно вот тут выставить нужную настройку. Только вот беда, когда выставляю на любой экстернал, симуляция выдает ошибку. Подскажите как правильно настроить амегу на внешний кварц именно в протеусе.
Вложения
1.jpg
Скрин протеуса.
(96.78 КБ) 485 скачиваний
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
radio-kot
Собутыльник Кота
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Re: Atmega64

Сообщение radio-kot »

Вместо "дефалт" напишите частоту такта, кварца.
Будете проходить мимо- проходите!
Реклама
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Ок. Спасибо!!!! Все заработало!!!! :))
Реклама
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Приветствую всех снова! Возникла еще одна проблемка, помогите кто может :)) . Посылаю я значит в МК числа 1 и 2 через одну прогу COM Port Toolkit. Она как я понял посылает их в ASCII, т.е. 1 - 31, 2 - 32. Результатом ответа МК должна быть сумма этих чисел.
Написал примерно вот что:
int y,x,z;

x=getchar();
z=getchar();
putchar(x);
putchar('_');
putchar(z);
putchar('_');
y=x+z;
putchar(y);

Ожидал в ответ получить: 1_2_3
Однако получил: 1_2_с (в ASCII: 31 5F 32 5F 63)

Если я правильно понял МК сложил коды 1 и 2 (т.е. 31 и 32) получил 63 (код с) и передал результат. А как сделать чтоб он именно сложил 1 и 2?
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Atmega64

Сообщение Goldsmith »

H5Grey писал(а):Если я правильно понял МК сложил коды 1 и 2 (т.е. 31 и 32) получил 63 (код с) и передал результат. А как сделать чтоб он именно сложил 1 и 2?
Нужно либо сразу вводить целые числа через scanf(), либо преобразовывать вводимые строки в целые через atoi(). Если это просто одиночные литеры, то преобразовать их в целые так: x - '0'.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Я обычным с не очень дружу, больше как-то с билдером который борланд :)) . Попытался разобраться со scanf(). Написал что-то вроде этого:
x=scanf("%d",rx_buffer0);
z=scanf("%d",rx_buffer0);
printf("%d_",x);
printf("%d_",z);
y=x+z;
printf("%d",y);
был еще вариант:
x=scanf("%d",getchar());
z=scanf("%d",getchar());
printf("%d_",x);
printf("%d_",z);
y=x+z;
printf("%d",y);
Однако и в первом и во втором варианте ответом на посланые числа 1 и 2 мне было молчание. Что я делаю не так? подскажите пожалуйста, просветите неуча :) .
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Atmega64

Сообщение Goldsmith »

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

Например, начните с освоения scanf'а через литеральные константы:

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

int i;
sscanf("123", "%d", &i);
printf("i=%d\n", i);
(кстати, функции семейства xscanf вызывается иначе: например, для sscanf сначала преобразуемая строка, затем спецификация формата, а потом последовательность адресов переменных, куда отправлять результат преобразования; это позволяет за раз считывать несколько значений из одной строки).

А потом поработайте с буфером, например:

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

int i, j;
char *buf = "123 456";
printf("%s\n", buf);
sscanf(buf, "%d %d", &i, &j);
printf("i=%d\tj=%d\n", i, j);
Ну и так далее, с обязательной распечаткой входных данных перед преобразованием.

scanf делает примерно то же, что и sscanf, но вместо буфера работает со стандартным вводом (по умолчанию это консоль).
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Atmega64

Сообщение Goldsmith »

Вариант с отдельными литерами:

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

char c1 = '1', c2 = '2', result;
int i1, i2;
printf("c1=%c\tc2=%c\n", c1, c2);
i1 = c1 - '0';
i2 = c2 - '0';
printf("i1=%d\ti2=%d\n", i1, i2);
result = (char)(i1 + i2 + '0');
printf("result=%c\n", result);
Само собой, будет работать корректно только в случае, когда с1, с2 и результат укладываются в диапазон '0'..'9'.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Сапсибо за помощь! Разобрался с МК более или менее! :)
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Вобщем с вашей помощью, а также благодаря глобальной сети и еще какой-то матери :)) родил на свет примерно такой код для приема n значного числа и его же вывод.

int rezylt,n=0;
int vxod_d[2]={0,0};
char temp;
while (1)
{
temp=getchar();//Забор первого байта из буфера
i=1;//Определение множителя
rezylt=0;
while(temp!=',')//Цикл выполняющийся пока не встретится ","
{
rezylt=rezylt+(int)(temp-'0')*i;//Формирование принятой цифры
i=i*10;//Переопределение множителя
temp=getchar();//Забор следующего символа из буфера
}
vxod_d[n]=rezylt;//Сохранение сформированной цифры в массив
printf("Save - ОК!\r\n");//Сообщает, что выполненно сохранение
printf("Input data #%i=%i\r\n",n,vxod_d[n]);//Выводит сохраненную цифру
n++;
};
Однако есть одно примичание цифру с компа нужно слать в обратном порядке, т.е. если нужно отправить 1234, то в терминальной программе пишем 4321. После каждой цифры (пока код расчитан тока на две цифры) нужно ставить ",".
Вобщем всем спасибо за помощь. :))
Вложения
1.jpg
(28.72 КБ) 685 скачиваний
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Atmega64

Сообщение Goldsmith »

H5Grey писал(а):Вобщем всем спасибо за помощь. :))
Рано благодарить, все только начинается.

Следующий этап - осваивайте функцию atoi() и родственные.

Ну и попутно осваивайте идиомы языка C. Например, привыкайте вместо

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

i = i * 10;
писать

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

i *= 10;
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

HELP! HELP! Подскажите програмку, с помощью которой на компе можно создать два виртуальных COM порта соединенных нуль-модемным кобелем!!! (на компе нету ни одного COM порта) Пользовался прогой Virtual Serial Port Driver, но она платная и через 14 дней отказалась запускаться. :(
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Atmega64

Сообщение Vov123 »

H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Уважаемые знатоки! Возникла еще одна проблемка, однако она уже не связана непосредственно с МК. Я попробывал на билдере написать простенькую прогу для оправки/приема данных по COM порту. Возникла проблема с приемом! Отправить даные у меня получается. Они даже до другой программки доходят :), а вот в обратном порядке не получается. Подскажите, если знаете, где собака зарыта?

Функция передачи
AnsiString S;
int n;
S=Edit1->Text;
FlushFileBuffers(port);
Overlapp.hEvent = CreateEvent(NULL,false,false,NULL);
WriteFile(port,S.c_str(),strlen(S.c_str()),&DWORD(n),&Overlapp);
if (GetLastError()!=ERROR_IO_PENDING)
{
ShowMessage("Ошибка передачи!!!");
}

Функция приёма
int n;
AnsiString buf;
buf = "";
FlushFileBuffers(port);
Overlapp.hEvent = CreateEvent(NULL,false,false,NULL);
ReadFile(port,buf.c_str(),128,&DWORD(n),&Overlapp);
if (GetLastError()!=ERROR_IO_PENDING)
{
ShowMessage("Ошибка передачи!!!");//Все время срабатывает это условие
}

P.S. Пытался прикрепить весь проект к теме, но не получилось :(
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Atmega64

Сообщение Vov123 »

Собака зарыта в том,что этот бред работать не будет.Как?можно прочитать немного здесь http://www.padabum.com/data/%D0%94%D1%8 ... 0Win32.pdf
А лучше возьми готовый компонент COM порта и не мучайся.
H5Grey
Первый раз сказал Мяу!
Сообщения: 27
Зарегистрирован: Чт фев 17, 2011 15:51:49

Re: Atmega64

Сообщение H5Grey »

Спасиб! :) Этот бред работает на половину. Я скорее всего не правильно выставил таймаут чтения данных :) . А готовый компонент для C++Builder 6 я чета не нашел! :( А если и находил что-то, то как с ним работать так и не понял, поэтому забил на это. Если есть на примете простой компонен буду рад принять помощь :) . Тока если можно с крадким объяснением как им пользоваться! :)
Vov123
Опытный кот
Сообщения: 804
Зарегистрирован: Чт мар 12, 2009 16:31:05

Re: Atmega64

Сообщение Vov123 »

Практически все компоненты Delphi устанавливаются и работают с Borland C++. http://kladovka.net.ru/index.cgi?pid=list&rid=295
Как работать смотри в help-е.Я его устанавливал и он работал до Code Gear 2009.Далее не пробовал.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»