Меню Рубрики

Как написать программу для atmega8

Как написать программу для atmega8

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Говорящий с текстолитом

Карма: 11
Рейтинг сообщений: 144
Зарегистрирован: Пт дек 28, 2012 21:56:46
Сообщений: 1518
Откуда: St. Petersburg
Рейтинг сообщения: 0

Вы хотели сказать, «помогите мне найти в гугле пример такой программы для новичка»?

Лучшее обучение — самостоятельное, а материалов про AVR в сети много.

PS. Да, и кстати, к ветке «Аналоговая техника» это не очень относится

_________________
only pure true norwegian blackx

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Поставщик валерьянки для Кота

Карма: 41
Рейтинг сообщений: 161
Зарегистрирован: Вт июл 27, 2010 11:31:59
Сообщений: 2149
Откуда: Кххх
Рейтинг сообщения: 0

Компания ST обновила семейство ШИМ-регуляторов со встроенным ключом ViperPlus, выпустив новые бюджетные микросхемы VIPER122 и VIPER222, микросхемы VIPER265K и VIPER267K, имеющие встроенный ключ MOSFET напряжением 1050 В, и самый мощный VIPer31x. С их помощью возможно реализовать топологии: изолированный и неизолированный обратноходовой преобразователь (flyback), понижающий преобразователь (buck), повышающе-понижающий преобразователь (buck-boost).

Компилировать и прошивать МК собираюсь после проверки на эмуляторе . Хочется понять больше по программной части . Изучал Assembler на KP580 , поэтому на Atmel мне не так-то легко сейчас . Очень понравилась книга Ю.Ревич , «Практическое программирование Микроконтроллеров AVR на языке ассемблера» читал , старался понять .

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

Друг Кота

Карма: 27
Рейтинг сообщений: 203
Зарегистрирован: Чт ноя 26, 2009 11:16:50
Сообщений: 6015
Откуда: Москва
Рейтинг сообщения: 0

Огромное спасибо ! пока то что нужно , позже в любом случае отпишусь )))

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

Подключил кнопку к порту C , светодиод к порту D .
По схеме у меня порт C — ввода , порт D — вывода .
Кнопка у нас ввод , светодиод вывод .
По умолчанию все порты настроены на ввод , поэтому настраиваем только порт D на вывод .
При нажатии кнопки на порту ввода C появляется число 10000000 , до нажатия было 00000000 .
Вводим это число в регистр .
Далее его выводим .

У меня вопросы :
при нажатии кнопки как показано на рисунке , в порту ввода будет появляться число 10000000 или 00000000 . На KP580 включенная кнопка это 0 , тут аналогично ?
Как писать заголовок , первую строку программы , например «.include «d:\avr\avrasm\appnotes\2313def.inc» .
Нужно ли настраивать порт D на вывод ? ( объясните если можно ) .
Настройка порта D на вывод осуществляется с помощью этой команды ( ldi Temp, 0D11111111 ) ?

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

Вложения:
Снимок1.jpg [147.81 KiB]
Скачиваний: 5965
Вернуться наверх

Диапазон 35 °С . 42°С (температура тела) погрешность 0,3 °С
Диапазон 0 °С . 100°С (бытовая сфера) погрешность 1,0 °С

Говорящий с текстолитом

Карма: 11
Рейтинг сообщений: 144
Зарегистрирован: Пт дек 28, 2012 21:56:46
Сообщений: 1518
Откуда: St. Petersburg
Рейтинг сообщения: 0

Постарайтесь сначала отдельно:

1) сделать правильную схему. Например вы хотите повестить на МК кнопку и светодиод — в том же протеусе подключите все сразу так как нужно. С питанием, землей, линией сброса, защитными резисторами.

2) написать код в AVR Studio, и попробовать для начала его симуляцию именно там. Походить по шагам по коду и посмотреть как меняются квадратики и чиселки. На том же сайте поищите. Тут на радиокоте статьи неплохие, но не рассчитаны на совсем новичка.

_________________
only pure true norwegian blackx

Постарайтесь сначала отдельно:

1) сделать правильную схему. Например вы хотите повестить на МК кнопку и светодиод — в том же протеусе подключите все сразу так как нужно. С питанием, землей, линией сброса, защитными резисторами.

2) написать код в AVR Studio, и попробовать для начала его симуляцию именно там. Походить по шагам по коду и посмотреть как меняются квадратики и чиселки. На том же сайте поищите. Тут на радиокоте статьи неплохие, но не рассчитаны на совсем новичка.

огромное спасибо за ответ .
Постараюсь поработать над этим .
У меня самая первая ошибка в заголовке , выдает ошибку

Последний раз редактировалось RossiaForever Сб янв 05, 2013 10:02:58, всего редактировалось 2 раз(а).

Компилирую программу , компилируется .
Заметил «ошибку» программы при загрузке ее в МК в Proteus , думал это Proteus виноват ( в интернете часто на программу сваливают ) . Решил отладить программу через Debug в AVR Studio , так-то и нашел ошибочку .

В пример приведу часть программы ( она компилируется ) , команда заносит в регистр R16 ( Temp ) число 11111111 :

ldi Temp, 0b11111111
out DDRD,Temp

При отладке в Debug в регистре R16 появляется число FF ( 11111111 ) как и должно быть .
Счетчик циклов увеличивается с 0 до 4096 и т.д.
Счетчик программ (PC) = 0x000001 .
Счетчик циклов , программ и регистр R16 выделены красным цветом .

Вложения:
Снимок1.JPG [50.68 KiB]
Скачиваний: 5634
Вернуться наверх

Родился

Зарегистрирован: Чт фев 25, 2010 20:00:26
Сообщений: 10
Откуда: Украина
Рейтинг сообщения: 0

_________________
Не откладывай на завтра то, что не хочется делать сегодня. Завтра тоже не захочется.

То есть программу нужно размещать в неком цикле ?

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

.include «m8def.inc»
.def Temp=R16
.def Temp1=R17
.cseg
.org 0000

Init: Ldi Temp , 0b00000001
Shift : rcall Delay
cpi Temp,0b10000000
breq Init
lsl Temp
rjmp Shift

Delay: ; подпрограмма
Ldi Temp1 , 0
Loop:dec Temp1
brne Loop
ret

Без подпрограммы ( задержка ) все работает нормально .
При отладке программы :
по команде rcall вызывается п/п , при выходе из п/п . снова возвращается на команду Init: Ldi Temp , 0b00000001 , и так до бесконечности . Где накосячил не могу понять , указатели стека пока немного трудно понять .

Друг Кота

Карма: 32
Рейтинг сообщений: 227
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3804
Откуда: Москва
Рейтинг сообщения: 0

Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] , Jack_A и гости: 12

Источник статьи: http://www.radiokot.ru/forum/viewtopic.php?p=1529393

Занятие №1. Простейшая программа

Дата публикации: 18 декабря 2010 .

Задача: Разработаем программу управления одним светодиодом. При нажатии на кнопку светодиод горит, при отпускании гаснет.

Для начала разработаем принципиальную схему устройства. Для подключения к микроконтроллеру любых внешних устройств используются порты ввода-вывода. Каждый из портов способен работать как на вход так и на выход. Подключим светодиод к одному из портов, а кнопку к другому. Для этого опыта мы будем использовать контроллер Atmega8. Эта микросхема содержит 3 порта ввода-вывода, имеет 2 восьмиразрядных и 1 шестнадцатиразрядный таймер/счетчик. Также на борту имеется 3-х канальный ШИМ, 6-ти канальный 10-ти битный аналого-цифровой преобразователь и многое другое. По моему мнению микроконтроллер прекрасно подходит для изучения основ программирования.

Для подключения светодиода мы будем использовать линию PB0, а для считывания информации с кнопки воспользуемся линией PD0. Схема приведена на рис.1.

Через резистор R2 на вход PD0 подается плюс напряжения питания, что соответствует сигналу логической единице. При замыкании кнопки напряжение падает до нуля, что соответствует логическому нулю. В дальнейшем R2 можно исключить из схемы, заменяя его на внутренний нагрузочный резистор, введя необходимые настройки в программе. Светодиод подключен к выходу порта PB0 через токоограничивающий резистор R3. Для того чтобы зажечь светодиод надо подать в линию PB0 сигнал логической единицы. Задающий тактовый генератор будем использовать внутренний на 4MHz, так как в устройстве нет высоких требований к стабильности частоты.

Теперь пишем программу. Для написания программ я использую программную среду AVR Studio и WinAvr. Открываем AVR Studio, всплывает окошко приветствия, нажимаем кнопку «Создать новый проект» (New project), далее выбираем тип проекта — AVR GCC, пишем имя проекта например «cod1», ставим обе галочки «Создать папку проекта» и «Создать файл инициализации», нажимаем кнопку «Далее», в левом окошке выбираем «AVR Simulator», а в правом тип микроконтроллера «Atmega8», нажимаем кнопку «Финиш», открывается редактор и дерево категорий проекта — начальные установки закончены.

Для начала добавим стандартный текст описаний для Atmega8 с помощью оператора присоединения внешних файлов: #include

синтаксис директивы #include

#include
#include “имя_файла.h”

Угловые скобки указывают компилятору, что подключаемые файлы нужно сначала искать в стандартной папке WinAvr с именем include. Двойные кавычки “ и “ указывают компилятору начинать поиск с директории, в которой хранится проект.

Для каждого типа микроконтроллера есть свой заголовочный файл. Для ATMega8 этот файл называется iom8.h, для ATtiny2313 – iotn2313.h. В начале каждой программы мы должны подключать заголовочный файл того микроконтроллера, который мы используем. Но есть и общий заголовочный файл io.h. Препроцессор обрабатывает этот файл и в зависимости от настроек проекта включает в нашу программу нужный заголовочный файл.

Для нас первая строчка программы будет выглядеть вот так:

Любая программа на языке Си должна обязательно содержать одну главную функцию. Она имеет имя main. Выполнение программы всегда начинается с выполнения функции main. У функции есть заголовок – int main(void) и тело – оно ограниченно фигурными скобками <>.

В тело функции мы и будем добавлять наш код. Перед именем функции указывается тип возвращаемого значения. Если функция не возвращает значение – используется ключевое void.

int – это целое 2-х байтное число, диапазон значений от – 32768 до 32767

После имени функции в скобках () указываются параметры, которые передаются функции при ее вызове. Если функция без параметров – используется ключевое слово void. Функция main содержит в себе набор команд, настройки системы и главный цикл программы.

Далее настраиваем порт D на вход. Режим работы порта определяется содержимым регистра DDRD(регистр направления передачи информации). Записываем в этот регистр число «0x00» (0b0000000 – в двоичном виде), кроме кнопки к этому порту ничего не подключено, поэтому настраиваем весь порт D на вход. Настроить порт поразрядно можно записав в каждый бит регистра числа 0 или 1 (0-вход, 1-выход), например DDRD = 0x81 (0b10000001) — первая и последняя линия порта D работают на выход, остальные на вход. Необходимо также подключить внутренний нагрузочный резистор. Включением и отключением внутренних резисторов управляет регистр PORTx, если порт находится в режиме ввода. Запишем туда единицы.

Настраиваем порт B на выход. Режим работы порта определяется содержимым регистра DDRB. Ничего кроме светодиода к порту B не подключено, поэтому можно весь порт настроить на выход. Это делается записью в регистр DDRB числа «0xFF». Для того чтобы при первом включении светодиод не загорелся запишем в порт B логические нули. Это делается записью PORTB = 0x00;

Для присвоения значений используется символ «=» и называется оператором присваивания, нельзя путать со знаком «равно»

Настройка портов будет выглядеть так:

DDRD = 0x00;
PORTD = 0xFF;
DDRB = 0xFF;
PORTB = 0x00;

Пишем основной цикл программы. while («пока» с англ.) — эта команда организует цикл, многократно повторяя тело цикла до тех пор пока выполняется условие, т. е пока выражение в скобках является истинным. В языке Си принято считать , что выражение истинно, если оно не равно нулю, и ложно, если равно.

Команда выглядит следующим образом:

В нашем случае основной цикл будет состоять лишь из одной команды. Эта команда присваивает регистру PORTB инвертируемое значение регистра PORTD.

PIND; //взять значение из порта D, проинвертировать его и присвоить PORTB (записать в PORTB)

// выражения на языке Си читаются справа налево

PIND регистр ввода информации. Для того, чтобы прочитать информацию с внешнего вывода контроллера, нужно сначала перевести нужный разряд порта в режим ввода. То есть записать в соответствующий бит регистра DDRx ноль. Только после этого на данный вывод можно подавать цифровой сигнал с внешнего устройства. Далее микроконтроллер прочитает байт из регистра PINx. Содержимое соответствующего бита соответствует сигналу на внешнем выводе порта. Наша программа готова и выглядит так:

В языке Си широко используются комментарии. Есть два способа написания.

При этом компилятор не будет обращать внимание на то что написано в комментарии.

Если используя эту же программу и подключить к микроконтроллеру 8 кнопок и 8 светодиодов, как показано на рисунке 2, то будет понятно что каждый бит порта D соответствует своему биту порта B. Нажимая кнопку SB1 — загорается HL1, нажимая кнопку SB2 — загорается HL2 и т.д.

В статье были использованы материалы из книги Белова А.В. «Самоучитель разработчика устройств на AVR»

Источник статьи: http://radioparty.ru/prog-avr/program-c/224-lesson1


0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии