Страница 3 из 8
Добавлено: Вт ноя 24, 2009 12:48:55
GP1
вот накидал кода, старался коментировать по максимуму.
переключение по флагу Т
обработка в Т1_OVF
жду реакции

Добавлено: Вт ноя 24, 2009 14:00:45
GP1
забыл исправить константу ms10
должно быть так:
Добавлено: Ср ноя 25, 2009 02:04:13
aleks_bmw528
GP1 !!!!
Прошу еще разок обьснить твои методы расчета таймеров по подробней, ни как неврублюсь !!! Зарание спасибо
режим 1:1 Normal
мощность 99% = 0.1мс // 65535-0.1мс/0.00025мс=65135 (0хFE70)
1% = 9,9мс // 65535-9,9мс/0.00025мс=25935 (0х654F)
и что значит ???
для случаев 100% и 0% мощности - особый случай, не трубующий работы Т1
вопрос по коду ???
Код: Выделить всё
; cli ; обязательно иначе получиш в TCNT1 хз-что
; и запись нового значения в power
; сбросить флаг Т чтобы чтобы цикл начался правильно
; сбросит флаг TOV1 он мог установиться за время вычисления
; а начинать надо точно с началом положительной полуволны!
1. почему ;cli запрет прерываний не использовал
2. сбросить флаг Т чтобы чтобы цикл начался
3. сбросить флаг TOV1 он мог установиться за время вычисления
а начинать надо точно с началом положительной полуволны!
2. T же уже сбросили во втором проходе T1!!!
чуть доработал таймер
Код: Выделить всё
T1_OVF:
;вкл упр. импульс задержка > 2мкс (2.25мкс)
sbi OutPort, (1<<OutPin)
ldi tmp, 9
delay:
dec tmp
brne del
cbi OutPort,(1<<OutPin)
; проверка флага Т и ветвление
brts t1_001 ;если второй цикл переход
; грузим 10мс
ldi tmp,low(ms10)
ldi tmp1,high(ms10)
out TCNT1H,tmp1
out TCNT1L,tmp
; и меняем флаг Т на 1, для второго прохода
set
rjmp t1_exit
t1_001:
; отключаем T1
ldi tmp,T1_off
out TCCR1B,tmp
; записываем в счетчик Т1 текушего значения power
ldi tmp,low(power0)
ldi tmp1,high(power0)
out TCNT1H,tmp1
out TCNT1L,tmp
; таймер стоит, ничего не считает, в TCNT1 значение power!
; и меняем флаг Т на 0, для нового цикла
clt
; Т1 готов к новому циклу
t1_exit:
reti
Добавлено: Ср ноя 25, 2009 09:31:40
GP1
Сначало о грустном.
вчера вечером гонял в симуляторе всплыл косяк:
я из обработчика убрал сохранение sreg, но потом пришел к выводу что оно надо.
по коду можно и так, главное чтобы отклонения от заданных интервалов не выходили за рамки "приличия"
Код: Выделить всё
T1_OVF:
in tmp,sreg
push tmp
;вкл упр. импульс задержка > 2мкс (2.25мкс)
sbi OutPort, (1<<OutPin)
ldi tmp, 9
delay:
dec tmp
brne del
cbi OutPort,(1<<OutPin)
; проверка флага Т и ветвление
brts t1_001 ;если второй цикл переход
; грузим 10мс
ldi tmp,low(ms10)
ldi tmp1,high(ms10)
out TCNT1H,tmp1
out TCNT1L,tmp
; и меняем флаг Т на 1, для второго прохода
pop tmp
out sreg,tmp
set
rjmp t1_exit
t1_001:
; отключаем T1
ldi tmp,T1_off
out TCCR1B,tmp
; записываем в счетчик Т1 текушего значения power
ldi tmp,low(power0)
ldi tmp1,high(power0)
out TCNT1H,tmp1
out TCNT1L,tmp
; таймер стоит, ничего не считает, в TCNT1 значение power!
; и меняем флаг Т на 0, для нового цикла
pop tmp
out sreg,tmp
clt
; Т1 готов к новому циклу
t1_exit:
reti
это код с дополнением сохранения sreg
теперь по порядку:
1. семистор включается в определенный момент от точки отсчета (ТО) (перехода сетевого напряжения из - в +) чем ДАЛЬШЕ импульс включения от ТО тем менше мощности выделится на нагрузке.
полупериод волны 50Гц длится 10мс
Отсюда вывод:
чтобы получить 50% мощности нужно задержать вкл управляющего импулса на 5мс (10мс - 100%, 50% - х простая пропорция) от ТО, для 99% - задержка должна составлять 0.1мс, для 1% - 9.9мс
в свободном счете Т1 переполняется за 16384мкс, поэтому небходимо счет начинать не 0 а с некоторого числа N чтобы до переполнения таймер насчитал нужное количество тиков, при Fo=4МГц 1 тик=0.25мкс. Считаем сколько тиков пройдет за, скажем 10мс, 10мс/0.00025мс получается 40000 тиков - это и есть то число тиков, на которое надо отодвинуть начальную установку таймера от момента переполнения, т.е. 65535-40000=25535 значение которое надо записать в TCNT1. (а я ведь предлагал режим CTC)
Во завернул!
Особые случаи 100% и 0% - тут вообще все просто.
при 100% МОС постоянно включен
при 0% МОС постоянно выключен
1. почему ;cli запрет прерываний не использовал
2. сбросить флаг Т чтобы чтобы цикл начался
3. сбросить флаг TOV1 он мог установиться за время вычисления
а начинать надо точно с началом положительной полуволны!
1. если обратил внимание в теле основного цикла всего пара NOP и переход на начало, попробуй в симуляторе отловить момент между sei и cli

поэтому и закоментировал. В боевом софте они необходимы!!!
2. время выполнения осного цикла никаким боком не синхронизировано с сетевым напряжением и невозможно определить во время какой полуволны происходит обновление значения power, а как я писал работа с новыми значениями power должна начинаться с первой положительной полуволны.
3. см.п.2
Ну вроде бы все

Добавлено: Ср ноя 25, 2009 10:37:06
aleks_bmw528
Добрый день GP1 Огромное спасибо что ответил на мои вопросы
Теперь вроде бы все ясно !!!
прости за тупой вопрос??? как симулировать в avrstudio на INT0 сигнал никак не могу посмотреть как работают прерывания
сейчас откомпилирую код и попробую!!!
Добавлено: Ср ноя 25, 2009 10:37:11
pyzhman
Хочу обратить внимание aleks. Прерывание по INT0 произойдет не именно в момент перехода сетевого напряжения через 0, т.к. вход МК имеет некоторый порог. Поэтому в реале надо будет несколько подогнать начальную задержку на включение симистора.
Добавлено: Ср ноя 25, 2009 10:41:58
aleks_bmw528
pyzh_man
подогнать начальную задержку на включение симистора
обьясни более подробно пожалуйста

Добавлено: Ср ноя 25, 2009 10:45:28
GP1
Добавлено: Ср ноя 25, 2009 11:11:56
GP1
тАбе пакет!
INT0 - сработает когда напряжение на входе превысит порог срабатывания, где-то около 3В, но до этого момента пройдет какое-то время от момента пересечения >0<
Добавлено: Ср ноя 25, 2009 11:31:35
aleks_bmw528
GP1/b] Караул только что прошил попробывал не работает
думал сначала что то напортачил с BT136 и MOC3023 !!!!
быстро написал в основном цикле
next:
nop
nop
sbi OutPort,(1<<OutPin)
; где-то здесь будеш вычислять новое значени power
; собственно вычисление power
; cli ; обязательно иначе получиш в TCNT1 хз-что
; и запись нового значения в power
; сбросить флаг Т чтобы чтобы цикл начался правильно
; сбросит флаг TOV1 он мог установиться за время вычисления
; а начинать надо точно с началом положительной полуволны!
; sei ; не забываем разрешить работу
rjmp next
попробывал лампа горит, значит там все OK !!!
Думаю в чем дело ????
220 через 1Мом 6 вывод вроде все верно
Добавлено: Ср ноя 25, 2009 11:41:45
aleks_bmw528
Попробую в INT0
Код: Выделить всё
int_0:
in tmp,sreg
push tmp
; запускаем Т1
sbi OutPort,(1<<OutPin)
; ldi tmp,T1_on
; out TCCR1B,tmp
pop tmp
out sreg,tmp
reti
тем самым проверю срабатывает оно или нет ????
Добавлено: Ср ноя 25, 2009 11:44:39
GP1
ошибка в коде - это раз.
Код: Выделить всё
[color=red]delay: [/color]
dec tmp
brne [color=red]del[/color]
2. попробуй увеличить длительность упр.импульса, вероятно с лампой не хватает тока для удержания в открытом состоянии при малых напряжениях, мощность лампы должна быть рпвна мощности вентилятора.
Добавлено: Ср ноя 25, 2009 11:48:56
aleks_bmw528
ZERRO не срабатывает , смотрю почему

Добавлено: Ср ноя 25, 2009 11:50:40
aleks_bmw528
я использовал код power3 там же без delay
Добавлено: Ср ноя 25, 2009 11:51:57
GP1
смотрю, жди!
Добавлено: Ср ноя 25, 2009 11:57:50
GP1
есть косяк!
Код: Выделить всё
ldi tmp,(1<<ISC01)+(1<<ISC00) ; это так для порядка - сначала ст.бит, затем мл.бит
out MCUCR,tmp ;INT0
а надо писать в PCMSK
ЗЫ: а я не обещал, что я истина в последней инстанции

Добавлено: Ср ноя 25, 2009 11:59:42
aleks_bmw528
что то не понял разрешение же указывается MCUCR
Добавлено: Ср ноя 25, 2009 12:02:40
GP1
для tn2313 разрешения в GIMSK, а логику сработки в PCMSK
СТОП!
что-то я сам запутался, тайм-аут!
Все разобрался, пишем MCUСR
Добавлено: Ср ноя 25, 2009 12:13:46
GP1
тогда попробуй отключи сеть от мк и через резюк 1..10к подай +5В на вход INT0, для проверки.
чет я сегодня туплю, проверь установки портов.
Добавлено: Ср ноя 25, 2009 12:29:30
aleks_bmw528
попробывал опять ZERRO сам не пойму в чем дело установки тоже смотрел все четко , не срабатывает и все тут ,буду еще смотреть