admin

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

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

Michael_M    1

В целом не плохо! есть более изящные методы - но мы пока их трогать не будем - в вашем коде например можно в кейсе оставить только выбор портов а задержку сделать общуу после выбора порта сократив тем самым количество строк :)

А вобще - вы написали код который в случайном порядке зажигает на 1 секунду какой либо из портов....

Даю наводку

А что если вы случайные числа примените не к выбору порта а к времени свечения от 1 до 2 секунд например?

;)

Спасибо!

Старался пока по заданию выполнить, в дальнейшем с набором опыта буду импровизировать :)

Конечно же в ближайшее время выложу более компактный код.

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

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


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

Готов 4 урок и практика к нему!

Господа - а что так тихо по домашнему заданию? У всех получилось? Не пренебрегайте... Я ведь специально стараюсь подобрать задачу на самостоятельную работу :)

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


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

Вот моя домашка.

http://youtu.be/KlAb2iIz6sM

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
char array[10]={

0b11000000, 0b11111001,
0b10100100, 0b10110000,
0b10011001, 0b10010010,
0b10000010, 0b11111000,
0b10000000, 0b10010000 }; //масив от 0 до 9
void options_port()
{
DDRB=0xff;
PORTB=0Xff;
DDRC=0xff;
PORTC=0xff;
}
int main(void)
{
options_port();
int i=0;
int a=0;
int b=0;
int c=0;
while(1){
 a=rand() % 10;
 b=rand() % 10;
 c=rand() % 10;
   while(i<200){


  PORTC=0b11111110;
  PORTB=array[a];
  _delay_ms(1);

  PORTC=0b11111101;
  PORTB=array[b];
  _delay_ms(1);

  PORTC=0b11111011;
  PORTB=array[c];
  _delay_ms(1);

  i++;
 }
 i=0;

}
}


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


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

А у меня проблемка, не хочет работать даже пример из видео. такое ощущение после установки "PORTB = 0xFF;" что то происходит и дальше дебаг не идет.

Вот код: http://gyazo.com/cfd7ddffeb91b045e6936b6e261a93a3

А вот что я вижу когда делаю "Step Over" на "PORTB = 0xFF;": http://gyazo.com/aa706403e1ac2d49bfe8a9b7060fadda

Если же закоментировать delay то выполение переходит на "PORTB = 0x00;", если потом снова нажать на "Step Over" то выполение остается на "PORTB = 0x00;", те. не переходит на while: http://gyazo.com/71b6c936f27861ae7c359882ff11e22d

Может я что то не сконфигурил? HELP Please :)

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


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

init вроде как зарезервированная С

переназоваите функцию типа init_ports

И на счет делеев - таки да ! если надо дебаг - коментите строки с делеями! А то оно выбрасывает в бибилиотеку делея!

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


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

переназвал все равно зависает на "PORTB = 0x00;" =(

И еще пару вопросов по теории:

Зачем нужны ограничивающие резисторы? и почему именно 220 Ом?

Если написать:

while(1)
{
	PORTB = 0xFF;//PORT_ON;
//_delay_ms(1000);

PORTB = 0x00;//PORT_OFF;
//_delay_ms(1000);

PORTB = 0xFF;//PORT_ON;
}

то дебаг скачет со 2-ого PORTB на 3-ий PORTB. почему на 1-ый не идет не знаю???

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

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


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

"Зачем нужны ограничивающие резисторы?" - чтобы ограничить ток. Почитайте в даташите допустимый ток порта и по закону Ома посчитайте какой ток будет идти при данном сопротивлении. Также у светодиода есть рабочий ток. Вот насчет светодиодов http://cxem.net/beginner/beginner54.php

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


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

По поводу непонятного поведения дебага грешу на последнюю студию beta 6.2. Тк. в протеусе код отлично работает. Буду переустанавливать на стабильную. =)

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


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

У меня вторая и нет глюков. Весь код покажите я у себя запущу проверим

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


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

Все правильно!

У вас же цикл - для того что бы выполнить последнюю строку нужен еще один переход (степ) - а так как у вас дальше изменений нет - то и степ не происходит!

Добавьте еще одну запись - любую и увидите результат! Либо же из цыкла вынесите для дебага - тогда тоже пройдут все шаги !

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


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

У вас же цикл - для того что бы выполнить последнюю строку нужен еще один переход (степ) - а так как у вас дальше изменений нет - то и степ не происходит!

не совсем понял. Смотрите если нету след. степа но есть цикл, то он должен возвращатся на 1-ую инструкцию.

В качестве примера можете расскоментировать "PORTB = 0xFF" тогда он будет бегать по 2-ой и 3-ей инструкции а на 1-ую не заходить

Т.е.:

while(1)
{
	PORTB = 0xFF;// вот тут он не будет останавливаться почему-то

	PORTB = 0x00;//PORT_OFF; // тут будет начало цикла, те при прогонке эта почему то будет 1-ая инструкция

	PORTB = 0xFF;//тут будет конец цикла, последний степ. после чего он должен будет перейти на 1-ую, а не на 2-ую
}

Изменено пользователем admin
CODE для чего тэг?

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


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

попробуйте изменить цикл в мейн функции на

do
{
  PORTB = 0xFF;// вот тут он не будет останавливаться почему-то
PORTB = 0x00;//PORT_OFF; // тут будет начало цикла, те при прогонке эта почему то будет 1-ая инструкция
}
while(1);

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

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


Ссылка на сообщение
Поделиться на других сайтах
Goodefine    95
PORTB = 0xFF;// вот тут он не будет останавливаться почему-то

Оптимизацию проверьте, должна быть выключена

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


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

Доброго времени суток, хотелось бы побольше узнать про всякие операции

#, ; ,{}, include, main, void и так далее: что они означают и что в какой последовательности делать?

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


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

Доброго времени суток, хотелось бы побольше узнать про всякие операции

#, ; ,{}, include, main, void и так далее: что они означают и что в какой последовательности делать?

http://yandex.ru/yan...&clid=9582&lr=5

ИМХО, перечитывать и пересказывать это всё нет никакого смысла. Это основы языка, а не особенности микроконтроллеров, про которые нужно рассказывать в уроках.

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


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

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

Чуть позже будет добавлен видеоурок с практикой и домашнее задание

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


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

Туда же добавлен пятый видеоурок (практика и домашнее задание).

Ждем ваших решений для оценки.

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


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

post-20311-0-91714200-1396804797.gif

Нет, ну нельзя же так кнопку опрашивать (зачем подтяжку включать-то тогда? да и не только это...), даже в образовательных целях. Ну и почему Си-шный оператор поразрядного сдвига назван "регистровым", тоже не совсем понятно.

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

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


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

Соглашусь с Goodefine. Даже с точки зрения портативных устройств, тратить на опрос кнопки около 2мА - не лучшее решение..

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


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

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

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

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

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

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

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

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

Загрузка...

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

    • Автор: Alexey104
      Всем привет!
      Возникла следующая проблема:
       
      Есть две ардуины 'Mega2560'. По несчастливому стечению обстоятельств данные платы попали в руки одному чуваку, который, вернув их, заявил, что они перестали работать после того, как он "чисто ради интереса" поковырял на обеих некоторые фьюзы. Есть у меня такой китайский usbasp v2 программатор:
      Подключив данный девайс к ICSP-пинам первой платы, удалось без проблем восстановить на ней загрузчик через стандартную Arduino-IDE, после чего работоспособность платы полностью восстановилась. Но вот при попытке сделать то же самое со второй платой, получаю это:
      Такое же сообщение получаю при попытке зашить загрузчик в неподключенную к программатору ардуину, то есть программатор вообще не видит МК. Плата прекрасно работала до того, как вышеупомянутый товарищ покрутил настройки фьюзов.
       
      Что я пытался предпринять:
      Замыкал пины JP3 программатора, отвечающие за понижение скорости, подключал к ардуине 5V от внешнего источника при прошивке загрузчика, - не помогло.
       
      Поиском пользоваться умею, аналогичную тему тут находил, но там проблема была в том, что парень неверно подключал программатор к контроллеру. В моём же случае всё подключено верно, повторюсь, что загрузчик первой платы этим же программатором был восстановлен успешно.
      Буду рад любым советам касательно того, как восстановить работоспособность платы.
       
       
       
    • Автор: Сергей Скопинцев
      Нужно разработать циклическую программу сбора информации от 10 измерительных источников. Период повторения цикла - одна секунда
      Источники:
       М - тензопреобразователь давления. Мостовая схема питается постоянным напряжением, выходной сигнал от 0 до 100 милливольт
       Т, ТМ, ТА- три канала измерения изменения напряжения в диапазоне от 400 до 600 милливольт (тоже нужен мост?)
       ЛМ - анализатор максимума напряжения (от 0 до 5 Вольт) по 10 точкам более-менее распределённых в измерительном цикле. Найденный максимум потом должен участвовать в анализе, постепенно уменьшаясь на 20% каждый цикл
       ВЛ - измерить напряжение на Малой емкости (50 пФ) с помощью емкостного делителя по алгоритму:
                         Снять Землю со средней точки емкостного делителя, подать на емкостной делитель положительный Импульс
                         Замерить нужное нам напряжение в средней точке делителя
                         Снять положительный Импульс с делителя, посадить на землю среднюю точку делителя
      - остальные каналы К7...К10  служебные
      Разрядность данных - 16 двоичных.

      Результаты писать на MicroSD текстовым файлом, на первом месте в строке текущее время в секундах, остальные каналы разделены пробелами
      Порядок каналов:
      Т - М -ТМ - Вл - ЛМ -...
      Коэффициенты усиления по каждому информационному каналу должен иметь возможность изменить оператор по формуле y = Ax + B
      Прибор автономный, питается от + 5 Вольт.
       
    • Автор: Ru_s
      Здравствуйте. Подскажите пожалуйста, возможно ли на attiny13 реализовать такую штуку. Мне в процессе работы программы нужно поменять режим работы таймера/счетчика с fast PWM на обычный счёт, отсчитать длительный промежуток времени и опять вернутся в режим ШИМ. Т.е. я подаю на ногу сигнал ШИМ и когда он в максимальном значении, я его отключаю, и тупо подаю на ногу высокий лог. уровень. В это время Т/С по идее свободен, и мне надо посчитать время работы выхода на максимальном лог. уровне, при достижении какого-то значения времени нужно перевести т/с обратно в ШИМ. Возможно ли это? И как приблизительно это реализовать
    • Автор: Kiraspbkiev Kira
      День Добрый. Есть два вопроса от новичка: 1) Правильная ли схема сделанная мною? 2) если схема верна то как правильно подключить к atmega328p-mu usb на чипе cp2102-grm?
      На схеме колодка JP1 это AVR ISP а JP2 это UART
      С проектированием столкнулся в первый раз, цель узнать что то новое и сделать своими руками:)