реклама на сайте
подробности

 
 
> Порядок прерываний в AT90S2313
SAU
сообщение Mar 15 2006, 20:21
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 12-03-06
Пользователь №: 15 158



Написал код для диммера на Bascom
$regfile = "2313DEF.dat"
$crystal = 4000000
Config Portb = Output

Config Portd.0 = Output ' Out for triac
Config Portd.1 = Output ' Out for triac

Config Portd.2 = Input ' Input INT0

Config Portd.6 = Input ' Input manage lamp
Config Portb.0 = Input ' Input manage lamp

Config Lcd = 16 * 2 'control LCD
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6


Config Int0 = Falling

Config Timer0 = Timer , Prescale = 256
On Timer0 Timer0_isr

On Int0 Ind
Enable Int0
Enable Timer0
Enable Interrupts


Dim Count As Byte
Dim P7 As Bit , P0 As Bit
Count = 75
Cls


Start Timer0
'
'
'156 - min , 2- max light

Do

Loop

Ind:

P7 = Pinb.0
P0 = Pind.6

If P7 = 0 And P0 = 0 Then
Count = 156
End If

If P7 = 0 And P0 = 1 Then ' reduction of brightness

If Count < 156 Then
Incr Count
End If

End If

If P7 = 1 And P0 = 0 Then 'increase to brightness
If Count > 2 Then
Decr Count
End If
End If

Cls
Lcd "In timer0" ; Count

Load Timer0,Count
Start Timer0

Return

Timer0_isr:
Stop Timer0

Set Portd.1
Set Portd.0
Waitms 20
Reset Portd.0
Reset Portd.1

Return

End

На общую шину и вывод пина 2 порта D через резистор заведены 6В.
При переходе через ноль срабатывает прерывание по спаду - это видно на индикаторе (прилепил для контроля на макетке)
Но не срабатывает таймер - на осциллографе не видны импульсы, хотя инкремент и декремент счетчика есть - это видно на том же индикаторе.
Если в обработчике прерывания таймера поставить
Load Timer0,Count
Start Timer0
а в прерывании INT0 убрать запуск таймера, то возникает такая ситуация:
Пока прерывание INT0 есть - нет прерывания по таймеру.Как только его убираешь - появляются импульсы, т.е начинает срабатывать прерывание по таймеру.Причем длительность импульсов пропорциональна Count. (Для справки Bascom инструкцией Load загружает требуемое значение в регистр таймера.Т.е. если написать Load Timer0,156 то в таймере окажется 100 (256-156) )

У меня вопрос.По таблице векторов INT0 имеет самый высокий приоритет.Означает ли это, что при входе в обработчик этого прерывания все остальные уже запрещаются?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DS
сообщение Mar 18 2006, 16:06
Сообщение #2


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Если Вы стаивте прерывание по уровню, то как только Вы выходите из обработчика, (а сигнал на входе еще не успел изменится - на входе у Вас 50 гц), прерывание срабатывает снова. Это вряд ли то, чего, Вы добиваетесь.

Для коррекции нелинейности сделайте табличку соотвествия яркости и вашего управляющего параметра и зашейте ее в МК. 100 точек,я думаю, более чем достаточно для управления лампчкой.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
SAU
сообщение Mar 18 2006, 19:13
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 12-03-06
Пользователь №: 15 158



Цитата(DS_ @ Mar 18 2006, 19:06) *
Если Вы стаивте прерывание по уровню, то как только Вы выходите из обработчика, (а сигнал на входе еще не успел изменится - на входе у Вас 50 гц), прерывание срабатывает снова. Это вряд ли то, чего, Вы добиваетесь.

Вообще-то я руководствовался апнотом Zero Cross Detector - там показано, как через резистор 1Мом на INT0 заведена фаза.Правда там была Мега.
А такой вариант подключения и обработка прерывания компаратора поможет?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 18 2006, 20:23
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SAU @ Mar 18 2006, 21:13) *
А такой вариант подключения и обработка прерывания компаратора поможет?

Imho такой вариант тоже имеет право на существование, но пример расписаный в appnote должен работь. Важно только правильно настроить условие возбуждения прерывания.
С аналоговым компаратором это биты регистра ACSR
Table 34. ACIS1/ACIS0 Settings
01 = Falling Edge
11 = Rising Edge

С Int0 это соответственно биты регистра MCUCR:
Table 24. Interrupt 0 Sense Control
ICS01/ICS00
10 The falling edge of INT0 generates an interrupt request.
11 The rising edge of INT0 generates an interrupt request.

И разрешить генерацию соответствующего прерывания. В случае с аналоговым компаратором - бит ACIE регистра ACSR, в случае с INT0 - бит INTF0 регистра GIMSK.

И обязательно уберите из обработчка таймера громадную задержку, строчка Waitms 20.
Для корректной работы:
1. настройте таймер на длительность отсчета (между запуском таймера и генерацией прерывания) 20ms.
2. по прерыванию от внешнего источника - устанавливайте бит порта, и запускайте таймер.
3. по прерыванию от таймера останавливайте таймер и очищайте содержимое счетчика таймера TCNT.

Сообщение отредактировал defunct - Mar 18 2006, 20:30
Go to the top of the page
 
+Quote Post
SAU
сообщение Mar 19 2006, 10:23
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 42
Регистрация: 12-03-06
Пользователь №: 15 158



Цитата(defunct @ Mar 18 2006, 23:23) *
10 The falling edge of INT0 generates an interrupt request.
11 The rising edge of INT0 generates an interrupt request.

Я пробовал генерировать по falling - лампа мерцает. Я так понимаю, что раз срабатывает по спаду - то обрабатывается только 1 полупериод

Цитата(defunct @ Mar 18 2006, 23:23) *
И обязательно уберите из обработчка таймера громадную задержку, строчка Waitms 20.
Для корректной работы:
1. настройте таймер на длительность отсчета (между запуском таймера и генерацией прерывания) 20ms.
2. по прерыванию от внешнего источника - устанавливайте бит порта, и запускайте таймер.
3. по прерыванию от таймера останавливайте таймер и очищайте содержимое счетчика таймера TCNT.

Я так теперь и делаю.Только импульс генерируется длительностью 20мкс. А время сработки таймера высчитываю как 256- счетчик, где счетчик - инкремент или декремент при нажатии кнопки "+" или "-"
Т.е.Число в диапазоне 2-156.


Цитата(defunct @ Mar 18 2006, 23:23) *
10 The falling edge of INT0 generates an interrupt request.
11 The rising edge of INT0 generates an interrupt request.

Я пробовал генерировать по falling - лампа мерцает. Я так понимаю, что раз срабатывает по спаду - то обрабатывается только 1 полупериод. А в AT90S2313 в INT0 отсутствует прерывание по изменению состояния, поэтому стал склоняться к мысли о компараторе.

Цитата(defunct @ Mar 18 2006, 23:23) *
И обязательно уберите из обработчка таймера громадную задержку, строчка Waitms 20.
Для корректной работы:
1. настройте таймер на длительность отсчета (между запуском таймера и генерацией прерывания) 20ms.
2. по прерыванию от внешнего источника - устанавливайте бит порта, и запускайте таймер.
3. по прерыванию от таймера останавливайте таймер и очищайте содержимое счетчика таймера TCNT.

Я так теперь и делаю.Только импульс генерируется длительностью 20мкс. А время сработки таймера высчитываю как 256- счетчик, где счетчик - инкремент или декремент при нажатии кнопки "+" или "-"
Т.е.Число в диапазоне 2-156.
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 19 2006, 13:13
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SAU @ Mar 19 2006, 12:23) *
Я пробовал генерировать по falling - лампа мерцает. Я так понимаю, что раз срабатывает по спаду - то обрабатывается только 1 полупериод. А в AT90S2313 в INT0 отсутствует прерывание по изменению состояния, поэтому стал склоняться к мысли о компараторе.

Ну а разве этого недостаточно? Захватывается не полупериод, а начало периода, просто учитывайте это при задании задержки в таймере!
Если уж не судьба работать с периодом и сильно нужно ловить каждый полупериод то поставте 2 диода анодами к сети 220, катодами через резистор 10 Мом к входу int0. И желательно резистор ~220k между Int0 и землей. Диодный мостик-то знаете как работает?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SAU   Порядок прерываний в AT90S2313   Mar 15 2006, 20:21
- - vet   Прерывания в AVR запрещаются при входе в обработчи...   Mar 15 2006, 20:24
- - impuls-v   В микроконтроллерах AVR отсутствуют вложенные прер...   Mar 15 2006, 22:19
- - Laksus   ЦитатаConfig Int0 = Falling ... Пока прерывание IN...   Mar 15 2006, 23:21
- - SAU   С прерываниями разобрался - поставил 20 мкс вместо...   Mar 18 2006, 15:20
- - DS_   Да он поточнее, конечно будет. Но проблема то не в...   Mar 18 2006, 20:06
- - Laksus   ЦитатаНо яркость регулируется как-то криво.... ___...   Mar 19 2006, 05:45
- - DS_   А Вы в обработчике прерываний переставляйте каждый...   Mar 19 2006, 13:14
- - defunct   Phase Correct PWM можно применить.. (с захватом то...   Mar 19 2006, 13:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01433 секунд с 7
ELECTRONIX ©2004-2016