andy8mm Пост: 297408 От 26.Mar.2011 (15:33) ДедИван, да, пора наступить на мк-грабли.
Надеюсь подключатся спецы по контроллерам, живее будет и всем интереснее.
Давайте отделим котлеты от мух.
По контроллеру все сюда.
andy8mm Пост: 301338 От 10.Apr.2011 (11:12)
... медитировать над каждой строчкойДедаВаня.
.device tiny25
директива .device определяет тип микроконтроллера,
для которого пишется программа. По этой директиве
в ассемблере выбирается файл,
в котором присвоены имена регистрам ввода-вывода
и их разрядам, указана емкость запоминающих устройств
и отмечены другие особенности микроконтроллера используемого типа.
.include "tn25def.inc"
директива .include указывает имя дополнительного файла,
который должен быть использован в процессе ассемблирования.
добавить файл tn25def.inc
.def tm=R16
директива .def присваивает символИческое(то есть из символов) имя Регистру Общего Назначения (аббревиатура РОН).
РОН R16 теперь называется просто tm, по этой кличке мы его будем дальше обзывать в программе.
.cseg (читать c.106 atmelbook.djvu Гребнев В.В. 2002г 176с.)
директива .cseg определяет тип сегмента CSEG
(всего три типа сегментов:
1. CSEG программный сегмент;
2. ESEG ;
3. DSEG - сегмент данных.
В сегменте типа CSEG записываются мнемокоды команд и могут
записываться все директивы ассемблера кроме директивы .BYTE.
.org 0 директива распределяет память контроллера.
Вопрос: куда и кому нолик? (задает начальный адрес)
rjmp безусловный переход к метке reset (смотреть ниже в левой колонке, ещё есть метка timer0не путаем) reset
andy8mm Пост: 301349 От 10.Apr.2011 (13:09) .org 0 директива распределяет память контроллера. ?
Это указание ассемблеру- чтобы он поместил эту команду именно по
адресу 0. Это не простой адрес.
с 0 по 15 ячейки зарезервированы под прерывания.
Каждый вид прерывания автоматически приводит контроллер к одной
из этих ячеек.
Сброс приводит всегда к нулевой.
Здесь и размещаем адрес перехода- куда должен перейти контроллер
после сброса- на 16 адрес- начало программы и настройка регистров.
Адрес 16- это просто первый свободный адрес после зарезервированных ячеек.
А если у нас сработает допустим аналоговый компаратор- АС,
то конроллер перекинет на 7 адрес. Там мы должны разместить
команду перехода на программу обслуживания компаратора.
Спасибо! ДедаВаня, мне стыдно отрывать тебя на объяснения ассемблера.
И я знаю что многие ребята стесняются тебя спрашивать,
что бы не отвлекать "по мелочам". Спасибо.
Система команд 8-разрядных RISC микроконтроллеров семейства AVR cli "all interrapt diss".
функция cli - "Очистить флаг глобального прерывания"
clr стираем в РОН по имени tm все, то есть очищаем его
функция clr - "Очистить регистр"
ldi записываем в tm 0х90.
функция ldi - "Загрузить непосредственное значение"
ВОпрос: Что значит 0х90 и "подстройка тактового генератора"?
out
функция out - "Записать данные из регистра в порт I/O" sei
(функция sei - "Установить флаг глобального прерывания")
slep
функция slep - "Установить режим SLEEP"
Вопрос: это режим минимального потребления тинькой?
Надо бы заметить, что при старте прерывания запрещены и инструкция CLI не обязательна.
Подстройка тактового - это индивидуально для каждого кристалла. Калибруется при изготовлении и подстройка нужна только если требуется изменить тактовую в некоторых пределах. В вышеприведенном коде первые 4 инструкции можно удалить без вреда.
andy8mm Пост: 301354 От 10.Apr.2011 (13:34)
функция cli - "Очистить флаг глобального прерывания"
Это мы запрещаем контроллеру реагировать на прерывания,
потому что мы заняты важным делом- настраиваем регистры перед работой.
Потом, после настройки - разрешим.
Что значит 0х90 и "подстройка тактового генератора"?
Это внутренний RC генератор, частоту его можно изменять,
этой подстройкой мы получаем чтобы она точно была равна 8 Мгц.
От этого будут зависить периоды таймера и соответственно выходного
импульса.
queet Пост: 301355 От 10.Apr.2011 (13:42)
Надо бы заметить, что при старте прерывания запрещены и инструкция CLI не обязательна.
Вообще и регистры чистить необязательно-
вроде нули должны быть.
Но иногда что то бывает - сбоит.
Редко. Береженого бог бережот -сказала монашка надевая презерватив на морковку.
ВОпрос:"out osccal, tm" выдает на выход(out) значение tm?
Нет. Эта инструкция отправляет значение tm в регистр, отвечающий за частоту внутреннего RC генератора. Изменяя это значение можно в некоторых пределах изменять частоту тактового генератора.
queet Пост: 301355 От 10.Apr.2011 (13:42)
В вышеприведенном коде первые 4 инструкции можно удалить без вреда.
Или добавить еще одну команду- сохранить tm в стеке.
Это к тому, что если собирать большую программу из готовых кусочков,
то каждый кусочек должен соображать- а вдруг какая то программа пользовалась этим регистром и сохранила там что то нужное для себя?
Поэтому надо на всякий случай сохранить это значение,
а при окончании восстановить.
Тогда можно смело набирать программу из таких умных кусочков,
и они не будут мешать друг другу.
cli - запрещаем контроллеру реагировать на прерывания.
global interrupt disable - глобальный запрет прерываний (по умолчанию).
Потом, после настройки - разрешим.
sei - разрешаем контроллеру реагировать на прерывания.
global interrupt enable - глобальное разрешение прерываний
Если появится прерывание уходим на другую часть кода,
если нет:
искрим во всех цилиндрах 2000мкс в режиме "ПУСК".
ВОпрос: где спрятаны 2000мкс - в каком регистре сравнения "3E80"?
2000/0,125=16 000 тактов. 1610= 3E80hex= 11111010000000bin
andy8mm Пост: 301392 От 10.Apr.2011 (15:09)
где спрятаны 2000мкс
А их тут нет вообще.
Искра идет постоянно- пока датчик холла не закроется.
Он выдаст нолик- сброс на контроллер- и генератор перестанет работать.
Как откроется снова- опять заискрит..
Это самый примитивный вариант пока.
Чтобы он не искрил всю дорогу- сделай еще кусок программы-
которая считает до 2000.
Только учти - контроллер у нас как первоклашка - только до 256 умеет считать.
Поэтому до 2000 считать он не умеет.
Надо заставить его считать например до 200 10 раз подряд.
Попробуй.
У нас есть еще один свободный таймер- можно на нем делать.
а можно чисто програмно.