Прошивка attiny2313 + тиристор bt136

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

пришла идея :idea:
в OCR1A - пишем мощность
в OCR1B - пишем задержку 10мс
в соотв. прерываниях переключаемся между разрешениями
(опять же режим СТС, на OVF не получится :wink: )

зы: семистор выключать не надо, его надо только включить, по ДШ Тимп.вкл=>2 мкс, а выключится он при подходе к 0, когда ток нагрузки упадет ниже тока удержания
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

воплощение идеи.
правда я немного глюканул, начальное вкл. происходило при уровне мощности 80% (см. power0), и режим таймера пришлось поменять на NORMAL (лень было менять обработчики прерываний)
в общем как-то так :beer:
Вложения
power2.rar
(1.77 КБ) 204 скачивания
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Добрый день GP1 распечатал код взял с сабой на работу буду изучать ,вечером отпишу, идея интересная !!! :?
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP1 Внимательно изучил исходник идея классная :)) ,сегодня к вечеру хочу допаять вых. каскад MOC3021 BT136 , и попробывать весь день искал в инете схему подключения у кого как ,кто на прямую подключает ,кто через сопротивление не нашел rc цепь в нагрузке , так что буду думать завтра к обеду доделаю и прошью потом отпишусь!!!

а как тебе моя старая идея , все думаю как сделать через одно прерывание таймера :idea: ???


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

int_0: 
   in   tmp,sreg
   push   tmp
   blt   period, 0        ; пред установка для второго прохода
 ; запускаем Т1                   
   ldi   tmp,0xff
   ldi   tmp1,power       ; загрузка разных значения мощности
   out   TCNT1H,tmp
   out   TCNT1L,tmp1
   ldi   tmp,0x82         ; разрешение прерывания по переп.
   out   TIMSK,   
   pop   tmp
   out   sreg,tmp
   reti



так как для включения симистора надо 2мкс , для выключения ты использовал такую конструкцию из 8 nop это 2,5 мкс
nop
nop
nop
nop
nop
nop
nop
nop
cbi OutPort,(1<<OutPin)


думаю что будет ???? если его выключить после задержки 10мс
и через маленькую задержку опять включить


таймер Т1

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

   in   tmp,sreg
   push   tmp
   cbi   OutPort,(1<<OutPin)   
   ; здесь я думаю надо сделать небольшую задержку!!!!
   sbi   OutPort,(1<<OutPin)
   ldi r16,0xFF
   out TCNT1H, r16
   ldi r16,0x64
   out TCNT1L, r16
   SBRS   volna, 0
   RJMP    ext
   ldi tmp,0x02       ; запрет прерывания по совпадению
   out   TIMSK,tmp   
ext:
   blt     volna, 1               ; второй проход
   pop tmp
   out sreg,tmp
   reti

Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

так как для включения симистора надо 2мкс , для выключения ты использовал такую конструкцию из 8 nop это 2,5 мкс

может я что-то не так объясняю? :oops:
семистор включается коротким импульсом, а выключается при уменьшении напряжения и соответственно тока через назрузку ниже ТОКА УДЕРЖАНИЯ.
и конструкция из NOPов нужна только для обеспечения tимп.откр.>2мкс (посчтитай по тактам мк при 4МГц)

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

int_0: 
   in   tmp,sreg
   push   tmp
   blt   period, 0        ; пред установка для второго прохода
 ; запускаем Т1                   
   ldi   tmp,0xff
   ldi   tmp1,power       ; загрузка разных значения мощности
   out   TCNT1H,tmp
   out   TCNT1L,tmp1
   ldi   tmp,0x82         ; разрешение прерывания по переп.
   out   TIMSK,   
   pop   tmp
   out   sreg,tmp
   reti

в твоем коде меня озадачивают некоторые моменты
1. где загрузка значения для 10 мс
2. переключать с значения power на 10мс необходимо в теле прерывания, да и значение для power надо загружать в Т1 до наступления прерывания.
3. при таком способе задания прерывания

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

   ldi   tmp,0x82         ; разрешение прерывания по переп. 
   out   TIMSK,   
 
ты изменяеш сразу два разрешения, причем второе к данной процедуре не имеет никакого отношения, ты просто потом запутаешся и будеш долго выяснять почему не работае другой процесс.
4. зачем здесь

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

  blt   period, 0        ; пред установка для второго прохода 


зы: можно и через одно прерывание T1OVF но по-другому.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP1 не ругайся , я же тебе писал я давно не писал мне и так пришлось привести с дачи все книги по atmel , восстанавливаю потихоньку знания!!!

в INT0 загружаем изначальную мощность power что дает нам в процессе менять ее

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

int_0: 
   in   tmp,sreg
   push   tmp
   blt   volna, 0        ; пред установка для второго прохода
 ; запускаем Т1                   
   ldi   tmp,0xff
   ldi   tmp1,power       ; загрузка разных значения мощности
   out   TCNT1H,tmp
   out   TCNT1L,tmp1
   ldi   tmp,0x82         ; разрешение прерывания по переп.
   out   TIMSK, tmp   
   pop   tmp
   out   sreg,tmp
   reti



сработало INT0 запустили T1 , volna это для второго прохода таймера
T1, значит записали volna 0 , загрузили нужное нам значение мощности,разрешили (запустили таймер ) прерывание,
сработал T1 первый раз
выключили симистор
cbi OutPort,(1<<OutPin)
далее неб. задержку перед включением ,включаем
sbi OutPort,(1<<OutPin)

дальше переписываем значения для таймера TCNT1H, TCNT1L под 10 мс , проверяем если первый раз volna 0 , то записываем volna 1,
ждем очередного срабатывания таймера все тоже самое проверяем
если volna 1 то запрещаем прерывание T1 , далее все с начала INT0,

я вот только не знаю можно ли менять значения TCNT1H, TCNT1L прямо в прерывании но я раза два встречал ?????

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

  in   tmp,sreg 
   push   tmp
   cbi   OutPort,(1<<OutPin)   
   ; здесь я думаю надо сделать небольшую задержку!!!!
   sbi   OutPort,(1<<OutPin)
   ldi r16,0xFF
   out TCNT1H, r16
   ldi r16,0x64
   out TCNT1L, r16
   SBRS   volna, 0
   RJMP    ext
   ldi tmp,0x02       ; запрет прерывания по совпадению
   out   TIMSK,tmp   
ext:
   blt     volna, 1               ; второй проход
   pop tmp
   out sreg,tmp
   reti



blt volna, 1 //запись значения equ volna = 1 могу ошибится с оператором
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

blt volna, 1 - это из другого мк у авров нет такой команды.
и опять у тебя
выключили симистор

ну не возможно выклюить таким способом симистор!

менять значения TCNT в прерывании можно.

если так уж хочеш сделать все в одном прерывании, то надо делать 2 ветви в обработчике
1-загрузка значения 10мс, изменение volna=1, выход
2-загрузка power, выкл. таймера, обнулить таймер, volna=0, выход.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

попутал bst а не blt

не совсем понял твой алгоритм
1-загрузка значения 10мс, изменение volna=1, выход
2-загрузка power, выкл. таймера, обнулить таймер, volna=0, выход.



а что делать в INT0 ???

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

T1: 
        cpi     volna , 0
        brne    vol1 
        ldi   tmp,low(10мс)           ;
        ldi   tmp1,high(10мс)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        bst     volna, 1               ; второй проход
        rjmp    ext

vol1:
        ldi   tmp,low(power)           ;
        ldi   tmp1,high(power)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        ldi   tmp, 0x02         ; запрет прерывания
        out   TIMSK,tmp   
        clr   tmp
        out   TCNT1H,tmp
        out   TCNT1L,tmp
        bst     volna, 0               ; первый проход

ext:
 



reti 
Последний раз редактировалось aleks_bmw528 Вс ноя 22, 2009 00:10:17, всего редактировалось 2 раза.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

в понед. нарисую, отсканирую, пришлю. :beer:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

просю пардону, малость накосячил
2-загрузка power, выкл. таймера, обнулить таймер, volna=0, выход.

в общем нарисовл как смог :)
Вложения
sh1.rar
(229.69 КБ) 236 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

алгоритм то я понял !!!
BT136 после подачи импульса 2мс выключается сам ,а до его выключения надо обязательно снять импульс с PORTB я правильно
понял ???

я так и не допаял вых каскад не нашел грамтной схемы включения
MOC3023 + BT136 , к PORTB ясно как ,надо через R,но многие подключают напрямую
ток 5ма прямое напр 1.5в
сопротивление значит (5в-1.5в ) / 5ма или (5в-1.5в ) / 5ма * 0.75

R= либо 820 или 1к ,а как подключить BT136 мне несовсем ясно в
Datasheet непонятная схема в инете посмотрел кучу схем ,как только
не включают в основном напрямую считаю это не правильно может есть какие нибуть мысли по подключке !!!!! :idea:

выложу несколько схем :shock:


по поводу алгоритма несколько вопросов ????
1. сработало INT0, загружаем в TCNT power ,затем запускаем таймер ,volna = 0

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

int_0:
   in   tmp,sreg
   push   tmp
; загрузка стартовой  мощности   
   ldi   tmp,     low(power) 
   ldi   tmp1,high(power)
   out   TCNT1H,tmp1         
   out   TCNT1L, tmp
; запускаем Т1
   in         tmp,TCCR1B
   ori   tmp,T1_on
   out   TCCR1B,tmp
   bst       volna ,0
   pop   tmp
   out   sreg,tmp
   reti



2. не пойму зачем грузить power непосредственно в таймер ,если его можно загрузить в INT0 ????

3. в каком моменте снять бит с PORTB до выключения BT136 ???? :?

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

T1: 
        cpi     volna , 0
        brne    vol1 
        ldi   tmp,low(10мс)           ;
        ldi   tmp1,high(10мс)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        bst     volna, 1               ; второй проход
        rjmp    ext

vol1:
        ldi   tmp,low(power)           ;
        ldi   tmp1,high(power)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        ldi   tmp, 0x02         ; запрет прерывания
        out   TIMSK,tmp   
        clr   tmp
        out   TCNT1H,tmp
        out   TCNT1L,tmp
        bst     volna, 0               ; первый проход

ext:


Вложения
1.jpg
(75.51 КБ) 478 скачиваний
2.jpg
(33.44 КБ) 460 скачиваний
3.jpg
(96.69 КБ) 621 скачивание
triac.png
(3.81 КБ) 441 скачивание
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

1. по схеме подключения - наиболее правильная - 3.jpg, обрати внимание на R13C7, это и есть демпферная RC-цепочка.
2. снимать сигнал с МОС надо до момента переход сетового напряжения через 0.
3. грузить TCNT лучше все-таки в прерывании T1OVF, но это ИМХО
4. по коду:

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

T1: 
        cpi     volna , 0
        brne    vol1 
        ldi   tmp,low(10мс)           ;
        ldi   tmp1,high(10мс)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        bst     volna, 1               ; второй проход
        rjmp    ext

vol1:
        ldi   tmp,low(power)           ;
        ldi   tmp1,high(power)
        out   TCNT1H,tmp
        out   TCNT1L,tmp1
        ldi   tmp, 0x02         ; запрет прерывания
        out   TIMSK,tmp   
        clr   tmp
        out   TCNT1H,tmp
        out   TCNT1L,tmp
        bst     volna, 0               ; первый проход

ext:

запись

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

bst  volna,1

означает копирование 1 бита из регистра volna во флаг Т
соответственно

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

        bst     volna, 0               ; первый проход 
бит 0 регистра volna -> T
т.е. ты делаещ совсем не то что требуется.
если хочеш использовать бит Т, тогда нужно воспользоваться командами clt и set, а ветвление организовать с помощью команды brts или brtc

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

        ldi   tmp, 0x02         ; запрет прерывания 
        out   TIMSK,tmp   

здесь надо не запрещать прерывание, а останавливать таймер, и делать это до загрузки power.
и убири обнуление таймера, я же в пред.посте написал.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

а в ответ - тишина :shock:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Пытаюсь Переделать :roll:

прерывание INT0 , если грузить TCNT в T1_OVF, то получается что сработало INT0, я запустил таймер, TCNT - ? с нулевым значением что ли ??
вопрос??? если ни чего не писать в TCNT ни в reset ни в INT0

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

 
  ldi   tmp,(1<<OCIE1A)         
  out   TIMSK,tmp   
 


после этого T1 запустится сразу или нет ???

что то совсем запутался !!!! попрубую снова :cry:

сработало INT0

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

int_0:   
  in   tmp,sreg
  push   tmp
; предустановка на двойную обработку таймера 
  ldi   volna ,0
; загрузка стартовой  мощности   
  ldi   tmp,  low(power) 
  ldi   tmp1,high(power)
  out  TCNT1H,tmp1         
  out  TCNT1L, tmp
; запускаем Т1
  ldi   tmp,0b10000000  ; бит TOIE1         
  out   TIMSK,tmp   
  pop   tmp
  out   sreg,tmp
reti;                   

T1:
  in      tmp,sreg
  push  tmp
; формируем управляющий импульс 
  cbi     OutPort,(1<<OutPin)
; задержка
  ldi      tmp, 9
del: 
  dec    tmp
  brne  del
  sbi     OutPort,(1<<OutPin)
; загрузка 10мс   
  ldi   tmp,low(10мс)           ;
  ldi   tmp1,high(10мс)
  out  TCNT1H,tmp
  out  TCNT1L,tmp1
  cpi   volna , 0
  breq vol1 
  ldi    tmp,0b10000000  ; сброс  TOIE1         
  out   TIMSK,tmp   
vol1:         
  ldi    volna , 1
  pop   tmp
  out   sreg,tmp
reti


Посмотри код еще раз , так будет работать или нет , может чего надо потправить или дополнить ???
Устройство собрал очень хочется попробывать :))
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Сообщение pyzhman »

breq vol1
ldi tmp,0b10000000 ; сброс TOIE1
out TIMSK,tmp
vol1:
Здесь надо не устанавливать, а сбрасывать старший бит для запрета прерывний.
И пробуйте уже!!!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

aleks_bmw528
по-моему ты окончательно запутался :)

1. опять исчезло ветвление и обработчика T1OVF
2. разрешение прерывания по переполнению надо задавать до начала основного цикла
3. в INT0 - надо только включить Т1
4. посмортри внимательно рисунок - я же там нарисовал, при втором проходе загружается power, так что при наступлении INT0 в TCNT будет значение power.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

pyzh_man
ldi tmp,0b10000000 сброс TOIE1;


строчку скопировал сверху, забыл поменять 1 на 0 уже чан не варил!!!

Уважаемый GP1!!! ответь на несколько вопросов ???

1. Почему писать надо в начале цикла

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

 ldi   tmp,0b10000000  ; бит TOIE1          
 out   TIMSK,tmp   


2 разве нельзя использовать разрешение и запрет непосредственно в IN0 и T1 если нет то прошу обяснить дураку!!!

то есть
в INT0
надо писать

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

   ldi   tmp,0b00000100
   out   TCCR1B,tmp   ; CK 256


в T1
надо остановить

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

   ldi   tmp,0b00000000
   out   TCCR1B,tmp   ;


Обрашаюсь к тебе как к светиле!!! , если не трудно очень прошу нацарапать код по твоему алгоритму уже несколько дней не могу понять работу по твоему алгоритму ????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

По порядку.
1. зачем тебе здесь разрешение прерывания? разрешие его один раз при инициализации таймера и все. в программе надо вкл-выкл таймер а не прерывания, это если по алгоритму как на рисунке.

2.да можно все делать в прерывании.
только зачем тебе прадделитель на 256? Т1 при Fo=4МГц переполняется дольше чем за 16 мс, а тебе надо максимум 2 интервала по 10мс.

если начальство свалит, что-нибудь накрапаю. :tea: , а так токмо вечером.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Понял при инициализации таймера я разрешаю прерывание

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

ldi   tmp,0b10000000           
out   TIMSK,tmp   

а в INT0
и T1, грубо говоря запускю установкой TCCR1B 0b00000101 например , останавливаю TCCR1B в 0b00000000 так получается ???

:cry: надо ехать на работу вечером буду дальше разбираться :idea:
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

типа да :)
и умоляю, придерживайся правил "хорошего тона" не пиши абсолютные значения, это увеличивает время разбора полетов.
Чем дальше, тем больше становлюсь занудой...
Изображение
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»