а чем отличаются OCIE1A от OCIE1B? ( и почему их два?)
а чем отличаются OCIE1A от OCIE1B? ( и почему их два?)
читай даташит !uwrtey писал(а):
а чем отличаются OCIE1A от OCIE1B? ( и почему их два?)
извиняюсь что обрывочно отвечаю,спящий писал(а):Здравсвуйте,сделал программу RC5 приемник:Срабатывает по команде PCINTO ,пропускает первые 8 битов(они нах ненужны- хочу чтобы от любого пульта работал),остальные записывает и выводит в порт.
Код: Выделить всё
.org 0x000
rjmp init;
.org 0x0001
rjmp sydi;
ldi temp,255 ; !!!!!!!!!!!
out DDRB,temp;
ldi temp,0;
out DDRD,temp;
init:
ldi r16,high(RAMEND) ;
out SPH,r16 ;
ldi r16,low(RAMEND) ;
out SPL,r16 ;
ну раз так, то этого должно быть достаточноВитГо писал(а):и каждый может управлять своими ногами OC1A или OC1B
Код: Выделить всё
ldi Temp,(1<<OCIE1A) ;разрешить прерывание компаратора
out TIMSK,Temp
когда пин порта является входом то записью в PortB управляем внутренним резистором подтяжки..спящий писал(а):Нашел косяк:на выходе PortB 0 напряжение,вопрос,как его убрать ведь я его сделал как вход?
этого достаточно...uwrtey писал(а):ну раз так, то этого должно быть достаточноВитГо писал(а):и каждый может управлять своими ногами OC1A или OC1BКод: Выделить всё
ldi Temp,(1<<OCIE1A) ;разрешить прерывание компаратора out TIMSK,Temp
Код: Выделить всё
;******************************************************************************
;старт
;******************************************************************************
reset: ; включение микроконтроллера
Sli ; глобальный запрет на прерывания
ldi Temp,low(RamEnd) ; инициализации стека
out SPL,Temp ;
ldi Temp,0b00000100 ;
out DDRB,Temp ; настроили порт "В" (0-ввод, 1-вывод)
; 00000х00 - "вывод" на передатчик (PB3- 15 ножка)
; хххх0000 - "ввод" для чтения клавиатуры
ldi Temp,0b00001111 ;
out DDRD,Temp ; настраиваем порт "D" на вывод (0-ввод, 1-вывод)
; 0000хххх - на сканирование столбцов клавы
ldi Temp,(1<<OCIE1A) ; разрешить прерывание компаратора
out TIMSK,Temp
ldiTemp,(1<<COM1A0) ;переключать ножку "OC1A" по совпадению (PB3- 15 ножка)
out TCCR1A.Temp ;*1
ldiTemp,(1<<wgm12)|(1<<cs10) ;подключили режим "CTC" (вместе с *1) и установили тактовый сигнал = CK (1:1)
out TCCR1B.Temp
; инициализация компаратора
ldi Temp,0xC ; 3кГц, 1/3000=0,00033сек=330мкс, 330/2=165мкс длительность импульса или паузы(время-Т)
out OCR1AH,Temp ; 0,05мкс*65535=3276,75 3276,75>165 --- по этому не будем делить тактовую частоту (СК)
ldi Temp,0xE4 ; 165мкс/0,05мкс=3300 тиков таймера 3300=CE4(hex)
out OCR1AL,Temp ;
ldi Temp,0 ;обнуление таймера при включении
out TCNT1H,Temp
out TCNT1L,Temp
cei ;глобальное разрешение прерываний
;******************************************************************************Режим CTC (сброс при совпадении)
Шестнадцатиразрядные таймеры T1/T3 имеют возможность самостоятельно сбрасывать счётный регистр сразу после его совпадения с регистром сравнения, после чего счёт автоматически продолжается с нулевого значения. Такой режим называется режимом сброса при совпадении (CTC) и может быть использован в частности для генерации сигналов фиксированной частоты.
Изменение состояния вывода OCnA при совпадении с регистром сравнения
Во всех микроконтроллерах ATmega имеется вывод с альтернативной функцией OC1A или OC3A. Настроенный на выход, он может изменять своё состояние в момент совпадения значений счётного регистра и регистра сравнения. Характер этих изменений пределяется комбинацией битов COMnA0 и COMnA1 в регистре TCCRnA, например:
COMnA1=0, COMnA0=0 - таймер отключен от вывода OCnA;
COMnA1=0, COMnA0=1 - состояние вывода меняется на противоположное;
COMnA1=1, COMnA0=0 - OCnA сбрасывается в ноль;
COMnA1=1, COMnA0=1 - OCnA устанавливается в единицу.
Код: Выделить всё
;******************************************************************************
;старт
;******************************************************************************
reset: ; включение микроконтроллера
Sli ; глобальный запрет на прерывания
ldi Temp,low(RamEnd) ; инициализации стека
out SPL,Temp ;
ldi Temp,0b00000100 ;
out DDRB,Temp ; настроили порт "В" (0-ввод, 1-вывод)
; 00000х00 - "вывод" на передатчик (PB3- 15 ножка)
; хххх0000 - "ввод" для чтения клавиатуры
ldi Temp,0b00001111 ;
out DDRD,Temp ; настраиваем порт "D" на вывод (0-ввод, 1-вывод)
; 0000хххх - на сканирование столбцов клавы
ldiTemp,(1<<COM1A0) ;переключать ножку "OC1A" по совпадению (PB3- 15 ножка)
out TCCR1A.Temp ;*1
ldiTemp,(1<<wgm12)|(1<<cs10) ;подключили режим "CTC" (вместе с *1) и установили тактовый сигнал = CK (1:1)
out TCCR1B.Temp
; инициализация компаратора
ldi Temp,0xC ; 3кГц, 1/3000=0,00033сек=330мкс, 330/2=165мкс длительность импульса или паузы(время-Т)
out OCR1AH,Temp ; 0,05мкс*65535=3276,75 3276,75>165 --- по этому не будем делить тактовую частоту (СК)
ldi Temp,0xE4 ; 165мкс/0,05мкс=3300 тиков таймера 3300=CE4(hex)
out OCR1AL,Temp ;
ldi Temp,(1<<OCIE1A) ; разрешить прерывание компаратора
out TIMSK,Temp
ldi Temp,0 ;обнуление таймера при включении
out TCNT1H,Temp
out TCNT1L,Temp
cei ;глобальное разрешение прерываний
;******************************************************************************...дошлоуправление прерываниями это cli и sei