Страница 1 из 1
Как получить инверсный сигнал?
Добавлено: Сб апр 17, 2010 21:39:21
В_и_к_т_о_р
Здравствуйте всем! Помогите пожалуйста с кодом (ATmega8)
F1:
rcall Delay1
ldi Temp1,$00 ; Заносим значение в регистр OCR1A
out OCR1AH,Temp1
ldi Temp1,$64 ;
out OCR1AL,Temp1
ldi Temp1,$40 ; инициализация таймер/счетчика Т1
out TCCR1A,Temp1 ;Режим СТС "совпадение", Вывод ОС1 подключен
ldi Temp1,$09
out TCCR1B,Temp1
in Temp,PinD ; если нажата кнопка 1 то возврат на F1
sbrs Temp,0 ;
rjmp F1 ;
ldi Temp, 0b00000001 ;выход ОС1 отключен
out TCCR1A, Temp
rcall Delay1
ret
при нажатии на кнопку на выходе ОС1 появляется сигнал. Как получить на другом выходе такой же только инверсный?
Спасибо!
Re: Как получить инверсный сигнал?
Добавлено: Сб апр 17, 2010 21:46:42
GP1
а ДШ почитать?
проблемы с аглицким? тогда Евстифеев вам в помощь

Re: Как получить инверсный сигнал?
Добавлено: Вс апр 18, 2010 12:38:02
В_и_к_т_о_р
Снова всем ЗДРАСТЕ! Я только начинаю изучать контроллеры и никак не могу найти в книжках и на форумах как сделать чтобы на выходе OC1B был сигнал строго инвертированный по отношению к OC1A. При обычной установке регистров в режим СТС при включении питания эти сигналы получаются то инвертированные, то нет, когда как включится. Помогите кто нибудь чайнику...ПОЖАЛУЙСТА... очень надо...
Спасибо.
Re: Как получить инверсный сигнал?
Добавлено: Вс апр 18, 2010 12:51:32
demson
если переменная типа байт
инверсное = 255 - текущее
Re: Как получить инверсный сигнал?
Добавлено: Вс апр 18, 2010 13:22:01
В_и_к_т_о_р
Ничего не понял... ну чайник я еще...конечно я свою задачу могу решить самым простым способом - поставить обычный инвертор на логике и все, но имея столько свободных ног на контроллере, не хочется этого делать. Я получил на выходе ОС1 - меандр, а как сделать, чтобы на любом другом выходе был точно такой же но инвертированный???
Re: Как получить инверсный сигнал?
Добавлено: Вс апр 18, 2010 13:42:27
demson
ну это и есть логика
например вывод 1 бит
если на выводе 1 на другой надо поставить 0 то есть (максимальное значение ) - (текущее значение) 1-1 =0
если 8 бит то 2 ^8
255 - 255=0 инвертируем 255
255 - 0 = 255 инвертируем 0
Re: Как получить инверсный сигнал?
Добавлено: Вс апр 18, 2010 14:10:32
В_и_к_т_о_р
А как это можно реализовать в моем коде? Пока не "въезжаю".
Re: Как получить инверсный сигнал?
Добавлено: Пн апр 19, 2010 13:07:26
lix
может быть проще установить соответствующим образом биты COM1A1,СOM1A0,COM1B1 и COM1B0?
Re: Как получить инверсный сигнал?
Добавлено: Пн апр 19, 2010 14:15:24
lix
В_и_к_т_о_р, попробуй такой код
Код: Выделить всё
ldi Temp1, 1<<WGM12
out TCCR1B, Temp1 ;установить WGM12 для CTC
ldi Temp1, 1<<COM1A1 | 1<<COM1B1 | 1<<COM1B0 | 1<<FOC1A | 1<<FOC1B;
out TCCR1A, Temp1 ;принудительно сбросили OC1A и установили OC1B
ldi Temp1, 1<<COM1A0 | 1<<COM1B0
out TCCR1A, Temp1 ;менять значение на противоположное при совпадении
его нужно поместить до метки F1. если не заработает попробовать:
Код: Выделить всё
ldi Temp1, 1<<WGM12
out TCCR1B, Temp1
ldi Temp1, 1<<COM1A1 | 1<<COM1B1 | 1<<COM1B0
out TCCR1A, Temp1
ldi Temp1, 1<<FOC1A | 1<<FOC1B;
out TCCR1A, Temp1
ldi Temp1, 1<<COM1A0 | 1<<COM1B0
out TCCR1A, Temp1
сам не пробовал и не уверен что правильно

поэтому 2 варианта.
PS совсем забыл. в ОСR1A и OCR1B надо записывать одинаковые значения.
Re: Как получить инверсный сигнал?
Добавлено: Пн апр 19, 2010 18:52:41
В_и_к_т_о_р
Ничего с таймерами у меня не получается... все вроде работает , сигналы асинхронные, а потом в некоторые моменты происходит сдвиг одного относительно другого, а меня это не устраивает... так что я на это дело пока "плюнул" и "тупо" сделал все на задержках и принудительных записях в порты...
Кстати еще есть один вопросик... Есть ли какая нибудь формула для расчета задержек, а то с калькулятором долго получается...
Re: Как получить инверсный сигнал?
Добавлено: Пн апр 19, 2010 18:58:00
lix
В_и_к_т_о_р, покажи код
Re: Как получить инверсный сигнал?
Добавлено: Пн апр 19, 2010 20:06:42
В_и_к_т_о_р
Код простейший...
так есть формула расчета задержек или нет?