Atmega64
Atmega64
Приветствую! Есть у меня одна проблемка. Решил модернизировать одно устройство под управление Atmega64. Цель модернизации - научить общаться с компом + софт да компа. Собрал переходник USB-RS232 на FT232RL, но саму Atmega64 победить пока не получается. Быстренько (соответственно немного) освоил протеус, собрал там стенд с этой амегой... стал слать на виртуальный терминал данные... все было отлично - на команды амега реагировала отлично принимала и отпровляла коректные данные. Однако это все на внутреннем кварце амеги, а в устройстве используется внешний кварц на 16МГц. Так вот нужна помощь в понимании того как заставить амегу работать с внешним кварцем... Ломал голову ломал... так об стену и разбился
Модернизация данного устройства идет у меня как диплом в институте
Особого опыта в работе с МК не имеется. Помогите чем можете. Надеюсь на ваш опыт и ум. 
- Реклама
- AI_Disable
- Сверлит текстолит когтями
- Сообщения: 1116
- Зарегистрирован: Чт окт 15, 2009 14:16:18
- Откуда: Екб
- Контактная информация:
Re: Atmega64
Откройте даташит на мегу, раздел "System Clock and Clock Options".
Re: Atmega64
Вам надо изменить установку фьюзов на кварц 16 МГц - подробно это описано на страничке http://www.proavr.narod.ru/07.htmH5Grey писал(а): как заставить амегу работать с внешним кварцем...
Даташит ATmega на русском языке на страничке - http://www.proavr.narod.ru/02.htm
Это хорошо.H5Grey писал(а):Быстренько (соответственно немного) освоил протеус
Там в свойствах процессора вы можете посмотреть как установить фьюзы.
PROTEUS это еще и справочник по компонентам и настройкам.
Будете проходить мимо- проходите!
Re: Atmega64
Если я правильно понимаю, то нужно вот тут выставить нужную настройку. Только вот беда, когда выставляю на любой экстернал, симуляция выдает ошибку. Подскажите как правильно настроить амегу на внешний кварц именно в протеусе.
- Вложения
-
- 1.jpg
- Скрин протеуса.
- (96.78 КБ) 485 скачиваний
- Реклама
Re: Atmega64
Ок. Спасибо!!!! Все заработало!!!! 
Re: Atmega64
Приветствую всех снова! Возникла еще одна проблемка, помогите кто может
. Посылаю я значит в МК числа 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?
Написал примерно вот что:
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
Нужно либо сразу вводить целые числа через scanf(), либо преобразовывать вводимые строки в целые через atoi(). Если это просто одиночные литеры, то преобразовать их в целые так: x - '0'.H5Grey писал(а):Если я правильно понял МК сложил коды 1 и 2 (т.е. 31 и 32) получил 63 (код с) и передал результат. А как сделать чтоб он именно сложил 1 и 2?
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Atmega64
Я обычным с не очень дружу, больше как-то с билдером который борланд
. Попытался разобраться со 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 мне было молчание. Что я делаю не так? подскажите пожалуйста, просветите неуча
.
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
Если что-то не получается или ведет себя непонятным образом, постарайтесь вытащить побольше информации по ходу выполнения программы, печатая значения до и после преобразований.
Например, начните с освоения scanf'а через литеральные константы:(кстати, функции семейства xscanf вызывается иначе: например, для sscanf сначала преобразуемая строка, затем спецификация формата, а потом последовательность адресов переменных, куда отправлять результат преобразования; это позволяет за раз считывать несколько значений из одной строки).
А потом поработайте с буфером, например:
Ну и так далее, с обязательной распечаткой входных данных перед преобразованием.
scanf делает примерно то же, что и sscanf, но вместо буфера работает со стандартным вводом (по умолчанию это консоль).
Например, начните с освоения scanf'а через литеральные константы:
Код: Выделить всё
int i;
sscanf("123", "%d", &i);
printf("i=%d\n", i);
А потом поработайте с буфером, например:
Код: Выделить всё
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
J. Ganssle
- Goldsmith
- Опытный кот
- Сообщения: 736
- Зарегистрирован: Пн янв 10, 2011 03:06:36
- Откуда: Ростов-на-Дону
- Контактная информация:
Re: Atmega64
Вариант с отдельными литерами:
Само собой, будет работать корректно только в случае, когда с1, с2 и результат укладываются в диапазон '0'..'9'.
Код: Выделить всё
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);
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Atmega64
Сапсибо за помощь! Разобрался с МК более или менее! 
Re: Atmega64
Вобщем с вашей помощью, а также благодаря глобальной сети и еще какой-то матери
родил на свет примерно такой код для приема 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. После каждой цифры (пока код расчитан тока на две цифры) нужно ставить ",".
Вобщем всем спасибо за помощь.
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
Рано благодарить, все только начинается.H5Grey писал(а):Вобщем всем спасибо за помощь.
Следующий этап - осваивайте функцию atoi() и родственные.
Ну и попутно осваивайте идиомы языка C. Например, привыкайте вместо
Код: Выделить всё
i = i * 10;Код: Выделить всё
i *= 10;Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Atmega64
HELP! HELP! Подскажите програмку, с помощью которой на компе можно создать два виртуальных COM порта соединенных нуль-модемным кобелем!!! (на компе нету ни одного COM порта) Пользовался прогой Virtual Serial Port Driver, но она платная и через 14 дней отказалась запускаться. 
Re: Atmega64
Уважаемые знатоки! Возникла еще одна проблемка, однако она уже не связана непосредственно с МК. Я попробывал на билдере написать простенькую прогу для оправки/приема данных по 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. Пытался прикрепить весь проект к теме, но не получилось
Функция передачи
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. Пытался прикрепить весь проект к теме, но не получилось
Re: Atmega64
Собака зарыта в том,что этот бред работать не будет.Как?можно прочитать немного здесь http://www.padabum.com/data/%D0%94%D1%8 ... 0Win32.pdf
А лучше возьми готовый компонент COM порта и не мучайся.
А лучше возьми готовый компонент COM порта и не мучайся.
Re: Atmega64
Спасиб!
Этот бред работает на половину. Я скорее всего не правильно выставил таймаут чтения данных
. А готовый компонент для C++Builder 6 я чета не нашел!
А если и находил что-то, то как с ним работать так и не понял, поэтому забил на это. Если есть на примете простой компонен буду рад принять помощь
. Тока если можно с крадким объяснением как им пользоваться! 
Re: Atmega64
Практически все компоненты Delphi устанавливаются и работают с Borland C++. http://kladovka.net.ru/index.cgi?pid=list&rid=295
Как работать смотри в help-е.Я его устанавливал и он работал до Code Gear 2009.Далее не пробовал.
Как работать смотри в help-е.Я его устанавливал и он работал до Code Gear 2009.Далее не пробовал.


