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

Видеокурс по AVR-микроконтроллерам для начинающих


Рекомендуемые сообщения

Двоичную систему, я так предполагаю, лучше использовать для наглядности в случае со светодиодами?!
Всегда стоит использовать систему, подходящую по смыслу. Для задания частоты десятичную, для посылки некоторых констант скажем по UART удобнее шестнадцатеричная, а для игр с отдельными битами двоичная. Также и у вас: запись PORTA==0xC0 эквивалентна записи PORTA==0b11000000, но вторая явно показывает, что это не "волшебное число", а просто нас интересуют два старших бита.
PORTA = (1<<7)// это компилятор берет виртуальную единицу сдвигает на 7 и полученное записывает в portA, а откуда он ее берет и где хранит на период сдвига?

Да и в моем случае огонек из двух светодиодов...

Ну, именно при работе с битовыми масками, в том числе сдвиг константы на константу, расчет ведет не контроллер, а препроцессор компилятора, то есть для контроллера записи PORTA = (0b11 << 6) , PORTA = 0b11000000 и PORTA = 0xC0 и даже ldi r16,0xC0 out PORTA,r16 одинаковы. А вообще, даже в линуксе, где нехватка нулей вынудила создать целое устройство по их генерации /dev/zero, в единицах недостатка нет, используйте смело.

Да, сдвигать можно не только единицу, но любое число (хотя сдвигать ноль бесполезно).

Тоже не понятно как вынести после блока if'ов, тоесть создать переменную с данной задержкой и ее применять?
Грубо говоря так

while(1){
 if(...){
...
 }
 _delay_ms(200); //эта задержка выполняется независимо от ветвления
}

Я читал PC это регистр – указатель адреса, или это не то? я еще не совсем конечно разобрался с битовой маской (кажется так называется).
Регистры это PORTx, PINx, DDRx (где x - номер порта, A,B,..). На самом деле это вообще адреса соответствующих регистров, но при программировании на Си их можно считать переменными. А вот PC0, PA2, PB4 это константы, номера выводов внутри порта, и запись (1<<PC1) не отличается от записей (1<<PB1) или просто (1<<1).
Начинал изучать контроллеры на 51 камне с асемблером, вроде ))) понимаю о чем речь.
Я с контроллерами кроме avr8 дела не имел, но знаю, что у всех контроллеров разная внутренняя архитектура. Например, в AVR целых 32 регистра общего назначения, работа с любой памятью лишь опциональна (то есть туда можно только писать и читать, но нельзя хотя бы складывать РОН+ОЗУ), зато сколько бы ее ни было, адресация ОЗУ линейна, никакого переключения банков. А в PIC регистр общего назначения, он же аккумулятор, всего один, зато почти все операции идут через память. Но сама она разбита на банки, которые иногда надо переключать.
я еще не совсем конечно разобрался с битовой маской (кажется так называется).
Да, битовая маска. Можно глянуть в википедии или поискать битовые операции. Может это поможет.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

попробуйте протеус переустановить.

вообще странно, у меня проблем с этой либой и моделью не было.

в бесконечный цикл запишите несколько нопов, чтоб контроллер не зависал. или светодиодом моргайте.

Добавил мигание портом Д.

Порт Д мигает, а изображения нет.

Код:

//атмега8А
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
#include <util/delay.h>
void presets ()
{
 Lcd_init();
 Lcd_clear();
 _delay_ms (20);
 Lcd_prints(0, 0, FONT_1X, (unsigned char *) PSTR ("Hello!"));
 Lcd_prints(3, 9, FONT_1X, (unsigned char *) PSTR ("Привiт!"));
 _delay_ms (20);
 Lcd_update();
}
int main (void)
{
 presets();
 while (1)
{
PORTD = 0xff;
_delay_ms (200);
PORTD = 0x00;
_delay_ms (200);

}
}

Протеус еще не переустанавливал.

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

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

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

http://cxem.net/mc/mc388.php

Не знаеш как? Спроси у Google'а !!!

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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

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

http://cxem.net/mc/mc388.php

Спасибо, с твоим таймером тоже чистій екран.

Протеус использую єтот:

Кто-то тестил єтот релиз на проекте 5110? Работает?

Спасибо.

Изменено пользователем admin
Бан за варезные ссылки
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

  • 4 недели спустя...

Неудобен тот момент, что не ясно в каком видеоуроке о чём говорится. Видеоуроки не подписані.

Я раньше все бегло просмотрел, и вот сейчас, спустя пару месяцев опять всё нужно перелопачивать что б синхронизироваться.

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

Здравствуйте у меня возникла проблема, я написал программу для шагового двигателя а она нормально работать не хочет.

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

Вопрос.rar

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

Совершенно непонятна проблема :unknw: Если надо сделать один шаг, так и сделайте, чтобы шагал только 1 раз, а не постоянно бежал.

Как вообще так можно, чтобы много раз шагнул - получилось сделать, а чтобы всего один раз - нет ? Странно ... :unknw:

ЗЫ: И ещё. Каким боком Ваш вопрос относится к данной теме ?

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

Доброго всем дня! Только начинаю изучать данную тему и застрял на 2-ом уроке, не хочет работать отладчик (AtmelStudio 7.0) выдает ошибку [ERROR] Failed to launch. Error code 89710015 , и во вкладке I/O не светятся bits напротив DDRB, PORTB, гугл не помогает, может кто из знающих подскажет что не так..программу символ в символ написал, как в уроке

ps. Обновление intel graphics driver не помогло

Изменено пользователем anarki2600
Ссылка на комментарий
Поделиться на другие сайты

на панеле инструментов найдите молоточек, кликните по нему, откроется вкладка, в выпадающем меню выберете Simulyator

Не знаеш как? Спроси у Google'а !!!

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

на панеле инструментов найдите молоточек, кликните по нему, откроется вкладка, в выпадающем меню выберете Simulyator

симулятор естественно был выбран, делал все, как в уроке, выдает эту ошибку и все тут...в 6-ой студии все работает, а седьмая не хочет. Может проблема с компом? Стоит win 8.1, core i7 3630qm, 8Гб оперативы

В us-нете нашел такую проблему, советуют в AVR/GNU C Compiler<Debugging<Debugging Level поставить Default(-g2) - не знаю что это за настройка, но и она не помогла

Изменено пользователем anarki2600
Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте! У меня вопрос по поводу совместимости версий Proteus 8.3 и 7.10.

По началу уроков я установил себе новую версию программы. Всё работало замечательно до того момента, как стал выводить графику на дисплей. Точки, текст выводит замечательно версия 8.3. Начал рисовать силуэт термометра, получилось это:

05d269dbe1f8.png

Картинка бегает, как будто разрешение дисплея не 48х84, а 4х20]

Кстати, дисплей, прилагаемый к урокам, в этой версии не показывает ничего (просто светится).

Поставил версию 7.10 - заработало, как надо. Силуэт появился:

0f784e3c5442.png

В железе собирать еще не пробовал. Кто знает? Почему этот глюк имеет место? Данная модель дисплея не понимает корректно команды по графике?

tanksmile.gif

За отечественную технику!

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

Всем привет! Для Atmega 16 по аналогии с вашим видео откорректировал файлик n5110.h и все заработало. А к 128-ой покдлючить не получается, в протеусе все ок, а в реале нет... Возможно это связано с тем, что у 128 атмеги при последовательном программировании выводы MOSI и MISO не РВ2 и РВ3, а РЕ0 и РЕ1, не подскажите как быть?

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


Всем привет, собрал схему! Работает! Но на вольтах бегает последняя цифра. Проблему снял на видео.
Вот код

//atmega8
#define F_CPU 8000000
#include <avr/io.h>
#include "n5110.h"
#include <stdlib.h>
#include <util/delay.h>
#include <avr/interrupt.h>
ISR(INT0_vect){

}
void inter_init(){
GICR |= (1<<INT0);//Разрешаем прерывание на инт0
MCUCR |= (1<<ISC00) | (1<<ISC01);//Сработает по нарастающему фронту
}
void nastroika(){
Lcd_init();//инициализация экрана
Lcd_clear();//очищаем экран
Lcd_update();//отправляем команду для очистки экрана
//Настройки АЦП
//ADSCRA Настройка частоты работы ацп
ADCSRA |= (1<<ADEN)//Задействовать АЦП
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); // Делитель 128 это 64клц
ADMUX |= (1<<REFS1) | (1<<REFS0); //Опорное напряжение 2.56

}
/*******************Функция для выбора опроса лапок**********************/
int readADC(unsigned int lapka){
unsigned char vibor_admux = ADMUX;
vibor_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));//Обнуляем для выбора лапки ADC0
switch(lapka)
{
case 1: vibor_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break;
default:break;
}
ADMUX = vibor_admux;
_delay_us(10);//Задержка чтоб точно записалось.
/********************Выводим среднее арифметическое**********************/
int tmp = 0;
for (int i=0;i<20;i++)
{
ADCSRA |= (1<<ADSC);//Запуск преобразования
while ((ADCSRA)&1<<ADSC);//Закончить цыкл пока не будет 0. Преобр. заверш.
tmp += ADCW;

}

return tmp/20;
}
int main(void)
{
nastroika();
while(1){
Lcd_clear();
Lcd_prints(1,1,FONT_1X,(unsigned char*)PSTR("VOLT:="));
Lcd_printf(9,1,FONT_1X,(readADC(0)*0.02935),1);
Lcd_prints(1,3,FONT_1X,(unsigned char*)PSTR("AMPER:="));
Lcd_printf(9,3,FONT_1X,((readADC(2)*2.56*(3/2.56))/1023),1);
Lcd_update();

}
}

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

Это нормально. Точности АЦП (и внешней схемы) недостаточно, чтобы реализовать полностью разрешающаю способность АЦП, все 10 разрядов. Помеха на на аналоговом входе превышает 2.5 мВ. Возможно, она вызвана внутренними шумами кристалла. Чтобы ее уменьшить можно снизить разрешающую способность, использовать цифровые фильтры (у вас уже реализован один из вариантов, но его, кажется, недостаточно), режимы сна и т.п. Но полностью избавиться от этого эффекта линейными средствами не получится.

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

Замечания по коду:

for (int i=0;i<20;i++){...tmp += ADCW;} ... return tmp/20;

Выбор именно 20 точек выглядит странным, удобнее 16 или 32, хотя скорости наверняка хватит и на 64, что все равно влезает в uint16_t.

Использование деления вместо сдвига (в случае круглого числа точек) - плохая идея: медленно и громоздко.

Смысл самого усреднения не до конца ясен: что мешает передавать на выход сразу 16-битное число, помня, что оно не от 0 до 1023, а от 0 до 65535. Точность повысится.

Lcd_printf(9,3,FONT_1X,((readADC(2)*2.56*(3/2.56))/1023),1);

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

res = X*2.56*(3 / 2.56) / 1023. Переменная X - число с АЦП, это для простоты записи и наглядности.

Если послушаетесь совета и сделаете 64 отсчета без усреднения, то есть диапазон числа от 0 до 65535.

res = X*2.56*(3 / 2.56) / 65536 (не 65535 потому что так делить будет проще, а разница невелика, всего 1.5Е-5)

res = 3*X / 65536. Я так понял, вы хотите получить 1 знак после запятой. Тогда для числа с фиксированной точкой домножаем наше поедставление на 10. Множитель для любого другого положения точки найти не проблема.

res = 30*X / 65536. Число 30 можно представить как (32-2), то есть как разность круглых чисел:32 = (1<<5) ; 2 = (1<<1). А делитель 1/65536 = (1>>16)

res = ((X<<5) - (X<<1))>>16. Проводим деление

res = (X>>11) - (X>>15). Суммарное число влезает только в 3 байта (16 бит на аргумент и 11 на сдвиг). Попробуем уменьшить аргументы, предварительно сдвинув их на 8.

res = ((X>>8)>>3) - ((X>>8)>>7). Число (X>>8) соответствует старшему байту двухбайтного числа, запишем его как XH

res = (XH>>3) - (XH>>7). В принципе этот код уже выполняется достаточно быстро, но можно еще немного оптимизировать, если учесть, что (XH>>7) это всего лишь старший бит.

res = (XH>>3) - (XH>>3)>>4

lsr XH ;оператор сдвига на 1 вправо, без переноса
lsr XH
lsr XH
sbrc XH,4 ;если бит 4 сброшен, пропускаем следующую инструкцию
dec XH ; в противном случае уменьшаем переменную на 1, ведь бит не может быть больше 1

Таким образом, код вместо сотни тактов и байт занимает всего 5.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

из темы 6 урока не получаються арифметические выражения на уножение и сложение

Lcd_printf(0,0,FONT_1X,f_data*2,4);//= -0.2706

Lcd_printf(0,1,FONT_1X,f_data+2,4);//= -1.4121

Lcd_printf(0,2,FONT_1X,f_data/2,4);//= 1.5707

Lcd_printf(0,3,FONT_1X,f_data-2,4);//= 1.1415

подскажите что неправильно в первых двух выражениях

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

2 это целое число, а 4 - положение точки при выводе на дисплей, насколько я понял. Иначе бы не собралось.

Поведение кода очень странное. Пробежались бы в отладчике, где именно оно начинает чудить.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

4- это количество знаков после запятой))))

COKPOWEHEU

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

Не знаеш как? Спроси у Google'а !!!

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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