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

Вопрос новичка по AVR

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

 

Начинаю изучать микроконтроллеры. Выбрал AVR.

В качестве первого проекта хочу сделать устройство, которое подключается по usb и позволяет управлять 8-ью транзисторными выходами (для коммутации небольшой нагрузки).

Собираюсь приобрести AVR Dragon (стоит ли брать именно его?)

Какую конкретно AtMega лучше выбрать?

Может быть где-нибудь есть подобные схемы?

 

Заранее большое спасибо!!!

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


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

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

 

Начинаю изучать микроконтроллеры. Выбрал AVR.

В качестве первого проекта хочу сделать устройство, которое подключается по usb и позволяет управлять 8-ью транзисторными выходами (для коммутации небольшой нагрузки).

Собираюсь приобрести AVR Dragon (стоит ли брать именно его?)

Какую конкретно AtMega лучше выбрать?

Может быть где-нибудь есть подобные схемы?

 

Заранее большое спасибо!!!

Удобны мега128 - как один из самых толстых массовых чипов, так и мега8, как один из маленьких, дешёвых, и тоже массовых (с заменами на мегу 48, 88, 168)

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


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

Вот готовый проект USB-Parallel Output:

http://www.obdev.at/products/avrusb/powerswitch.html

На сайте ещё много других USB-проектов.

 

Посмотрите на USBTiny:

http://www.xs4all.nl/%7Edicks/avr/usbtiny/

 

Также можно попробовать IgorPlugUSB, который стал классическим:

http://www.cesko.host.sk/hardware.php

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


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

В качестве первого проекта хочу сделать устройство, которое подключается по usb

 

Что-то Вы сразу замахнулись "на Вильяма нашего, так сказать, Шекспира".

 

Сложно будет.

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


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

Что-то Вы сразу замахнулись "на Вильяма нашего, так сказать, Шекспира".

Сложно будет.

Ну, повторить-то будет не сложно, а вот если устройство заработает, опыт будет бесценным. Конечно, просто поморгать светодиодом для начинающего наверное лучше, но эти конструкции уже многократно проверены, в крайнем случае на той-же плате USB можно будет и потренироваться со светодиодом, а после залить рабочую прошивку.

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


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

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

Начни просто с мигания светодиодом по счетчику, потом несколько с/д попеременно, потом с ШИМом разберись, потом АЦП и уж потом передача данных по COM / USB

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


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

Думаю,мой вопрос для этой темы подойдет.Тоже недавно начал изучать программирование AVR.На СИ и компилятором CVAVR.Уже многому научился.Вот щас никак не могу додуматься-как сделать так,чтобы при кратковременном нажатии кнопки программа выполняла одну работу,а при удерживании например 3 сек.-другую. Понимаю,что нужно считать время,как это сделать,не пойму.

:help:

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

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


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

Думаю,мой вопрос для этой темы подойдет.Тоже недавно начал изучать программирование AVR.На СИ и компилятором CVAVR.Уже многому научился.Вот щас никак не могу додуматься-как сделать так,чтобы при кратковременном нажатии кнопки программа выполняла одну работу,а при удерживании например 3 сек.-другую. Понимаю,что нужно считать время,как это сделать,не пойму.

:help:

 

Зависит от того как у вас реализовано сканирование кнопок.

Если чтото типа такого:

if(!PINC.1) //если кнопка нажата то ждём пока её отпустят
{
   while(!PINC.1);
}

 

То вставте в цикл while счётчик и инкриментируйте его (только подберите константу _3000ms ):

 

cnt=0;
if(!PINC.1) //если кнопка нажата то ждём пока её отпустят
{
   while(!PINC.1) cnt++;

  if(cnt < _3000ms) task1(); //при удержании меньше 3с
  else task2(); //при удержании больше 3с

}

 

Если приведёте ваш вариант сканирования кнопок то подсказать как вам реализовать вашу идею будет проще ;)

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


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

Зависит от того как у вас реализовано сканирование кнопок.

Если чтото типа такого:

то придётся всё переделать, ибо чушь.

Стоять и ждать 3 секунды, пока нажата кнопка - непозволительная блажь.

Тем более никакой защиты от дребезга.

Нормальный вариант - это опрос по таймеру и выставление соответственных флагов для последующей обработки в основном потоке.

А обработка следующая:

Если флаг стоит более _хх_ (нужное вписать) миллисекунд (обычно 20-50), считаем, сто кнопка нажата и выполняем нужное действие.

Если более _хххх_ мс (3000, например), то выполняем другое действие. Время отсчитывается по тому же таймеру, то есть в каждом прерывании инкрементируем переменную времени.

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


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

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

я еще не сталкивался.Это что ,переменная,CVAVR на это- _3000ms ошибку выдает,что такое task тоже не знаю.

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

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


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

В моей программе это не страшно,думаю пример mempfis_ лучше подойдет для меня, с этим-
cnt

я еще не сталкивался.Это что ,переменная,CVAVR на это- _3000ms ошибку выдает,что такое task тоже не знаю.

 

В CVAVR есть библиотека delay.h delay_ms(), delay_us().

Подключите её через #include <delay.h>

 

Перед функцией main объявите глобальную переменную

unsigned int cnt=0;

 

и константу количества инкрементов этого счётчика которые будут считаться как 3 секунды

#define _3000ms 3000

 

 

#include <delay.h>

unsigned int cnt=0;
#define _3000ms 3000 

void task1(void)
{
//действия при удержании менее 3 с
}

void task2(void)
{
//действия при удержании более 3 с
}

void main(void)
{
//инициализация мк

for(;;)
{

   if(!PINC.1) //если кнопка нажата то ждём пока её отпустят
   {
     cnt=0;
     while(!PINC.1) 
    {
      if(cnt != 0xffff)  cnt++;//инкримент с проверкой на границу
      delay_ms(1);//ждём миллисекунду
     }

    if(cnt < _3000ms) task1(); //при удержании меньше 3с
    else task2(); //при удержании больше 3с
   }
}

}

 

tsk1(), task2() - это ваши функции в которых вы можете выполнить необходимые вам действия

Потренеруйтесь на этом для начала а потом сделайте как вам посоветовал MrYuran и как делают все в таком случае - для сканирования кнопок используйте прерывания от одного из таймеров :)

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

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


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

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

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

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

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

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

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

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

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

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