admin

Видеокурс По Avr-Микроконтроллерам Для Начинающих

2 251 сообщение в этой теме

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
COKPOWEHEU    254

Видеоуроки, разумеется, не смотрел, но могу предположить что ADC - регистровая пара ADCH:ADCL, кои описаны в даташите на контроллер.

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


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

Здравствуйте, после просмотра 4 и 5 урока решил сделать свою схему на мк. Программа такова что должна переключать ножки порта при нажатии на одну кнопку в одну сторону, при нажатии на другую в другую. Почему то не работает в другую сторону. нажимаю вторую кнопку и он возвращает во второй разряд а не в предыдущий.

Вот:

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

    

void set(){
    DDRB = 0xFF;
    DDRD = 0xFF;
    PORTD = 0x00;
    DDRC = 0x00;
    PORTC = 0x00;
    PORTB = 0b00000001;
}
int main(void)
{
    set();
    int t=0,i=0;
    int e=0b00000001;
   do
    {
        if (PINC&(1<<PC0))
        {
            i=i+1;    
            PORTB=(e << i);
            _delay_ms(100);
        }
        else {
        if (PINC&(1<<PC1))
        {
            e=(e << i);
            i=i-1;
            PORTB=(e >> i);
            _delay_ms(100);
        }
        }
    }
         while(1);
    }
 

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


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

Допустим, сразу при включении нажата кнопка PC1. Первая же итерация:

e =(e<<i) = (1<<0) = 1
i = i-1 = 0-1 = -1;
PORTB = (e>>i) = (1>>-1) - что тут произойдет зависит от компилятора. Скорее всего, PORTB = 0;

Как вы вообще такое изобрели? Может проще было завести массив с возможными значениями и перебирать индексы?

const uint8_t values[8] = {(1<<0), (1<<1), (1<<2), (1<<3), (1<<4), (1<<5), (1<<6), (1<<7)};
uint8_t counter=0;
#define BTN_INC C,0,0
#define BTN_DEC C,1,0

while(1){
  if( PIN_ON( BTN_INC ) ){
    counter++;
  }else if( PIN_ON( BTN_DEC ) ){
    counter--;
  }
  if(counter >= 8)counter = 0; //поскольку тип беззнаковый, проверять на отрицательность не надо
  PORTB = values[counter];
  _delay_ms(100);
}

 

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


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

Всё-таки я всё больше и больше убеждаюсь, что учить надо не операторам Си и регистрам микроконтроллера, а умению разбивать задачу на подзадачи и формальному описанию алгоритма. Без этого никуда. Вот я бы "бегущий огонь по кнопке" делал бы совсем иначе.

1. Сделал бы функцию rotete_left(uint8_t *state); которая двигает огонек на порту влево
2. Сделал бы функцию rotate_right(uint8_t *state); которая двигает огонек на порту вправо
3. Определил бы переменную состояния огонька, адрес которой затем передавал бы в вышеописанные функции
4. Сделал бы функцию get_button(void); которая возвращала бы номер нажатой кнопки
И в итоге получилось бы такое:

uint8_t state = 1;

while(1){
  switch(get_button()){
    case 0 : // не нажато
      	break;
    case 1: // влево
      	rotete_left(&state);
      	break;
    case 2: // вправо
      	rotete_right(&state);
      	break;
  }
}

Гораздо понятнее, чем сразу "сырой" код писать, не так ли? Я умышленно не раскрыл функции, т.к. это уже второстепенное дело. Да и макросами можно заменить их при желании...

Изменено пользователем ARV

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


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

Здравствуйте, вчера сидел до вечера и сегодня утром посидел и понял!

Вот как я сделал: 

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>

    

void set(){
    DDRB = 0xFF;
    DDRD = 0xFF;
    PORTD = 0x00;
    DDRC = 0x00;
    PORTC = 0x00;
    PORTB = 0b00000001;
}
int main(void)
{
    set();
    int t=0,i=0,g=0;
    int e=PORTB;
   do
    {
        if (PINC&(1<<PC0))
        {
            if (PORTB>=0b00010000)
            {
            PORTB=0b00010000;
            }
                    i=1;
                    PORTB=(PORTB << i);
                    _delay_ms(100);
        }
        if (PINC&(1<<PC1))
        {    
            g=1;
            PORTB=(PORTB >> g);
            _delay_ms(100);    
    
        }
    }
         while(1);
    }

Но все равно спасибо вам за инфу.

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


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

Не будет работать. Нажмите на любую кнопку больше 7 раз - что будет?

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


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

поймите, это еще не готовая программа, а всего лишь блок. Она еще не закончена, да и схему вы не видели. Но я понял о чем вы, вы предлагали мне объявить функции а потом просто вставлять где нужна как с функцией установки портов.

В протеусе все работает сколько бы кнопку не нажимал.

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


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

Всем привет!

Вопрос по уроку №3.

Поясните по выбору номиналов токоограничивающих резисторов, плиз. Напряжение - 5 вольт. Потребление 1 светодиода примерно 20 мА. Итого, падение напряжения на резисторе 220 Ом будет равняться 4,4 В. Т. е. светодиоду останется 0,6 В. Он от такого напряжения зажжется?

Или не так?

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


Ссылка на сообщение
Поделиться на других сайтах
goodkote    0
2 часа назад, goodkote сказал:

Всем привет!

Вопрос по уроку №3.

Поясните по выбору номиналов токоограничивающих резисторов, плиз. Напряжение - 5 вольт. Потребление 1 светодиода примерно 20 мА. Итого, падение напряжения на резисторе 220 Ом будет равняться 4,4 В. Т. е. светодиоду останется 0,6 В. Он от такого напряжения зажжется?

Или не так?

Разобрался. Ток потребления светодиода в данном случае - 10 мА. Так что все ОК.

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


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

Здравствуйте. Подскажите где найти ПОЛНОЦЕННУЮ версию Avr (Atmel) Studio 6. Два раза устанавливал и оба раза она не запускалась, выдавалось сообщение: не установлены какие-то компоненты.

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


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

@RA3DTI  ,  версия студии полноценная , это винда у вас не полноценная , читайте каких компонентов не хватает , устанавливайте с сайта майкрософт . Да зачем вам 6 студия , когда есть 7-ая , практически все один в один .

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


Ссылка на сообщение
Поделиться на других сайтах
RA3DTI    55
12 часа назад, DmitryS сказал:

@RA3DTI  , ....... Да зачем вам 6 студия , когда есть 7-ая , практически все один в один .

Читал про 7-ю, что она "тяжеловесная", гораздо медленнее 6-й, пишут что она раздражает своей задумчивостью, если комп не супер. Тем  не менее  спасибо за совет, попробую.

 

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


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

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

Нашел библиотеку со шрифтами (симпатичными), и пока застопорился с их использованием в моем "показометре". 

Пример.jpg

NokiaDisplay.zip

Изменено пользователем gogaze
Добавление файлов

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


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

Тема то не умрет, главное чтоб у тебя не пропало желание далее изучать мир МК.

А чем тебя не устраивает библиотека, которая использовалась в видеокурсе?

Если тебе нужен как на скрине большой и узкий шрифт(5х14), то в файле n5110.c ищем функцию - byte LcdChr ( LcdFontSize size, byte ch ) и закомментируем пару строчек:

            // Копируем две части в кэш
            LcdCache[tmpIdx++] = b1;
//            LcdCache[tmpIdx++] = b1;
//            LcdCache[tmpIdx + 82] = b2;
            LcdCache[tmpIdx + 83] = b2; 

там же чуть ниже правим так:

        // Обновляем x координату курсора
        LcdCacheIdx = (LcdCacheIdx + 5) % LCD_CACHE_SIZE;// было 11

Симпотичные шрифты и специфичные знаки можно самому рисовать или использовать чужие, при этом не прыгая из библы в библу. Есть проги помогающие в этом.

Вот к примеру знак Ома и Цельсия, как на скрине твоем. В файле n5110.h:

{ 0x5C, 0x62, 0x02, 0x62, 0x5C },   //  0x7B 123 знак Ома вместо "{"
{ 0x01, 0x3C, 0x42, 0x42, 0x42 },   //  0x7D 125 знак Цельсия вместо "}" 

строки с символами: "{" и "}" закомментируем.

Вот мой БП рожденный после просмотра видеокурсов. 9 порогов срабатывания защиты при превышении тока, отключение сработанной защиты ручное или автоматическое. Пока ждал дисплей с алли немного изучил таймер и ШИМ, и прикрутил управление вент. охлаждения через ШИМ 30%, 60% и 100% при определенных температурах с настройкой через меню.

По поводу точности, думаю для БП оно прям суперское и не нужно, для этого существуют специальные приборы. Ну или использовать ОУ типа Rail to Rail MCP604

 

2017-10-13 03.33.33_micro.jpg

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


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

Огромное спасибо за попытку помочь! Пока наверняка понял только то, что мне еще читать и читать, пробовать и пробовать, чтобы осмыслить и понять! 

Еще раз спасибо!!!

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


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

Воспользовался твоими рекомендациями, спасибо за реальную помощь!!! Если я правильно понял мы немного изменили отображение шрифта  FONT_2X?

Поэкспериментировал, в протеусе получилось так, как на скрине.

Пока не до конца разобрался с позиционированием "правого" столбца.

Выводил так: 

  //Вольты
        Lcd_printf (0,1,FONT_2X,(readADC(0)*20.00/1023),1);
        Lcd_prints (5,1,FONT_1X,(unsigned char*)PSTR("V"));
   //Ток стабилизации
        Lcd_printf (0,3,FONT_2X,(readADC(1)*10.00/1023),1);
        Lcd_prints (5,3,FONT_1X,(unsigned char*)PSTR("As"));

  //Текущий ток
        Lcd_printf (0,5,FONT_2X,(readADC(2)*10.00/1023),1);
        Lcd_prints (5,5,FONT_1X,(unsigned char*)PSTR("А"));
  //Омы
        Lcd_printf (9,0,FONT_1X,((readADC(0)*20.00/1023)/(readADC(2)*10.00/1023)),1);
        Lcd_prints (15,0,FONT_1X,(unsigned char*)PSTR("{"));
        Lcd_update();

  

2017-10-18_180326.jpg

Изменено пользователем gogaze
Дополнение к тексту

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


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

Не понел про "правый" столбец.

Если имелось в виду, что при 100Ом затрется знак Ома, то я делал так:

float napryazh, tok, soprotivl; // объявляем глобально (перед функцией main)
...
napryazh =((readADC(1)*2.56*(30/2.56))/1023);
tok =((readADC(2)*2.56*(6/2.56))/1023);
if(tok > 0){
	soprotivl = napryazh / tok;
	if(soprotivl < 1){Lcd_printf(9,1,FONT_1X,soprotivl,2);}
	if(soprotivl >= 1 && soprotivl < 10){Lcd_printf(12,1,FONT_1X,soprotivl,0);}
	if(soprotivl > 9 && soprotivl < 100){Lcd_printf(11,1,FONT_1X,soprotivl,0);}
	if(soprotivl > 99 && soprotivl < 1000){Lcd_printf(10,1,FONT_1X,soprotivl,0);}
	if(soprotivl > 999 && soprotivl < 10000){Lcd_printf(9,1,FONT_1X,soprotivl,0);}
}
else{Lcd_prints(9,1,FONT_1X,(unsigned char*)PSTR("----"));}
Lcd_prints(13,1,FONT_1X,(unsigned char*)PSTR("{"));// знак Ома
...

Еще готовься к тому, что в железе измеренное напряжение будет "плясать" до безобразия, в зависимости от пульсаций БП, сотое значение так вообще "8" будет.

В этом поможет таймер, настраивай на миллисекунд так 60 и по флагу выводи значения на экран каждые 0.5сек. Так же этот таймер пригодится для опроса кнопок, если они планируются.

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


Ссылка на сообщение
Поделиться на других сайтах
gogaze    0
7 часов назад, Berg сказал:

Не понел про "правый" столбец.

С размещением показаний на дисплее немного разобрался (скрин1)

Идею 

7 часов назад, Berg сказал:

то я делал так:

я понял, спасибо, буду иметь ввиду.

7 часов назад, Berg сказал:

в железе измеренное напряжение будет "плясать" до безобразия

Ну там же еще много факторов, которые на это влияют: и конфигурация неиспользуемых портов, и разводка печатной платы, и размещение деталей на ней. С этим я уже сталкивался, когда делал "показометр" для переделанного в лабораторный БП  АТХ.  Только делал в CVAVR на дисплее 1602. Нормально получилось. (скрин2)

7 часов назад, Berg сказал:

В этом поможет таймер, настраивай на миллисекунд так 60 и по флагу выводи значения на экран каждые 0.5сек. Так же этот таймер пригодится для опроса кнопок, если они планируются.

100% согласен! Но до изучения таймеров ни как пока не дойду (со мной внуков трое:4, 6 и 8 лет - особо не разгуляешься).

Еще раз спасибо тебе за полезные советы!  

2017-10-19_090742.jpg

2017-10-19_091611.jpg

Изменено пользователем gogaze
Дополнения к ответу

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


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

Уважаемый @Berg! Снова обращаюсь с проблемой. Хотел сделать как у тебя

float napryazh, tok, soprotivl; // объявляем глобально (перед функцией main)

napryazh =((readADC(1)*2.56*(30/2.56))/1023);

tok =((readADC(2)*2.56*(6/2.56))/1023);

Для большего удобства в введении дополнительных функций, но проект не стал компилироваться - ошибки типа "конфликт tok," и

"tok =((readADC(2)*2.56*(6/2.56))/1023);"  не константа. В CVAVR это решалось установкой одной галочки "float, width, precision" в свойствах проекта. А в Atmel studio 7 ни как не получается. Все, что нашел в инете перепробовал - ни в какую!

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


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

@gogaze, старайтесь избегать использования чисел с плавающей точкой. В 90% случаев достаточно фиксированной.

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: chip_1
      Для коптера делаем контроллер для автополета на ардуине. Но не можем совладать с калибровкой внешнего компаса. 
      Требуется написать прошивку для контроллера, который бы считал калибровку и выдавал ардуине готовый сигнал.
      Компас классический HMC5983, подключается по I2C. Но при его использовании ближе к югу или северу начинает показания резко менять, получается так называемый "эллипс" а не круг. 
      Контроллер найду, прошью, но с программированием на AVR вообще никак ((.
      В итоге должна получится железка, на входе компас, на выходе готовый сигнал после поправок. И кнопка начала калибровки. Т.е. по ее нажатию, надо крутануть компас вокруг своей оси.
      Проект не коммерческий, для себя, если кто хочет внести свой небольшой вклад, буду очень рад! Спасибо!
      С меня пивасик! )
    • Автор: butterfly193
      Доброго времени суток всем, уважаемые специалисты.
    • Автор: Vlad Zubarev
      Доброго времени суток!  Кто разбирается с Atmega128,  ассемблером и кому не жалко времени,  пожалуйста помогите. 
      Как можно корректировать скорость падения маятника (он должен постеменно набирать скорость падения и плавно замедляться к верхней точке)... Какие данные нужно менять?!  Спасибо! 
      логин маятник 2.zip

    • Автор: Veeeo
      Планирую сделать устройства для поддержания заданной темперетуры воды (равномерно по всему объему)
      Основные компоненты - ТЭН, помпа = бесколлекторный мотор (примерно как аквариумная, только расчитанная на 100 градусов), термодатчик, мозги на ESP8266.
      Плюс светодиоды.
      Схема ниже. Подскажите, пожалуйста, что упустил, какие ошибки. Больше всего смущает управление насосом. Его нужно только включать/выключать, ШИМ не нужен. Как избежать бросков тока при старте?

      Питание нисковольтной части:

      Преобразователь 12V -> 5V тоже думаю взять готовый (на LM2596):

    • Автор: Leonkuban
      Предлагаю услуги по разработке и мелокосерийному изготовлению радиоэлектронной продукции: от ТЗ до готовых изделий.
      Микроконтроллеры (Atmel), аналоговая элетроника (токи до 20А, в том числе с чистой синусоидой на биполярных транзисторах),
      измерительная электроника (слабые и сверхслабые сигналы, аналого-цифровая обработка с фильтрацией с вводом в ЭВМ), цифровая электроника и другое.
      Возможна инструментальная обработка (от лазерной резки до токарно-фрезерных работ, гибка металла, шелкография...) для изделий радиоэлектроники.
      Возможное написание тестовых программ под Atmel  (для запуска изделия).
      Также разработка внешней звуковой техники на основе PCM микросхем фирмы Техас Инструмент (типа внешней звуковой карты под определенные задачи: с микшированием, от микрофоном с фантомным питанием...).
      Возможно изготовление единичных образцов или сигнальных для проверки.
      г. Краснодар leonmezon@mail.ru
  • Сообщения

    • А пробовал доставать, прежде чем написать про страшные трудности..? Вот тут например, бери сразу 13 литров.. Сможешь и платы потравить, а когда надоест, то и взорвать чего-то  
      http://rushim.ru/advanced_search_result.php?keywords=азотная+кислота
    • использование кислот в хозяйстве вообще не очень безопасно. Хлорка хоть и пачкает, но хоть дырки насквозь в тебе не прожигает )
    • Подскажите - выпрямительный диодный мост можно собрать из РАЗНЫХ диодов Собственно зарядное устройство для авто по которому ПРОЕХАЛ водила и раздавил. Но трансформатор целый всмятку только амперметр и два диода из моста. Диоды Д245 по нынешним временам - раритет. Причем раздавлена та пара что катодами вместе. Вот и хочу поставить сборку Шотттки  из компьютерного БП Зарядное простейшее - трансформатор - диодный мост - лампочка (как ограничитель тока). Ну и амперметр(скорее показометр) P.S На прикрепленную схему не смотрите - почему-то старое сообщение прилепилось. Текст убрал а файл остался
    • Я порекомендовал бы такую концепцию: http://35ac-018.ucoz.ru/publ/35as_018m_nivaga_novyj_vzgljad/2-1-0-50 Главное принцип, но можно и повторить. Динамики и сопротивлением, и мощностью, и паспортными данными близки. Автор уверяет, что его разработка, но мне встречалась информация, что именно такое построение фильтра придумано вроде как французом и гораздо ранее, чем появилась информация этого автора.  Скажу, что я в акустические системы  из трёх полос, стараюсь внедрить этот принцип. Можете попробовать и Вы.
    • Вот это: http://forum.cxem.net/index.php?/profile/227940-qip83/ http://forum.cxem.net/index.php?/profile/227966-falcoanaist/ http://forum.cxem.net/index.php?/profile/227986-falconist/ новые клоны: http://forum.cxem.net/index.php?/profile/227854-qip82/     малолетка недалекая - БУКВАРЬ купи для начала ... а за многоликость - будешь ЗАБАН-ен
    • Это что за фигня такая и для чего она нужна? Видимо это по определению нашего мэра бывшего:  
    • Какой-то набор слов ... Нужна проверенная инфа - открой радиозвонок и посмотри на 12-вольтовый "палец" в нем ...