admin

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

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

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

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

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

Видеоуроки, разумеется, не смотрел, но могу предположить что 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    248

Допустим, сразу при включении нажата кнопка 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    215

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

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    215

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

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


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

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

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

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


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

Спасибо всем кто помогал!B)

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


Ссылка на сообщение
Поделиться на других сайтах
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    54

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

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


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

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

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


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

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

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

 

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


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

7-Я Тяжёлая, на нетбуке тупит сильно.  Заметил что 7 не все регистры отображает в ARM

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


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

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

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

Пример.jpg

NokiaDisplay.zip

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

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


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

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

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

Если тебе нужен как на скрине большой и узкий шрифт(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    11

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

Если имелось в виду, что при 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    248

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

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


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

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

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

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

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

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

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

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

Загрузка...

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

    • Автор: myrka
      Доброго дня! 
      Купил на барахолке вот такую плату





      на последней фото 2 черных провода в дальнейшем соединены 
      Это бегущая строка от игровых автоматов, на ней 2-мя цветами отображаются слоганы, хочу перепрошить в целях обучения.
      Вопросы:
      1) встречал ли кто-то описание этой микросхемы? (я в интернете не нашел, потратил 2 дня)
      2) есть на микросхеме разъем (10 ножек хорошо видно на последнем фото), как узнать их имена, за что отвечает каждая ножка? (есть некоторые предположения, но сомневаюсь в них)
      3) можно ли через CP2102-USB-UART-MODULE перепрошить вот эту микросхему, если да то как соединить?
    • Автор: Atreides
      Добрый день. Мне требуется реализовать программный юарт на атмеге16. Он нужен для того, чтобы принятые по нему данные отправить на аппаратный юарт. В интернете нашел примеры кода, но понять его мне трудно. Прошу вас словами в общих чертах объяснить принцип реализации программного юарта. Буду рад примерам, которые, на ваш взгляд, являются наиболее простыми и понятными. Заранее спасибо.
    • Автор: Igor Kuznietsov
      Здравствуйте.
      Поставил Atmel Studio 7 на ноут (windows 10 64).
      В отладке при пошаговом выполнении команды в
      регистр не записывается значение. В память данных (data IRAM memory 1 (проверял все 4...)) тоже ничего не записывает.
      Но компилируется. 
      Поэтому перешел на AVR Studio 4.
      Хочется разобраться с Atmel Studio 7.
      Помогите разобраться. 
      Вот код, который я пытался дебагить:
      .include "m16def.inc" .DSEG .org $100 var3: .byte 3 var2: .byte 2 var1: .byte 1 .CSEG lds R16, $10 sts var3, R16 NOP NOP NOP  
    • Автор: iiwanc
      Здравствуйте!
      Интересует такой вопрос...
      Имеется мат. плата ноутбука Petronas-D-15E. Дабы исключить неработающий видео чип, перевел на UMA, убрав резистор.
      Если все исправно, то может ли в данном случае работать внешний монитор, подключенный к разъему VGA? Должно ли выводиться изображение?
      Буду благодарен помощи.
    • Автор: karomag
      Добрый день.
      Экспериментирую с подключение 7-сегментного индикатора к мк stm32. Индикатор с общим катодом. Соответственно для вывода цифры необходимо на анод каждого сегмента подать 1, а на общий катод 0. И тут я не могу понять какие токи будут через порты. Теоретически, пины МК подключенные через резистор 300 Ом к аноду (напряжение МК 3.3 В) то ток будет 4 мА, тогда на общем катоде должно быть 7 * 4 = 28 мА (цифра 8, т.е. горят все сегменты). Т.е. это небольшое, но превышение макс тока на ногу 20 мА. И надо общий вывод подключать через транзисторный ключ.
      Взял мультиметр. Результаты замера: ток каждого сегмента ~2.5 мА, ток общего катода 5 мА. Вот тут я подумал о школе Хогвардс))) Как все таки рассчитывается все таки ток на общем выводе? 
  • Сообщения

    • 4. Некоторые телефоны по напряжению на этом выводе определяют какой тот можно потреблять от зарядного.
    • Валяются 2 практически идентичные USB зарядки с выходом (написано) 1A. Первая можно считать рабочая (дуга шваркнула при включении в розетку и выбила резистор-предохранитель, все остальное живо) а вторая пойдет на запчасти, диагноз "не работает", может быть будет желание еще повозиться с ней, но потом. Реально ли после несложных конструктивных доработок получить на выходе параллельно 2 USB порта для одновременной зарядки независимых устройств (допустим, телефонов, хотя не обязательно их)? Если верить в цифру 1А, то туда спокойно влазит 2 по 500 mA которые выдает порт ПК, с другой стороны, от тока будет зависеть время зарядки, потому не помешало бы его поднять. Один бородатый линуксоид на год старше меня хвастался тем что он в поездках заряжает свой смарт за какое-то смешное время зарядкой от Raspberry (выход 3A). Собственно вопросы такие. 1. Подключение 2 телефонов - потребителей параллельно к одному источнику им не навредит? В плане 2 телефона воткнуты в зарядку одновременно, но в сети нет электричества либо зарядка не в розетке и одно устройство начинает разряжать второе... кто знает что в них внутри и поддерживается ли функция USB хаба - нужно ли это предусмотреть? 2. Если навредит, можно обойтись парой диодов для разделения на выходе? Если ставить диоды то нужно будет поднять напряжение на 1В, как? 3. Какими несложными конструктивными изменениями в этой схеме можно поднять мощность до 1.5 или даже 2А ? 4. Скажите, зачем в более дешевой зарядке (сужу чисто по экономии диодов в мосте) на выходе контакты данных USB порта подключены через резисторы, подозреваю что до логического уровня 2.5 V, а на второй схеме ничего подобного нет и они просто не подключены? Спрашиваю из любопытства, а также чтобы выпилить эти 4 резистора потому что они какие-то ржавые  
    • это частота импульсмов а напряжение постоянное
    • доброго времени суток. поискал на просторах интернета схему и так не нашел имею ZB2L3 V2.2 Li-ion / Ni-MH ... Battery Capacity Tester (тестер измерения емкости аккумуляторов разных типов) ... Discharge voltage: 1.00V-15.00V 0.01V resolution Termination voltage range: 0.5-11.0V Supported by current: 3.000A 0.001A resolution ... к ней идет в комплекте пара резисторов 5W7R5 что дает фиксированную нагрузку на разряжаемые аккумуляторы. хочу регулировать ток разряда в пределах 0.01-3A при напряжениях от разных батарей 0.9-4.3V сначала подумал подключить в параллель несколько этих мощных резюков и последовательно с ними присоеднить купленный потенциометр 100/200R 2W и регулировать им ток в пределах более менее близких к указанным...   а потом подумал может возможно сделать какойто электронный аналог (схему) подобного резистора и чтоб он подключался и питался прямо непосредственно вместо резистора нагрузочного? и чтобы он был способен иметь стабилизированный ток независимо от поданного на него напряжения. например выкрутил резистор на середину и схема всегда будет потреблять почти одинаковый ток от источника нагруженного аккумулятора. а всю нагрузку рассеивать на ключевом транзисторе этой схемы и прикрутить этот транзистор на радиатор. тогда и не надо будет иметь этот мощный резистор и схема будет работать долее долговечно, тк мощности на регулируемом резисторе уже не будет выделяться много тем более что всяких транзисторов и других компонентов дома в нерабочей технике много вид самого устройства для измерения емкости аккумуляторов прикрепил к сообщению  
    • На каждой катушке 50 w проводом 0,8, затем 1575 w проводом 0,27,  100 w проводом 0,8, снова 1575 w проводом 0,27 и 50 w проводом 0,8. Секции по 50 w надо мотать с шагом, растянув на всю ширину каркаса. 50 + 100 + 50 - это на 8 Ом, 50 в параллель + 100 - на 4-ре. Первички последовательно  - перекрёстно, вторички - в  параллель.  
    • Да, у меня несколько лет банка соплями мимо контроллера была прикручена, удобно, пару банок в пакетиках с зипером в недельную поездку/поход и о розетках можно не думать. Но сейчас хотел сделать по-человечески. Нужно все таки заказывать из Китая и ждать месяц, пока других вариантов нет. Даже если я модель тела назову, не поможет делу, у нас в стране под них АКБ никто не заказывает. Клон HP RW-какого-то под виндой 5.5, отличается от оригинала только пластиковым держателем сим-карты вместо железного и немного меньшим объемом RAM.
    • да, я забыл об этом написать сорян на вход 220 В 50 Гц, на выход 2(3) В 200 А 1 Гц Да, стабильных 2(3) В 200 А