роботы робототехника микроконтроллеры


 Страниц (6): [1] 2 3 4 5 6 »   

> Без описания
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



Ну как не могу в него вникнуть. как сделать мигание светодиодом с частотой примерно 36 кгц? у меня atmega8 -8pu с резонатором 8МГц.
как инициализировать таймер, а то я запутался во всех этих регистрах... И как мне сделать именно 36мгц частоту?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



к чему будем подключать светодиод и у чему TSOP ?
к каким ногам.
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



из ног занято только C1-C3,D0, B6,B7(тактирование) и все... так что любые... ну возьмем к примеру D2 на выход, D3 на вход
(Добавление)
и как сделать перерыв межды импульсами в пачке и между пачками...

(Отредактировано автором: 18 Октября, 2009 - 15:06:49)

 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



SNEGOK23 пишет:
D2 на выход, D3 на вход


часа через пол заходи :)
на СИ кода от меня не будет (могу только на асм), но общий алгоритм дам.
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



мне достаточно просто понятного объяснения регистров... ну хотя и алгоритм... заранее спасибо
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



ЗЫ.
прерывание по переполнению от Timer0 свободно ?
бум делать на нём.
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



свободно, т.к. я вообще не понимаю таймер=) а в программе у меня лишь установка лог.1 на 2 вывода=)
(Добавление)
nest, а у тебя есть ICQ? просто тут долго, а мне желательно в близжайший час усвоить=)
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



есть. пока не дам. я там не консультирую :)
да и тут будет потом полезно всем. абажди чуток.
 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



жду=(
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



(надо же... длинные сообщения не принимают Грустный )

ЧАСТЬ 1

для светодиода лучше будем использовать ножку C0.
т.к. альтернативная функция предложенной ножки D2
является внешнее прерывание INT0. Лучше подобные
интересные ножки экономить для чего то более важного.


имеем
период частоты тактирования микроконтроллера:
T(8MHz) : 1/800000000Гц = 0,000000125 sek
период частоты 36 кГц:
T(36kHZ) : 1/36000Гц = 0,000027777 sek
длительность импульса или длительность паузы между импульсами частоты 36 кГц при коэффициенте заполнения равному 50%:
T(36kHZ/2) : (1/36000)/2 = 0,000013888 sek

предделитель таймера-0 ставим равным единице:
в регистре TCCR0 в биты
Bit 2:0 – CS02:0: Clock Select записываем 001
TCCR0 = 0b00000001

расчитаем период переполнения таймера-0.
мы установили у таймера-0 предделитель равный 1, то есть он считает с тактовой частотой µC. поэтому получаем:
T(OVF)=256*1/800000000Гц = 0,000032 sek
(256 - это число тактовых импульсов для заполнения всех восьми бит таймера-0, т.к. он восьмибитный)

находим число предустановки таймера-0.
длительность импульса частоты 36 кГц делим на период тактирования таймера-0:
T(36kHZ/2)/T(8MHz) = 0,000013888 sek / 0,000000125 sek = 111,04
округляем до целой доли, получаем число 111.
т.к. восьмибитный таймер считает от нуля, вычитаем:
256-111 = 145

ради этого 145 и все расчётыУлыбка



грубые вычисления окончены.
пишем код.


; настраиваем ножку C0 на выход.
DDRC0=OUT
; настраиваем ножку D3 на вход.
DDRD3=IN

; инициализация таймера-0
TCCR0 = 0b00000001 ; устанавливаем предделитель таймера-0 равным единице.

; инициализируем внешнее прерывание на низкий уровень (т.к. у TSOP активный уровень - низкий, нуль)
;Bit 3, 2 – ISC11, ISC10: Interrupt Sense Control 1 Bit 1 and Bit 0

MCUCR = 0b00000000 ; поэтому биты #3 и #4 должны быть нулём.


MAIN_LOOP:
; где нужно включим работу TSOP-а:
rcall INIT_TSOP; включаем TSOP-бампер

; тут идёт основной цикл основной программы
; светим, управляем, гасим, включаем
; или просто обогреваем окружающую среду,
; можно отправить микроконтроллер в спячку
; коммандой sleep, или выполнять какие либо вычисления...
; bla - bla - bla
; можно проверить флаг "TSOP_IS_ACTIV".
; если флаг "TSOP_IS_ACTIV" установлен, то впереди -
препятствие!!!
; (не забыть потом сбросить флаг "TSOP_IS_ACTIV"!).


; bla - bla - bla
; тут дальше шуруем в основном цикле
; bla - bla - bla

; если TSOP-бампер не нужен - можно его выключить:

rcall DISABLE_TSOP; вЫключаем TSOP-бампер

; bla - bla - bla
; пока не упрёмся в его конец

rjmp MAIN_LOOP ; конец основного цикла, прыгаем на начало.

(Отредактировано автором: 18 Октября, 2009 - 21:19:50)

 
 Top
SNEGOK23 Post Id


Главнокомандующий


Сообщений всего: 259
Дата рег-ции: Сент. 2009  



огромное спасибо, но вот это не понял..

Цитата:
находим число предустановки таймера-0.
длительность импульса частоты 36 кГц делим на период тактирования таймера-0:
T(36kHZ/2)/T(8MHz) = 0,000013888 sek / 0,000000125 sek = 111,04
округляем до целой доли, получаем число 111.
т.к. восьмибитный таймер считает от нуля, вычитаем:
256-111 = 145

ради этого 145 и все расчёты
\

то есть таймер доходит до 145 и кидает флаг прерывания?
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
; тут ниже идут подпрограммы, прерывания и всякая требуха...
; \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


; !!! ИНИЦИАЛИЗАЦИЯ ПРОВЕРКИ TSOP !!!
INIT_TSOP:
; инициализируем количество вспышек в пачке:
flash_counter=40 ; ставим удвоенное число.
; разрешаем прерывание по переполнению таймера-0:
; Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable

TIMSK = 0b00000001 ; для этого устанавливаем бит #0 в регистре TIMSK
; сбрасываем µC-флаги прерывания INT1 (это очень важно! повышает надёжность от непредусмотренных прерываний):
; Bit 7 – INTF1: External Interrupt Flag 1

GIFR = 0b10000000 ; для этого устанавливаем бит #7 в регистре GIFR
; разрешаем внешнее прерывание INT1:
; Bit 7 – INT1: External Interrupt Request 1 Enable

GICR = 0b10000000 ; для этого устанавливаем бит #7 в регистре GICR
RET ; возвращаемся


; !!! Выключение работы TSOP-бампера !
DISABLE_TSOP:
; запрещаем прерывание по переполнению таймера-0:
; Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable

TIMSK = 0b00000000 ; для этого сбрасываем бит #0 в регистре TIMSK
; запрещаем внешнее прерывание INT1:
; Bit 7 – INT1: External Interrupt Request 1 Enable

GICR = 0b00000000 ; для этого сбрасываем бит #7 в регистре GICR
RET ; возвращаемся


; !!! ПРЕРЫВАНИЕ ПО ПЕРЕПОЛНЕНИЮ ТАЙМЕРА-0 !!!
; TIMER0 OVF Timer/Counter0 Overflow

T0_OVFL_INT:
; во-первых загружаем в счётчик расчётное число предустановки:
TCNT0=145
; во-вторых убавим счётчик вспышек на один:
flash_counter=flash_counter-1
; и проверим, не обнулился ли он:
if flash_counter==0
then { ; если обнулился ...
; 1. запрещаем прерывание по переполнению таймера-0
; Bit 0 - TOIE0: Timer/Counter0 Overflow Interrupt Enable

TIMSK = 0b00000000 ; для этого сбрасываем бит #0 в регистре TIMSK
; 2. запрещаем внешнее прерывание INT1
; Bit 7 - INT1: External Interrupt Request 1 Enable

GICR = 0b00000000 ; для этого сбрасываем бит #7 в регистре GICR
; 3. выходим из прерывания
RETI
}
else{ ; а если счётчик вспышек не обнулился...
; инвертируем удобным нам способом ножку для светодиода

invert LED_PIN ; LED_PIN мы определили для C0!!
; и выходим из переывния
RETI
}

; !!! ВНЕШНЕЕ ПРЕРЫВАНИЕ INT1 !!!
;INT1 External Interrupt Request 1

TSOP_INT:
; если мы тут оказались , это значит что:
; 1. внешнее прерывание INT1 разрешено
; 2. на выходе TSOP оказался низкий уровень сигнала

set flag "TSOP_IS_ACTIV" ; устанавливаем флаг "TSOP_IS_ACTIV"
; и выходим из прерывания
RETI

.

после написания кода. компилируем. и контролируем в симуляторе период прерывания.
(или период вспышек светодиода в пачках)
если надо - корректируем число 145 в ту или другую сторону.

SNEGOK23 пишет:
таймер доходит до 145 и кидает флаг прерывания?

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

(Отредактировано автором: 18 Октября, 2009 - 22:48:29)

 
 Top
VCOM Супермодератор Post Id



Супермодератор


Сообщений всего: 659
Дата рег-ции: Март 2007  



Между ногой C0 и базой BCR108 надо резистор Ом питсот... Ж))
 
 Top
nest Администратор Post Id



Администратор


Сообщений всего: 4866
Дата рег-ции: Сент. 2009  



VCOM, ой ли ?

BCR108: NPN Silicon Digital Transistor
Built in bias resistor (R1=2.2 kΩ, R2=47 kΩ)
За что мы их и любим.
 
 Top
VCOM Супермодератор Post Id



Супермодератор


Сообщений всего: 659
Дата рег-ции: Март 2007  



Вай! А как он его паять то будет Ж)))) Этож марока еще та такие транзюки на макетки паять Ж))))
 
 Top
Страниц (6): [1] 2 3 4 5 6 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru