Gordon Shumway писал(а):Для чего введена переменная "Z_cross_f" ?
3. Для чего сконфигурирован timer0 ? Не нашел, где он используется...
Здесь очевидно прерывание занимается тем, чем и должно. В частности устанавливает флаг Z_cross_f (это же кусок из программы вероятно далее, где то используется)
Да, видимо так. И, похоже, с timer0 та же ситуация. Остается вопрос с частотой.
zero648 писал(а):Частота МК должна быть 8Мгц при таких параметрах таймера 1
Да, спасибо, так заработало.
Подскажите, плз, как правильно сделать защиту от дребезга кнопки ? Раньше вставлял waitms 250 - работало, но здесь почему-то при вставке waitms 250 лампа вообще перестает гореть. Вроде-ж waitms не отменяет работу прерываний ?
$regfile = "attiny2313.dat"
$crystal = 8000000
Config Portb.1 = Output
Config Pinb.0 = Input
Dim Level_dimmer As Byte
Dim Dimmer_on As Bit
Dim Dimmer_delay_w As Word
Dimmer_out Alias Portb.1 ' нога - выход, к оптосимистору на симистор
Key Alias Pinb.0
Config Int0 = Change ' Установка прерывания INT0 на изменение сигнала
On Int0 Z_cross_int
' Прерывание на вход датчика перехода синусоиды через ноль
Config Timer1 = Timer , Prescale = 8 ' конфигурируем таймер 1
On Ovf1 Ovf1_my Nosave : Enable Ovf1
Enable Interrupts
Enable Int0
Enable Timer1
Start Timer1
Do
While Key = 1
Wend
'WAITMS 250 <----тут пробовал
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
'---------------------------------------------------------------------------------------------
Dimmer_modul: ' -------------- УПРАВЛЕНИЕ ДИММЕРОМ --------------------------
If Level_dimmer = 0 Then
Dimmer_on = 0
Disable Ovf1
Else
Dimmer_on = 1
If Level_dimmer < 8 Then Enable Ovf1
End If
If Level_dimmer > 7 Then
' Dimmer_delay_w = &HFFFC ' Ярко горит - 230v
Disable Ovf1
Dimmer_out = 1
Level_dimmer = 8 ' <<<<<<<<<<<<<<<<<<<<<<<< ограничитель
End If
If Level_dimmer = 1 Then Dimmer_delay_w = 57900 ' Тускло горит - 25v
If Level_dimmer = 2 Then Dimmer_delay_w = 58300 ' 51v
If Level_dimmer = 3 Then Dimmer_delay_w = 58700 ' 78v
If Level_dimmer = 4 Then Dimmer_delay_w = 59000 ' 85v
If Level_dimmer = 5 Then Dimmer_delay_w = 59400 ' 149v
If Level_dimmer = 6 Then Dimmer_delay_w = 59900 ' 175v
If Level_dimmer = 7 Then Dimmer_delay_w = 61100 ' 189v
Waitus 950
'WAITMS 250 <---- и тут пробовал
Loop
''===============
Ovf1_my:
If Dimmer_on = 1 Then
Dimmer_out = 1
Waitus 90
Dimmer_out = 0
Else
Dimmer_out = 0
End If
Return
' =============== Обработка прерывания по изменению на INT 0 ==================
Z_cross_int:
Timer1 = Dimmer_delay_w
Return
Do
While Key = 1
Wend
'WAITMS 250 <----тут пробовал
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
PINB.0 куда подтянут к плюсу или минусу? Может надо проверять на ноль когда кнопка нажата? Может в этом месте прога и зацикливается, считая не нажатую кнопку нажатой.
Да и Level_dimmer вроде как постоянно циклично инкременируется?
Do
While Key = 1
Wend
'WAITMS 250 <----тут пробовал
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
PINB.0 куда подтянут к плюсу или минусу? Может надо проверять на ноль когда кнопка нажата? Может в этом месте прога и зацикливается, считая не нажатую кнопку нажатой.
Да и Level_dimmer вроде как постоянно циклично инкременируется?
Pinb.0 подтянут к плюсу, кнопка на минус. Пока pinb.0 =1, крутимся в while-wend.
Иначе - инкремируем level_dimmer и обрабатываем получившееся.
Do
Nachalo:
If Key = 1
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
Else
If Key = 0 Then Nachalo
Do
Nachalo:
If Key = 1
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
Else
If Key = 0 Then Nachalo
Мне кажется, что еще более запутаннее получается. А места в тиньке2313 еще 69 процентов свободно.
Config Pinb.0 = Input
key alias pinb.0
Do
While Key = 1
Wend
'WAITMS 250 <----тут пробовал
Incr Level_dimmer
If Level_dimmer = 0 Then Level_dimmer = 1
If Level_dimmer = 8 Then Level_dimmer = 1
'---------------------------------------------------------------------------------------------
Dimmer_modul: ' -------------- УПРАВЛЕНИЕ ДИММЕРОМ --------------------------
If Level_dimmer = 0 Then
Dimmer_on = 0
Disable Ovf1
Else
Dimmer_on = 1
If Level_dimmer < 8 Then Enable Ovf1
End If
If Level_dimmer > 7 Then
' Dimmer_delay_w = &HFFFC ' Ярко горит - 230v
Disable Ovf1
Dimmer_out = 1
Level_dimmer = 8 ' <<<<<<<<<<<<<<<<<<<<<<<< ограничитель
End If
If Level_dimmer = 1 Then Dimmer_delay_w = 57900 ' Тускло горит - 25v
If Level_dimmer = 2 Then Dimmer_delay_w = 58300 ' 51v
If Level_dimmer = 3 Then Dimmer_delay_w = 58700 ' 78v
If Level_dimmer = 4 Then Dimmer_delay_w = 59000 ' 85v
If Level_dimmer = 5 Then Dimmer_delay_w = 59400 ' 149v
If Level_dimmer = 6 Then Dimmer_delay_w = 59900 ' 175v
If Level_dimmer = 7 Then Dimmer_delay_w = 61100 ' 189v
Waitus 950
'WAITMS 250 <---- и тут пробовал
Loop
Ну вот, неправда Ваша! Вот неправда! Как-то очень давно писал прогу для бегущих огней. Так там для автоматического изменения скорости бегущего огня, как раз и использовал переменную для Waitms. А для генератора - переменную для Waitus. И все работает по сей день. О как бывает!!! Кстати, вот выдержка из "Хэлпа":
Action
Suspends program execution for a given time in uS.
Syntax
WAITUS uS
Remarks
US
The number of microseconds to wait. (1-65535)
This must be a constant. Not a variable!
In version 1.12.x.x and higher you can use a variable as well.
Да, она вроде бы и константа, но начиная с версии 1.12.х.х - можно и как переменную!
Igor_67 писал(а):Ну вот, неправда Ваша! Вот неправда! Как-то очень давно писал прогу для бегущих огней. Так там для автоматического изменения скорости бегущего огня, как раз и использовал переменную для Waitms. А для генератора - переменную для Waitus. И все работает по сей день.
Поменьше эмоций
А я пытался сделать генератор переменной частоты, и не работало ни хрена. Частота следования импульсов с паузой waitus t никак не хотела меняться. Причём я долго не мог найти причину, пока не догадался на пробу заменить переменную константой.
Igor_67 писал(а):Кстати, вот выдержка из "Хэлпа":
This must be a constant. Not a variable!
Вот именно! Чёрным по английскому, как говорится
Igor_67 писал(а):In version 1.12.x.x and higher you can use a variable as well.
Я использую версию 1.11.9.8.
Даже остановленные часы два раза в сутки показывают правильное время.