Моя широтно импульсная модуляция

Все прочитали, вроде даже поняли, взяли паяльник - а нифига не получается? Скорее сюда! Поможем. Чем можем...
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб окт 16, 2010 19:52:32
Откуда: Сургут

Сообщение ZERO.. »

Моя широтно импульсная модуляция встала... на таймерах мк "ATmega8515"
Вот моё начало реализации:

Код: Выделить всё

TIM1_COMPA: 		;прерывание случилось
ldi Temp,0            			;обнуление таймера
out TCNT1H,Temp			;обнуление таймера
out TCNT1L,Temp			;обнуление таймера
inc Flag
cpi Flag,0b01011010                          ;это число 90 (по 50микросекунд), для задержки на 4,5милисекунды
breq  Output_vikl
rjmp Output_vkl

Output_vikl:
ldi Flag,0
cbr Temp1,1
out PortB,Temp1			;вывод в порт
reti   

Output_vkl:[/color]
[color=#FF4040]sbr Temp1,1
out PortB,Temp1			;вывод в порт
reti
Работает это так 89 тактов "прыжок" на вкл, потом "прыжок" на выкл всего-лишь один такт и ВСЁ СНАЧАЛА!!!
С литературой пробовал, но там только одинаковые периоды включения и выключения...
А мне бы сильно хотелось разные... КАК???
P.S. Вопрос более глубокий, но я пока тока до сюдого дошёл... :oops:
[color=#FF4000]Ищу где? и как? надо пользоваться личкой[/color]
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб окт 16, 2010 19:52:32
Откуда: Сургут

Сообщение ZERO.. »

Пока состовлял вопрос по полочкам сама идея родилась и реализовалась!!!
СПАСИБО ВСЕМ!!!
TIM1_COMPA: ;прерывание случилось

ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp ;обнуление таймера
out TCNT1L,Temp ;обнуление таймера

inc Flag
cpi Flag,0b00000100 ;здеся время во включенном состоянии
breq Output_vikl
rjmp Output_vkl

Output_vikl:
ldi Flag,0b00000011 ;здеся на 1 меньше от времени включеного состояния
inc Flag1
cpi Flag1,0b00001000 ;здеся время в выключенном состоянии
brne Shift
ldi Flag,0
Shift:
ldi Temp1,0b00000000
out PortB,Temp1 ;вывод в порт
reti
Output_vkl:

ldi Flag1,0
ldi Temp1,0b00000001
out PortB,Temp1 ;вывод в порт
reti
[color=#FF4000]Ищу где? и как? надо пользоваться личкой[/color]
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб окт 16, 2010 19:52:32
Откуда: Сургут

Сообщение ZERO.. »

И вот ещё помучился, и вопрос другой замучил... :kill:
Я вот хотел что-бы это самое прерывание по таймеру, инициализировалось (выполнялось) по кнопке, только никак не пойму: причем как этот момент записать что, при прерывании от INT, что просто по нажатию любой другой клавиши.
HELP :shock: :shock: :shock:
При чем пробовал командой сравнения sbis PIND,PD3:
Получалось примерно так:
; ОСНОВНОЙ ЦИКЛ
Inf: rjmp Inf ;бесконечный цикл
;****************************************************
TIM1_COMPA: ;прерывание случилось

init:
sbis PIND,PD3 ;Пропуск следующей команды, если на PD3 +
rcall init

ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp ;обнуление таймера
out TCNT1L,Temp ;обнуление таймера

inc Flag
cpi Flag,0b11111100 ;здеся время во включенном состоянии
breq Output_vikl
rjmp Output_vkl

Output_vikl:
ldi Flag,0b11111011 ;здеся на 1 меньше от времени включеного состояния
inc Flag1
cpi Flag1,0b11111100 ;здеся время в выключенном состоянии
brne Shift
ldi Flag,0
Shift:
ldi Temp1,0b10000000
out PortB,Temp1 ;вывод в порт
reti

Output_vkl:
ldi Flag1,0
ldi Temp1,0b00000001
out PortB,Temp1 ;вывод в порт

reti

Но вот незадача, запускается мой сигнал, при + на порту PD3, нажал клавишу он пропал и всё, обратно востонавливаться не хочет...
Я пробовал эти три строчки
init:
sbis PIND,PD3 ;Пропуск следующей команды, если на PD3 +
rcall init

вставлять в прерывания RESET: но там так-же, срабатывание клавиши на один раз при чем только на отключение
пробовал их поставить после обнуления таймера в прерывании от TIM1_COMPA:, картина та-же...
Как быть??? :dont_know: :dont_know: :dont_know: :dont_know:
[color=#FF4000]Ищу где? и как? надо пользоваться личкой[/color]
Ответить

Вернуться в «Практика»