Обсуждаем контроллеры компании Atmel.
Ответить

Re: BASCOM AVR в вопросах и ответах

Сб июн 17, 2017 15:38:01

serg_svd это один из кучи вариантов программы, пробовал всяко.
выход из бесконечности и должен быть только по прерыванию кнопки. главная беда была что возвращение после прерывания кнопки приходилось в долгий цикл, и пока он до конца не доходил - кина не случалось
собсна, я уже решил проблему тупо, некрасиво и в лоб. самому противно

Re: BASCOM AVR в вопросах и ответах

Сб июн 17, 2017 17:10:04

Да нет там у вас решения. В прерывании изменяетсятолько значение переменной В. А оператор goto находится вне двух бесконечных циклов. Поэтому и не работает

Re: BASCOM AVR в вопросах и ответах

Сб июн 17, 2017 17:18:18

вот так работает. но мне не нравится. но работает
$Regfile="attiny85.dat"
$Crystal=8000000
$hwstack=40
$swstack=16
$framesize=32


Config Portb.0 = Output 'R
config portb.1 = output 'G
config portb.4 = output 'B
Config PORTB.3 = output 'фонарик
Config PINB.2 = input 'кнопка
Config Int0 = Falling : On INT0 Button
Config Timer1 = Timer , Prescale = 1 : On Timer1 Pwm_prog : Enable Timer1 : Enable Interrupts : start timer1 : Enable Int0

Dim S As Byte , A as Byte , C(3) as byte , B as Byte , R as Byte

for A=0 to 63
C(1)=lookup(A , TAB_PWM)
waitms 20
next

Do

If R=0 then
PORTB.3 = 0
for A=0 to 63 'тут ШИМ, режим 1 (по умолчанию)
if R=0 then
C(2)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next

for A=63 to 0 step -1 'óìåíüøàåì êðàñíûé
if R= 0 then
C(1)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next
waitms 100
for A=0 to 63 'óâåëè÷èâàåì ñèíèé
if R=0 then
C(3)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next

for A=63 to 0 step -1 'óìåíüøàåì çåëåíûé
if R=0 then
C(2)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next
waitms 100
for A=0 to 63 'óâåëè÷èâàåì êðàñíûé
if R=0 then
C(1)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next

for A=63 to 0 step -1 'óìåíüøàåì ñèíèé
if R=0 then
C(3)=lookup(A , TAB_PWM)
waitms 20
else
goto 1
end if
next
waitms 200
end if

1:
If R=1 Then
C(1) = 0 : C(2) = 0 : C(3) = 0 : PORTB.3 = 1 'тут фонарик (режим2)
End if

loop

end



Pwm_prog:
Incr S

if S=255 then S=0

If S<C(1) Then Set Portb.0 Else Reset Portb.0

If S<C(2) then Set Portb.1 Else Reset Portb.1

If S<C(3) then Set Portb.4 Else Reset Portb.4

Return

Button:
Incr R
waitms 75 'потому что кнопка плохая, вот и 75
if R>1 then R = 0
GIFR = 64
Return


TAB_PWM:
Data 0 , 0 , 0 , 0 , 1 , 2 , 3 , 3 , 5 , 6 , 7 , 8 , 10 , 12 , 14 , 15
Data 17 , 20 , 22 , 24 , 27 , 30 , 32 , 35 , 38 , 42 , 45 , 48 , 52 , 56 , 59 , 63
Data 67 , 71 , 76 , 80 , 85 , 89 , 94 , 99 , 104 , 109 , 115 , 120 , 126 , 131 , 137 , 143
Data 149 , 155 , 161 , 168 , 174 , 181 , 188 , 195 , 202 , 209 , 216 , 224 , 231 , 239 , 247 , 255

Re: BASCOM AVR в вопросах и ответах

Вс июн 18, 2017 11:51:06

IDok, я баском немного подзабывать начал, перешел на СИ (поэтому прошу прощения, если где-то в синтаксисе ошибусь). Но поскольку Вам не отвечают, решил включится.
Полностью прописывать прогу не буду, опишу смысл, как вижу реализацию
Код:
'объявление функций
DECLARE SUB фонарик
DECLARE SUB ШИМ

'здесь основная программа
do
select case B
case 0: call ШИМ
case 1: call фонарик
end select
loop
end

'здесь обработчик прерывания от кнопки
button:
Incr B
[s]waitms 10[/s] ' в обработчике прерываний нежелательно и вредно делать какие либо задержки
if B>2 then B = 0
return


waitms 10 ' в обработчике прерываний нежелательно и вредно делать какие либо задержки

в итоге Ваша программа всегда будет крутится только по одному бесконечному циклу.
Далее, нужно будет смотреть уже более конкретно. Возможно, нужно будет ввести флаги и выполнять код по ним.
А то в моем примере исполнение кода будет бегать либо в функции ШИМ, либо в фонаре бесконечно.

Re: BASCOM AVR в вопросах и ответах

Вс июн 18, 2017 12:15:46

serg_svd спасибо за ответ. ну лето, выходные, все на даче шашлык компилят...
задержка в прерывании - это антидребезг.
главная моя проблема была - как выйти из ШИМа по прерыванию СРАЗУ, а не после окончания
что-то упускаю, но никак не пойму что

Re: BASCOM AVR в вопросах и ответах

Вс июн 18, 2017 12:34:17

IDok писал(а):задержка в прерывании - это антидребезг.

Я понял, но антидребезг нужно выносить из прерывания в основной цикл и там обрабатывать.

У Вас там циклов в последнем коде немеряно. При чем много повторяющихся. Надо смотреть как их объединить.
Кроме того, цикл не обязательно делать на операторах for-to-next. Можно и на do-loop, while-do.
Просто ввести в них счетчик и инкрементировать его. Кроме этого добавить в условие ту же переменную В и программа будет вылетать из такого цикла, если переменная изменит свое значение.
В общем вариантов много. Я в целом задачу не представляю, но вы для себя разбейте программу на блоки, максимально их упростите и оптимизируйте, а дальше объединяйте.
Я не спец в программировании, но именно так и делаю. Пишу отдельную функцию, отлаживаю ее. А далее оптимизирую совместную работу со следующей функцией

Re: BASCOM AVR в вопросах и ответах

Вс июн 18, 2017 12:55:47

serg_svd многоцикловый цикл - это ШИМ управления RGB-светодиодом. типа лампы настроения. куча циклов - потому что значения ШИМ читаются из таблицы внизу программы. есть вариант и на полностью программном шиме, там да - без кучи фор-некст

Re: BASCOM AVR в вопросах и ответах

Пн июн 19, 2017 07:41:55

собсна вопрос уважаемым котам - как навести красоту на программу? ну явно же есть способ выходить из подпрограммы по прерыванию, не дожидаясь окончания подпрограммы. но я его не вижу :(

Re: BASCOM AVR в вопросах и ответах

Пн июн 19, 2017 08:16:32

IDok писал(а):но я его не вижу

Так я ж советовал. Перепишите циклы на
Код:
while условие
wend

и контроллер не будет прогонять весь код, а вылетать из цикла по условию.
Или, если писать ту же обработку ШИМ в виде функции, то и выходить из нее по
Код:
return

Re: BASCOM AVR в вопросах и ответах

Пн июн 19, 2017 08:31:28

serg_svd
так он и сейчас вылетает по условию. а будет оно оформлено в виде If-THEN или WHILE - разницы не особо. все равно в каждом маленьком цикле идет своя проверка на переменную прерывания. ШИМ в виде подпрограммы не изменит ничего. что сейчас он автоматом возвращается в начало программы что по return... (пробовал я и с подпрограммами, результат тот же). мне же хочется найти вариант "как у больших" - когда в главном цикле только опрос кнопки и условия перехода, а сами режимы где-то там, за горизонтом. и когда по прерыванию программа сразу переходит в главный цикл, а не возвращается к месту прерывания и не ждет окончания режима

Re: BASCOM AVR в вопросах и ответах

Вс июн 25, 2017 00:22:27

Кто пробовал выводить VGA на Xmega256A3 не только текстом, но и графикой?
Если да, то как связывали два контроллера между собой?
У меня серия А3, там нет EBI (аппаратное расширение памяти), развёртку (синхро сигналы) сделал на 640х480, но с использованием внутренней памяти вывести получилось 280х240 или 35х20 символов.
Частота МК 45мГц (кварц 5мГц х 9).
Как-то надо передать на МК 3 бита (на 1 точку или букву), в три бита уложить информацию, к примеру:
Первый байт:
X - номер бита (для графики или текста)
Информация о OR AND стереть
Информация вывода текст/графика
Второй бит:
Y - номер линии 0-240
Третий бит:
Символ или чего нибудь ещё.

Как ни пробовал, всё никак не состыкую, даже многодрыгом не стабильность. UART в скорости проигрывает, USART обработать быстро не получается (МК нагружен сильно).
Так-то вот, что получилось на 1 кристале без внешней памяти:
https://www.youtube.com/watch?v=XZfVLQdSYS4
А это с внешней памятью, но внешняя память программно реализована, так как в серии А3 нет EBI, контроллер был просто в прерываниях, но всё-же:
https://www.youtube.com/watch?v=VLxxv96ZLmQ
https://www.youtube.com/watch?v=XThpf852ldY

Если кому интересно, выложу проект, всё-же порой VGA интерфейс в разных проектах очень актуален и дешевле большого графического LCD экрана.
Чисто теоретически, то, что сейчас работает от внутренней памяти (использовано 8,4кб), имеет достаточный ресурс и вполне может послужить каким нибудь прибором, к примеру измерительным или ЭКГ или чего нибудь ещё. Но при нагрузке есть проблемы с помехами в сигнале, хотя это лечится суровой оптимизацией.
Сейчас проблема управления этой картой, причём так, чтоб управляющий контроллер не тормозил на отправке данных, ожидая её обработки. Может есть какая возможность аппаратно влазить во внутреннюю память контроллера?

Re: BASCOM AVR в вопросах и ответах

Вс июл 02, 2017 11:22:13

Прошу прощения за наверняка занудный вопрос, но перекопать почти 300 страниц темы я не в состоянии. Понадобилось поработать в АВР Бейсике. Переустанавливал с десяток разных сборок Баскома. И демо, и крякнутые, и полные. Все работали, но ни один не выдает HEX - файла. Галочки на bin и hex - стоят!!!. Что у меня за проклятие такое???
При компилировании на долю секунды выдает голубое окно с надписью вроде как PASS 1 и всё.
Прим: Работаю на ноуте. КОМ и ЛПТ портов на нем нет.
С уважением.

Re: BASCOM AVR в вопросах и ответах

Вс июл 02, 2017 11:52:17

И ошибок компиляции нет?

Re: BASCOM AVR в вопросах и ответах

Вс июл 02, 2017 12:02:37

Ой блиииин. Чтоб он ошибки на экран выдал, оказывается влияет галочка там же где для bin и hex.
А я думал она только для выходных файлов. Прошу простить PICBasic-оюзера.
Спаааасибочки.
Последний раз редактировалось Ariadna-on-Line Вс июл 02, 2017 12:30:51, всего редактировалось 1 раз.

Re: BASCOM AVR в вопросах и ответах

Вс июл 02, 2017 12:23:47

Выложите файлик здесь, вам его скомпилируют на рабочей программе!

Re: BASCOM AVR в вопросах и ответах

Чт июл 06, 2017 19:43:29

Добрый день.
Как настроить прерывание по таймеру чтобы счетчик считал секунды ? Камень ATMEGA32 , внутренний кварц 8 МГц.

Re: BASCOM AVR в вопросах и ответах

Чт июл 06, 2017 20:04:31

тактовая сколько?

Добавлено after 12 minutes 51 second:
если 8МГц то:
таймер1, делитель 256, режим СТС, OCR1A=31250, прерывание по совпадению:
0x00->TCCR1A, 0x0C->TCCR1B, 0x7A->OCR1AH, 0x12->OCR1AL, 0x10->TIMSK

Добавлено after 4 minutes 38 seconds:
sei забыл
прерывание по совпадению OCR1A будет вызываться 1 раз в секунду.

Re: BASCOM AVR в вопросах и ответах

Чт июл 06, 2017 20:05:46

Как все это правильно написать в BASCOM ?

Re: BASCOM AVR в вопросах и ответах

Чт июл 06, 2017 20:18:50

чето я про ассемблер подумал, про регистры...
а тут так и пишешь: TCCR1A=$00 вроде так 16ричные цифры здесь пишутся

Re: BASCOM AVR в вопросах и ответах

Чт июл 06, 2017 20:25:00

$regfile = "m32def.dat" ' ìåãà8
$crystal = 8000000
Config Tccr1a = 0x00
Do
Loop
End

Вот так записал , компилятор выдает ошибку.
Ответить