CODE:
{
if (Step) {
cnt++;
if (cnt==119){
cnt=0;
Step--;
if (Direct){
OCR0A=0xFE-Step;
}
else {
if (!Step)OCR0A=0;
else OCR0A=Step;
}
}
}
}
Я попробовал впрямую заменить на соответствующие операторы, но не тут то было, т.к. эквивалента фигурных скобок нет я так понял. Значит нужен какой то другой подход? Какой. Как реализовать цепочку IF? Попробовал вот так но компилятор ругается. Кто что может подсказать. Буду благодарен за любую помощь. Step зарезервированное слово заменено на Stp
If Stp > 1 Then Incr Cnt
Elseif Cnt = 119 Then
Cnt = 0
Decr Stp
Elseif Direct > 0 Then
Ocr0a = &HFE - Stp
Else
If Stp > 0 Then
Ocr0a = 0
Else
Ocr0a = Stp
End If
А где он должен быть? Если вторым в конце, то пробовал и в конце и в середине . Не выходит. Где то есть не стыковка.
P.S. Скажите , а можно сделать такое допущение, что сколько в преобразуемом коде операторов IF столько же должно быть и END IF?
P.S.P.S. Как оказалось можно
nsl2004, каждое if должно оканчиваться end if
Если не ошибаюсь, у тебя их должно быть 4 штуки, хотя по такому коду сложно понять, находится ли условие внутри другого условия или же оно самостоятельное...
Есть вопрос такого плана
В образце проги , с которй я работаю есть такая строка Config Timer0 = Timer , Prescale = 64
С книги по Баскому я выяснил следующее = внутренний генератор (Fкв/12) C/Tx=0 и собственно +prescale = 64
Честно говоря хотел выяснить что такое Fкв/12? какой байт в каком бите за него отвечает.
С/Tx=0 собственно те же вопросы.
Идентична ли запись ( или корректна ли запись ) такого плана ( Для Atmega32) TCCR0=&b00000011 ( т.е первый и второй байты 64 прескале) TCNT0=&b00000000 OCR0=&b00000000
т.е заменит ли она строчку приведенную вначале поста
nsl2004 писал(а):Config Timer0 = Timer , Prescale = 64
С книги по Баскому я выяснил следующее = внутренний генератор (Fкв/12) C/Tx=0 и собственно +prescale = 64
Честно говоря хотел выяснить что такое Fкв/12? какой байт в каком бите за него отвечает.
С/Tx=0 собственно те же вопросы.
Уж не знаю, что это за такая умная книга, но лучше всё же пользоваться "родной" документацией, как минимум встроенным хелпом
PRESCALE:
The TIMER is connected to the system clock in this case. You can select the division of the system clock with this parameter.
Valid values are 1 , 8, 64, 256 or 1024
Если с английским плохо, то вкратце Prescale это дискретный коэффициент, на который делится тактовая частота МК. Необходимость лазить вручную в регистры таймера абсолютно отпадает.
Даже остановленные часы два раза в сутки показывают правильное время.
2Секретный кот
Спасибо за ответ. Книга действительно умная.СПРАВОЧНИК ПО ПРОГРАММИРОВАНИЮ
BASCOM-8051® Автор Кулиш. Так вот он в пояснении к конфигурированию Timer0 и приводит вот эти данные Fкв/12 - ? и C/Tx=0 -? Что он имеет ввиду непонятно. Я просто подумал, что плавающий в теме человек просто подскажет.
Дело в том что мне надо знать. ЧТО ДЕЛАЕТ оператор Timer0=Timer. Как оказалось что приведенная мной конфигурация регистров именно и означает Config Timer0 = Timer , Prescale = 64. Но есть одно но... тогда в теле программы , не работают START и STOP Timer. Надо явно прописывать регистры и их значения что бы добится нужного эффекта. Ну по крайней мере пока у меня так.
А необходимо разобратся потому , что у меня конфликтуют между собой Timer0 и Timer1-Timer2 задействованные под PWM (ШИМ). Мне нужен приоритет ШИМов, а пока включаются жуткие торомза. Существует две программы, по отдельности работают. Начинаю объединять тормоза, или вообще непашет. Что то с прерываниями.
Prescale мне понятно - в даташите подробно описано.
2 Секретный кот
Версия 1.11.95.
Они как бы уживаются , но в целом все можно сказать не работает. Значит в чем собственно пролема.
Есть код эмулирующий работу 1-wire ключа DS2413 ( назовем код B) и есть код выключателя на 4 положения ( по типу шагового реле с двумя шимами - условно назовем А). Их надо объединить в один код включателя с возможностью управления и индикации по 1 -wire. По одиночке коды 100 процентов рабочии. Так вот.
Первое. Приоритет у кода А. Пока идет работа ШИМОВ ( Timer1 и Timer2). А она заключается в том , что в зависимости от режима они плавно устанавливаются либо в ноль либо на максимум, либо один в ноль другой в максимум. Работа кода В запрещена,т.е Timer0 остановлен. Управление по INT0. Вроде все просто.Но...
По INT0 происходит срабатывание, кнопка работает, ШИМы работают, режимы переключаются. В то же время Timer0 включаетя и молотит без остановк , никак не реагируя на управляющий код предназначенный для него. Хотя по науке пока работает обработчик INT0, он работать не должен.
Вы знаете сейчас вот это написал и понял одно - каша. Не зря говорят, если правильно задал вопрос, то наполовину задачу решил. Придется вернутся к началу.
Второе. Ньюансы - могут ли таймеры в настройках иметь разные прескале (делители) у меня Таймер ноль 64, а 1 и 2 - единица. Не будут конфликтовать между собой.?
Пришли новые энкодеры, результата ноль, блин... перепробовал кучу вариантов кода и ни в какую не хочет работать в обе стороны вращения, работает либо в одну, либо в другую, помогите пожалуйста, задолбался уже
Config Int0 = Falling
On Int0 _int0
_int0:
Waitms Debouncetime
If Portd.3 = 0 Then
If Zad_temp <> 500 Then Incr Zad_temp
Else
If Zad_temp <> 0 Then Decr Zad_temp
End If
Return
Строки описания переменных и времени задержки опущены, мега8, такт 4 метра
Энкодер PEC16-4220F-S0024
Intel_agent писал(а):Пришли новые энкодеры, результата ноль, блин... перепробовал кучу вариантов кода и ни в какую не хочет работать в обе стороны вращения, работает либо в одну, либо в другую, помогите пожалуйста, задолбался уже
а в хелпик заглянуть слабо? там между прочим много всего интересного , среди прочего имеется готовый исходик
$regfile = "m128def.dat" ' specify the used micro
$crystal = 4000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Print "Encoder test"
Dim B As Byte
'we have dimmed a byte because we need to maintain the state of the encoder
Portb = &B11 ' activate pull up registers
Do
B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
' ^--- 1 means wait for change which blocks programflow
' ^--------^---------- labels which are called
' ^-------^---------------------------- port PINs
Print B
Waitms 10
Loop
End
'so while you can choose PINB0 and PINB7,they must be both member of PINB
'this works on all PIN registers
Links:
Print "left rotation"
Return
Rechts:
Print "right rotation"
Return
End
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Друзья подкажитe пожалуйста правильно ли понимаю следующие поцедуры
На С# написано if (Step) { бла бла ... step unsigned char
Я понимаю так что если Step положителен то итд.
Значит на Баскоме If Step>0 Then блабла - правильно?
На C# if (!Step) бла бла
А на Баскоме? IF STEP=0 Then?? Ну с учетом того что Step может быть только положительным?
Или все таки имеется ввиду что не Step - тогда как эту процедуру реализовать на баскоме?
Можно сделать при помощи select case - Блок выбора по ключу
Что то типа
select case step
case is>0
бла-бла-бла
case is<0
бла-бла-бла
case else (типа =0, но можно и явно задать ключ)
бла-бла-бла
end select
2pavel123
Спасибо. Т.е я так понял, что понял логику выражений на Си правильно, и один из методов реализовать Вы мне подсказали. Мое число может быть только положительным. Значит условие меньше нуля отпадает. т.е получается , что я на Баскоме реализовал правильно? С использованием IF?