результат хороший не обещаю-сам новичок,но раз пошла валерьянка...
выложите к каким выв подключены кнопки,нагрузки,конретные задачи.там по ходу и посмотрим
а пробовали ? они вобще диммируются эти ваши лампы ?AlekseyV писал(а):И кстати, диммировать надо КЛЛ лампы.
Код: Выделить всё
on int0 pulse
channel1 alias portd.1
channel2 alias portd.2
.......
channel3 alias port...
channel as byte ' номер канала управления
Dim PWM(8) as word ' массив 8-ми каналов для шим
do
if razr = 0 then ' если ноль то гасим всё
razr = 1
channel1 = 0
channel2 = 0
.............
channel8 = 0
else
if pwm(1) < timer1 then channel1 =1 ' если не ноль, то сверяем не пора ли включать по условиям ШИМ для каждого канала
if pwm(2) < timer1 then channel2 =1
............
if pwm(8) < timer1 then channel8 =1
end if
if knopka_channel = 1 then ' тут флаг нажатия кнопки или энкодера
knopka_channel = 0
incr channel ' увеличиваем номер канала
if channel > 8 then channel = 1 ' начинаем все сначала
end if
if knopka_plus = 1 then
knopka_plus = 0
pwm(channel) = pwm(channel) - 1000 ' здесь 1000 это шаг регулировки, выбираем исходя из максимального Timer1. Для простоты максимум 10000, значит шаг 10% = 1000
if pwm(channel) > 10000 then pwm(channel) = 0 ' верхний потолок
end if
if knopka_minus = 1 then
knopka_minus = 0
pwm(channel) = pwm(channel) + 1000 ' здесь 1000 это шаг регулировки, выбираем исходя из максимального Timer1. Для простоты максимум 10000, значит шаг 10% = 1000
if pwm(channel) > 10000 then pwm(channel) = 10000 ' нижний потолок, т.е. чем больше значение pwm тем позже включится нагрузка
end if
loop
pulse:
timer1 = 0
razr = 0
return
Импульсы в протеусе нужны прямоугольные это раз.Dnepr_1186 писал(а):Написал програмку для счета скорости и пробега.
Если шагом просто задать отрицательное число, то естественно все работает, а также если шагу назначить переменную с положительным значением (ну и перебирать от малого к большому), то тоже все работает. А "отрицательная переменная" ну ни какDim A As Byte
Dim Stp As Integer
Stp = -1
For A = 7 To 2 Step Stp
Next A
Выставь одну размерность - всё в integer, и A, и stpevgenkostin писал(а): Что я делаю не так?
Баском 2.0.7.5
Нужна одна размерность переменных. И дабы не забивать память переменными типа Integer, можно сделать так:evgenkostin писал(а): Что я делаю не так?
Код: Выделить всё
Dim A As Byte
Dim Stp As Byte
A=7
While (A>=2)
' тут ваш код собственно
Decr A
Wend
По-вашему, в моем случае не получиться и прийдется забивать память. Смысл моей программки в том что бы пробегать интервал в обе стороны и с разной (произвольной) скоростью. Разве в таком случае есть другой способ не через "фо-некст"?serg_svd писал(а):И дабы не забивать память переменными типа Integer, можно сделать так:
Да чтобы далеко не ходить, можно хоть тот же код что я привел преобразовать.evgenkostin писал(а): Разве в таком случае есть другой способ не через "фо-некст"?
Вы конечно правы. Если немного подумать, то можно было решить проблему другими способами. Спасибо!serg_svd писал(а):Так что всегда можно обойти такие подводные камни.
Код: Выделить всё
Select Case Kanal
Case 1 : Set Portc.0 and Portc.1
Case 2 : Set Portc.1
Case 3 : Set Portc.2
Case 4 : Set Portc.3
End Select
Case 1 : Set Portc.0: Set Portc.1domrustika писал(а):ребят посоветуйте есть кусок кода
как сделать чтобы не 1 порт а несколько SET?
Код: Выделить всё
Select Case Kanal
Case 1 :
Set Portc.0
Set Portc.1
Case 2 : Set Portc.1
Case 3 : Set Portc.2
Case 4 : Set Portc.3
End SelectКод: Выделить всё
$regfile = "m8def.dat" 'выбираем контроллер
$crystal = 4000000 'выбираем частоту кварца
Dim Level As Byte
Dim Dimmer_delay_w As Word
Config Portb.0 = Input ' определим направление порта для ZC на вход
Config Portb.1 = Output ' определим направление порта для тиристора
Config Portb.5 = Input ' определим направление порта для кнопки 3 на вход
Config Portc.2 = Input ' определим направление порта для кнопки 2 на вход
Config Portc.3 = Input ' определим направление порта для кнопки 1 на вход
Config Portc.5 = Output ' определим направление порта для светодиода 1 на выход
Portb.0 = 1 ' включим внутренний подтягивающий резистор для ZC
Portb.5 = 1 ' включим внутренний подтягивающий резистор для кнопки 3
Portc.3 = 1 ' включим внутренний подтягивающий резистор для кнопки 2
Portc.2 = 1 ' включим внутренний подтягивающий резистор для кнопки 1
Zc Alias Pinb.0 ' обзовём ZC
Switch3 Alias Pinb.5 ' обзовём вход кнопки 3 - кнопкой 3
Switch2 Alias Pinc.3 ' обзовём вход кнопки 2 - кнопкой 2
Switch1 Alias Pinc.2 ' обзовём вход кнопки 1 - кнопкой 1
Triac Alias Portb.1 ' Тристор
Lck Alias Portc.5 ' Светодиод - Закрыто(при перегрузке и блокировке горит)
Config Int0 = Change ' Установка прерывания INT0 на изменение сигнала
On Int0 Z_cross_int
Enable Int0 ' Прерывание на вход датчика перехода синусоиды через ноль
Config Timer1 = Timer , Prescale = 8 ' конфигурируем таймер 1
Enable Timer1
Start Timer1
On Ovf1 Ovf1_my Nosave
Enable Ovf1
Triac = 0
Level = 0
Do '*-*-*-*Начало основного цикла*-*-*-*
If Switch1 = 0 Then
If Level < 8 Then
Incr Level
End If
End If
If Switch2 = 0 Then
If Level > 0 Then
Decr Level
Else
Level = 0
End If
End If
If Level = 0 Then
Disable Ovf1
Else
If Level < 8 Then Enable Ovf1
End If
If Level > 7 Then
Dimmer_delay_w = &HFFFC ' Ярко горит - 230v
Disable Ovf1
Triac = 1
Level = 8 ' <<<<<<<<<<<<<<<<<<<<<<<< ограничитель
End If
If Level = 1 Then Dimmer_delay_w = 57900 ' Тускло горит - 25v
If Level = 2 Then Dimmer_delay_w = 58300 ' 51v
If Level = 3 Then Dimmer_delay_w = 58700 ' 78v
If Level = 4 Then Dimmer_delay_w = 59000 ' 85v
If Level = 5 Then Dimmer_delay_w = 59400 ' 149v
If Level = 6 Then Dimmer_delay_w = 59900 ' 175v
If Level = 7 Then Dimmer_delay_w = 61100 ' 189v
Waitus 950
Loop '*-*-*-* возврат в основной цикл*-*-*-*
''===============
Ovf1_my:
Triac = 1
Waitus 90
Triac = 0
Return
' =============== Обработка прерывания по изменению на INT 0 ==================
Z_cross_int:
Timer1 = Dimmer_delay_w
Return
'Indication:
'Timer0 = Timerpreload_0
'Return
End '