Прошивка 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 КБ) 205 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Аватара пользователя
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 КБ) 239 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
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 КБ) 479 скачиваний
2.jpg
(33.44 КБ) 461 скачивание
3.jpg
(96.69 КБ) 622 скачивания
triac.png
(3.81 КБ) 443 скачивания
Аватара пользователя
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 »

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

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