Страница 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
В_и_к_т_о_р
Код простейший...

так есть формула расчета задержек или нет?