• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Освоение МК ATmega16

  • Автор темы Автор темы News
  • Дата начала Дата начала

News

Собираю Саб
Регистрация
12 Апр 2011
Сообщения
1,611
Реакции
14
Баллы
0
Освоение МК ATmega16

Совершенно недавно (2 дня назад) загорелся я таки идеей научится програмировать МК. Нашол в интернете небольшой самоучитель Краткий Курс - Самоучитель - Программирование микроконтроллеров AVR - быстрый старт с нуля - 123avr.com. Дочитал я его до 6 странице и возник конфуз, а точнее целое море вопросов.
1 Конечно же с большого нетерпежа я залез в компилятор, но как только я собрался с мыслями, выяснилось, что команды то я многие знаю, а вот с их практическим применением беда, точнее как применить то я понимаю, но ведь у МК каждая нога имеет собственный адрес, который мне раздобыть не удалась....
2 Что содержится в файле <mega16.h>.
3 Значение оператора #define мне так до конца и не понятно. #define ROWER E. Эта строчка обозначает что "E" бкдет заменятся ROWER для уменьшения кода?
4 Оператор Goto. На что он может ссылаться?
5
PORTB = (unsigned char) ~(ADCW>>2); ADCW - это переменная слово (двухбайтовая величина - так она объявлена в файле mega16.h) в котором CodeVisionAVR сохраняет 10-битный результат АЦП - а именно в битах9_0 (биты с 9-го по 0-й) т.е. результат выровнен обычно - вправо.
Что это обозначает? Что такое PORTB?

Извеняюсь если вопросов много. Кому не сложно ответте.
В датащите не нашол адреса всех 40 ног. Только 21.
 
Последнее редактирование:
5 Пункт вродеясно стало. PORTB это вымышленая переменная то-же что и ADCW.
 
Вроде потихоньку вьежжаю.
Посмотрите на текст простейшей программы. Правильно?
main()
{
//Для краткой записи используем макросы
#define PORTA.1 A1
#define PORTA.2 A2
#define PORTA.3 A3
#define PORTA.4 A4
#define PORTA.5 A5
#define PORTA.6 A6
#define PORTA.7 A7
//Если на 2 ножке порта А присутствует логическая 1, то вывести на ножку 1 порта А логическую 1
if(A2) A1 = 1:
//Иначе вывести логическую единицу на ножку 3 порта А
else {A3 = 1;}
}
 
Хех ошибку в макросах никто не нашол....
 
Есть ошибка. В «макросе» «нашОл» предпоследняя Е или Ё.
 
#include <mega16.h>
Inicializacion()
{
//Делаем выходом ПОРТ А
DDRA=255;
//Делаем входом ПОРТ В
DDRB=0;
}
Main()
{
Inicializacion();
//Запускаем таймер 0 (Время переполнения 32МСЕК)
TCCR0=0b00000101;
while(TOV0){PORTA.0=0; PORTA.2=0; PORTA.4=0; PORTA.6=0; PORTA.1=1; PORTA.3=1; PORTA.5=1; PORTA.7=1; TIFR = 0x01;}
//Запускаем таймер 0 (Время переполнения 32МСЕК)
TCCR0=0b00000101;
while(TOV0){PORTA^=1; PORTA^=0; TIFR = 0x01;}
}
Написал такую прогу. Она должна чередовать каждый 2 светодиод а ПОРТЕ А с таймлингом в 32МКС
 
ВМЛАБ ругается на любой загруженый проэкт.... Что делать?
 

Вложения

  • VMLAB.webp
    VMLAB.webp
    159.1 KB · Просмотры: 874
Нет уж:) Мне АВР нравятся, к тому-же фундамент заложен... :)
 
Обьясните ПЖЛ как CodeVisionAVR Evaluation V2.05.8 работать. Никак ХЕКС, ЛСТ файлы немогу получить, а без них програму не просимулировать.
 
ты программу для CodeVisionAVR писал? в разных программах синтаксис немного отличается, поэтому при компиляции могут возникнуть ошибки
в CodeVisionAVR необходимо создать проект для Mega16, появится проект с текстом программы, потом сгенерированный код можно заменить на свой :)
 
ты программу для CodeVisionAVR писал? в разных программах синтаксис немного отличается, поэтому при компиляции могут возникнуть ошибки
в CodeVisionAVR необходимо создать проект для Mega16, появится проект с текстом программы, потом сгенерированный код можно заменить на свой :)
Ильмир, можно в картинках если не затруднит?
 
Помогите получить ХЕКС файл.
Исходный код.
#include <mega16.h>
Inicializacion()
{
//Делаем выходом ПОРТ А
DDRA=255;
//Делаем входом ПОРТ В
DDRB=0;
}
Main()
{
Inicializacion();
//Запускаем таймер 0 (Время переполнения 32МСЕК)
TCCR0=0b00000101;
while(TOV0){PORTA.0=0; PORTA.2=0; PORTA.4=0; PORTA.6=0; PORTA.1=1; PORTA.3=1; PORTA.5=1; PORTA.7=1; TIFR = 0x01;}
//Запускаем таймер 0 (Время переполнения 32МСЕК)
TCCR0=0b00000101;
while(TOV0){PORTA^=1; PORTA^=0; TIFR = 0x01;}
}
 
Все. Разобрался.
Программа нифига не работает (Наверное в адресах накосячил)
 
#include <mega16.h>
main()
{
//Инициализируем ПОРТ А как выход.
DDRA=225;
//Запускаем 8 Битный таймер с коэф. деления 1024, тем самым получая 3.8 переполнений в секунду или каждые 263М сек
TCCR0 = 0b00000101;
//Если бит 0 в регистре TIFR (Переполнение таймера) равен 0, то уровень на ноге 0 ПОРА А - высокий.
//Иначе (Если бит равен 1) условие в цыкле While преобретае положительное значение и обрывается.
while(!(TIFR=0b00000001)){PORTA.0=1;}
//Обнуляем бит О в регистре TIFR путем его перезаписи.
TIFR=0b00000001;
//Обнуляем состояние ноги 0 ПОРА А.
PORTA.0=0;
//Аналогично, но теперь 0 нога ПОРТА А теперь равна 0.
while(!(TIFR=0b00000001)){PORTA.0=0;}
//Обнуляем бит О в регистре TIFR путем его перезаписи.
TIFR=0b00000001;
//Программа подошла к концу и перезагружается.
}
Взгляните. Светодиод на ноге 1 ПОРТА А постоянно горит, хотя "Зацыкливания" эмулятор не показывает...
Мигалка.webp

Посмотреть вложение Тест.zip
ПС: Заменил в условиях цикла = на &. Та-же фигня, но теперь на обработку цикла требуется больше времени.
 
Последнее редактирование:
На Ассемблере.
;#include <mega16.h>
#ifndef __SLEEP_DEFINED__
#define __SLEEP_DEFINED__
.EQU __se_bit=0x40
.EQU __sm_mask=0xB0
.EQU __sm_powerdown=0x20
.EQU __sm_powersave=0x30
.EQU __sm_standby=0xA0
.EQU __sm_ext_standby=0xB0
.EQU __sm_adc_noise_red=0x10
.SET power_ctrl_reg=mcucr
#endif
;main()
; 0000 0003 {

.CSEG
_main:
; .FSTART _main
; 0000 0004 //Инициализируем ПОРТ А как выход.
; 0000 0005 DDRA=225;
LDI R30,LOW(225)
OUT 0x1A,R30
; 0000 0006 //Запускаем 8 Битный таймер с коэф. деления 1024, тем самым получая 3.8 переполнений в секунду или каждые 263М сек
; 0000 0007 TCCR0 = 0b00000101;
LDI R30,LOW(5)
OUT 0x33,R30
; 0000 0008 //Если бит 0 в регистре TIFR (Переполнение таймера) равен 0, то уровень на ноге 0 ПОРА А - высокий.
; 0000 0009 //Иначе (Если бит равен 1) условие в цыкле While преобретае положительное значение и обрывается.
; 0000 000A while(!(TIFR&0b00000001)){PORTA.0=1;}
_0x3:
IN R30,0x38
ANDI R30,LOW(0x1)
BRNE _0x5
SBI 0x1B,0
RJMP _0x3
_0x5:
; 0000 000B //Обнуляем бит О в регистре TIFR путем его перезаписи.
; 0000 000C TIFR=0b00000001;
LDI R30,LOW(1)
OUT 0x38,R30
; 0000 000D //Обнуляем состояние ноги 0 ПОРА А.
; 0000 000E PORTA.0=0;
CBI 0x1B,0
; 0000 000F //Аналогично, но теперь 0 нога ПОРТА А теперь равна 0.
; 0000 0010 while(!(TIFR&0b00000001)){PORTA.0=0;}
_0xA:
IN R30,0x38
ANDI R30,LOW(0x1)
BRNE _0xC
CBI 0x1B,0
RJMP _0xA
_0xC:
; 0000 0011 //Обнуляем бит О в регистре TIFR путем его перезаписи.
; 0000 0012 TIFR=0b00000001;
LDI R30,LOW(1)
OUT 0x38,R30
; 0000 0013 //Программа подошла к концу и перезагружается.
; 0000 0014 }
_0xF:
RJMP _0xF
; .FEND

.CSEG

.CSEG
;END OF CODE MARKER
__END_OF_CODE:
 
Видимо в симуляторе баг.
 

Вложения

  • Симулятор.webp
    Симулятор.webp
    97.9 KB · Просмотры: 78
Поздравте меня! Все работает!
Вод только CVAVR накосячил и неправильно перевел на ассемблер код - поэтому задействованы ноги PA7, PA6, PA5.
Код с комментариями.
#include <mega16.h>
main()
{
//Инициализируем ПОРТ А как выход.
DDRA=225;
//Запускаем 8 Битный таймер с коэф. деления 1024, тем самым получая 3.8 переполнений в секунду или каждые 263М сек
TCCR0 = 0b00000101;
//Если бит 0 в регистре TIFR (Переполнение таймера) равен 0, то уровень на ноге 0 ПОРА А - высокий.
//Иначе (Если бит равен 1) условие в цыкле While преобретае положительное значение и обрывается.
while(!(TIFR&0b00000001)){PORTA.0=1;}
//Обнуляем бит О в регистре TIFR путем его перезаписи.
TIFR |=1<<0;
//Обнуляем состояние ноги 0 ПОРА А.
PORTA.0=0;
//Аналогично, но теперь 0 нога ПОРТА А теперь равна 0.
while(!(TIFR&0b00000001)){PORTA.0=0;}
//Обнуляем бит О в регистре TIFR путем его перезаписи.
TIFR |=1<<0;
//Программа подошла к концу и перезагружается.
}
И скрин :)
 

Вложения

  • Мигалка.webp
    Мигалка.webp
    168.6 KB · Просмотры: 113
Назад
Сверху