Перейти к содержанию
    

Микроконтроллеры для начинающих

Зачем придумывать велосипед при использовании AVR, есть же Atmel Studio (на данный момент 7) в ней всё уже имеется (ASF) работа с прерываниями, портами, задержками и т.д. хороший help

главное в вашем случае подкорректировать board.h.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Доброй ночи прошу не пинать только учусь не могу понять как считать логарифм помогите разобраться .

#include <util/delay.h>

#include "lcd_lib.h"

#include <math.h>

#include <stdio.h>

 

// объявляем глобальные переменные

char lcd_buffer[16];

float val;

 

 

int main()

{

LCDinit();

while(1)

{

 

val=log10(5);

sprintf(lcd_buffer, "otvet%i", val);

LCDclr();

LCDGotoXY(0,0);

LCDstring(lcd_buffer, 16);

 

_delay_ms(300);

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И? пример работает?

Что не работает?

Как минимум, printf("%i") ждёт int, а не float.

Но тогда бы мы услышали "работает, но какую-то ерунду выводит".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sprintf(lcd_buffer, "otvet%f", val); Даже если так пишу выводит знак вопроса и все , помогите разобраться как вывести корректно .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Больше самостоятельности!

 

LCDstring("1234567890123456", 16); - работает?

sprintf (lcd_buf, "1234567890123456"); LCDstring(lcd_buf, 16); - работает? (кстати, почитайте про sprintf - буфер нужен чуть больше: в конец ещё нолик пишется)

int a = 10; sprintf (lcd_buf, "%d", a); LCDstring(lcd_buf, 16); - работает?

float b = 12.34; sprintf (lcd_buf, "%f", B); LCDstring(lcd_buf, 16); - работает?

 

И только потом смотреть на логарифмы...

 

Ну и код этого самого LCDstring() вместе со всем, что оно вызывает, надо смотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

мне ваще вот эт не нра val=log10(5);

напишите val=log10(5.); с точкой или printf ("%f\r\n", (float)5); (что уже некрасиво делать)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

sprintf(lcd_buffer, "otvet%f", val); Даже если так пишу выводит знак вопроса и все , помогите разобраться как вывести корректно .

Нужно убедится (включить в настройках компилятора) что sprintf умеет глотать float.

Ну и модификатор, что-нибудь вроде: sprintf(lcd_buffer, "otvet%9.3f", val);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

Я только начинаю вникать в AVR.

 

Есть атмега644, стоит в простенькой самодельной отладочной плате,. Сейчас к атмеге этой подключен только один светодиод, заставляем его моргать.

В качестве программатора-отладчика используется JTAG ICE MK2, в качестве среды разработки - Atmel Studio 6.1.

 

Сделана простейшая программа, которая на секунду включает светодиод, потом секунду держит его отключенным и так далее.

 

Проблема в том, что временной интервал в 1 секунду выдерживается только когда в проекте частоту F_CPU указываю 1000000. Если указываю 8000000, - то 1 секунда превращается в 8 секунд. Когда ставлю частоту 16000000 - то получается 16 секунд интервал. Для задания временного интервала используется библиотека util/delay.h.

 

Но ведь эта библиотека должна обеспечивать всегда одинаковую, указанную ей задержку, а не увеличивать её пропорционально частоте МК, верно? В чём тут проблема может быть?

 

Я залазил в этот h-файл библиотеки delay, ставил там свою частоту нужную, вместо 1000000 - но это ничего не изменило.

 

_____________________________________________

 

Вторая проблема - программатор-отладчик мой при внутрисхемной отладке по шагам доходя до строки с упоминанием delay - из текста программы переходит в библиотеку и всё, дальше отладку можно только прервать, обратно из библиотеки он уже не выходит никак. Подскажиет что я делаю не так?

 

код программы:

 

#define F_CPU 16000000

#include <avr/io.h>

#include <util/delay.h>

 

 

void preset()

{

DDRD = 0b11111111; // 0xFF

}

 

 

int main(void)

{

preset();

while(1)

{PORTD = 0b11111111;

_delay_ms(1000);

PORTD = 0b00000000;

_delay_ms(1000);

}

 

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота задается программированием фьюзов

В #define F_CPU 16000000 ваша задача поместить РЕАЛЬНОЕ значение частьты. Сейчас ваша мега работает на частоте 1МГц и поэтому задержка сходится только когда вы не врете компилятору и делаете F_CPU 1000000

 

Я залазил в этот h-файл библиотеки delay,
Никогда не лазьте в библиотеки и ничего там не правьте!

 

Программировать фьюзы тут

post-35751-1489141301_thumb.jpg

 

При неправильной установке тактирования контроллер перестанет выходить на связь с программтором. Будьте осторожны!(восстановить потом можно, но это потребует дополнительного шаманства с аппаратной частью, что для новичка может быть сложно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема в том, что временной интервал в 1 секунду выдерживается только когда в проекте частоту F_CPU указываю 1000000.

может и не правильно но ...

http://radiokot.ru/forum/viewtopic.php?p=1...4f75ff#p1540750

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Предложенный способ задефайнить глобально F_CPU с помощью командной строки компилятора конечно-же правильный.

Однако вариант

#define F_CPU 16000000

#include <avr/io.h>

#include <util/delay.h>

 

тоже вполне рабочий т.к. #define F_CPU расположен ПЕРЕД include.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Частота задается программированием фьюзов

В #define F_CPU 16000000 ваша задача поместить РЕАЛЬНОЕ значение частьты. Сейчас ваша мега работает на частоте 1МГц и поэтому задержка сходится только когда вы не врете компилятору и делаете F_CPU 1000000

 

Спасибо! Всё кратко, чётко и ясно.

А то сколько смотрел видео по AVR, сколько статей находил - нигде эту, казалось бы, простую инфу, не встречал: все сразу учат как мигать светодиодом, будто это основное, что нужно уметь в работе с МК)

 

 

Программировать фьюзы тут

post-35751-1489141301_thumb.jpg

 

При неправильной установке тактирования контроллер перестанет выходить на связь с программтором. Будьте осторожны!(восстановить потом можно, но это потребует дополнительного шаманства с аппаратной частью, что для новичка может быть сложно)

 

Да, я находил это окно. На Вашем скриншоте всё подробно описано, а в моей студии 6.1 в строке SUT_CKSEL сейчас написано "INTRCOSC_6CK_65MS".

Я так понимаю что чтобы использовать собственный RC, нужно чтобы это волшебное слово начиналось с букв "INT", - таких строк, начинающихся с "INT", всего в списке 6, и частота указана только в трёх из них, и везде одинаковая, - 128 килогерц. Как при этом выставить свою частоту - непонятно. Разве что без Atmel Studio 6.1, используя сторонний программатор для этого.

 

может и не правильно но ...

http://radiokot.ru/forum/viewtopic.php?p=1...4f75ff#p1540750

 

Да, я был в этой теме, делал всё, как там, но результата не было, т.к. не в курсе был что нужно корректировать фьюзы для смены частоты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понимаю почему вы сидите на студии 6.1, когда есть студия 7 из которой я и сделал скриншот.

 

Фьюзы и их значения в конце концов описаны в даташите и вы можете ввести данные прям в окошечки LOW и HIGH которые вы видете внизу этого окошка.. Короче разберетесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...