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

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

Сб май 05, 2018 22:26:54

Приветствую всех.
...Пару строчек проги, а работать не хочет толком (вместо импульсов от внешнего источника использую временно кнопку. Подтяжка на + через резистор. Если медленно нажимать (>1 сек), то вроде все ок, если "быстрее", то индикация на LCD и сама программа сбивается.
Максимально постарался закомментить для читабельности/наглядности.

$Regfile="m8adef.dat"
$hwstack=40
$swstack=16
$framesize=32

Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Debounce = 10

Dim sek As long
dim imp as Word

Config Portd.3 = Input
Config Int1 = Change 'CHANGE (при изменении фронта)
Config Timer1 = timer , Prescale = 256

On Timer1 Uphigh 'переход по переполнению
On Int1 Change_Front 'переход по изменению фронта

sek=0
imp=0

Enable Interrupts ' включить прерывания
Enable Int1 'по импульсу на ножке d.3
Enable Timer1 ' ... по переполнению

Cursor Off Noblink ' курсор OFF

Do 'основной цикл
Locate 1 , 1
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
Waitms 100
Loop

Uphigh: 'секунды
Incr sek
Incr sek ' дважды,т.к. не хоцца умножать на 2
Return

Change_Front: ' кол-во импульсов и вывод на LCD
incr imp
Locate 2 , 6
Lcd imp;" Impulse"
return

p.s. ... как сей текст проги "вложить в разворачивающийся текст, т.к. скоро меня терпеливые модераторы забанят за ламерство!?! (Code/Spoiler)
p.s.s Спасибо за внимание :)

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

Сб май 05, 2018 22:35:33

думаю, дребезг контактов создаёт вам проблемы

я бы еще увеличил стеки и команду разрешения прерываний поставил после настройки всех прерываний

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

Сб май 05, 2018 22:50:09

а где частота работы мк...

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

Вс май 06, 2018 07:51:56

Uma_an писал(а):как сей текст проги "вложить в разворачивающийся текст, т.к. скоро меня терпеливые модераторы забанят за ламерство!?!


При создании сообщения есть BB коды и "Code" и "spoiler". Находятся прямо под полем "Заголовок".

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

Вс май 06, 2018 09:21:59

думаю, дребезг контактов создаёт вам проблемы

я бы еще увеличил стеки и команду разрешения прерываний поставил после настройки всех прерываний


Увеличил:
$hwstack=80
$swstack=32
------
Увеличение не исправило кривизну моей проги )
Enable Interrupts '(команда разрешения прерываний и так вроде стоит после настройки всех прерываний... Или как нужно?)

Добавлено after 9 minutes 51 second:
а где частота работы мк...


Частоту выставляю фьюзами вручную. Внутренний RC генератор на 8 МГц
Вложения
atmega8a fuse.jpg
(149.09 KiB) Скачиваний: 580

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

Вс май 06, 2018 14:03:33

а пи чем тут фузы?вы компилятору сообщили частоту мк?
$crystal = 8000000

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

Вс май 06, 2018 15:48:29

а пи чем тут фузы?вы компилятору сообщили частоту мк?
$crystal = 8000000


да

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

Вс май 06, 2018 16:04:52

для данной программы скорость не влияет.
Сделайте генератор на другом МК или любой микросхеме, частота от 1 до 100 герц и посмотрите как работает.
Пока считаю, что проблема автора в дребезге контактов выключателя, которым он имитирует работу внешнего источника сигналов

а можно и так сделать:
в подпрограмме прерывания добавить команду отключения прерываний (или именно аппаратного внешнего), добавить паузу в 50-100uS, затем включить ранее отключенное прерывание.

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

Вс май 06, 2018 16:28:36

Novice user писал(а):а пи чем тут фузы?вы компилятору сообщили частоту мк?
$crystal = 8000000


Данный дефайн используется для расчета задержек при использовании тех же функций DELAY (wait, waitms, waitus) и прочей времязависимой периферии типа UART. В данном случае оно совершенно не играет никакой роли.

aleksandr-zh писал(а):а можно и так сделать:
в подпрограмме прерывания добавить команду отключения прерываний (или именно аппаратного внешнего), добавить паузу в 50-100uS, затем включить ранее отключенное прерывание.


В обработчике и так все прерывания запрещаются глобально и хардварно, независимо от языка программирования. А вот флаги прерываний продолжают выставляться исправно, и вот их стоит сбрасывать. Про задержки в прерываниях говорить не буду. :)

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

Вс май 06, 2018 17:00:22

Novice user писал(а):а пи чем тут фузы?вы компилятору сообщили частоту мк?
$crystal = 8000000


Данный дефайн используется для расчета задержек при использовании тех же функций DELAY (wait, waitms, waitus) и прочей времязависимой периферии типа UART. В данном случае оно совершенно не играет никакой роли.

то есть Waitms 100 всегда будет 100 мсек если в программе не выставить частоту мк,а мк прошить хоть 1,хоть 2,хоть 4,хоть 8 МГц? всегда думал что для Waitms 100 нужно указывать компилятору частоту мк
вот попробуйте
Спойлер$Regfile = "m8adef.dat"
$crystal = 8000000
'$hwstack = 40
'$swstack = 16
'$framesize = 32
Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Cursor Off Noblink ' êóðñîð OFF
'Config Debounce = 10
Dim sek As long
dim imp as Word
dim flag as bit
'Config Portd.3 = Input
Portd.3 = 1
Config Int1 = Falling ' 'âíåøíåå ïðåðûâàíèå - ïî ñïàäó èìïóëüñà CHANGE (ïðè èçìåíåíèè ôðîíòà)
Config Timer1 = timer , Prescale = 256
On Timer1 Uphigh 'ïåðåõîä ïî ïåðåïîëíåíèþ
On Int1 Change_Front 'ïåðåõîä ïî èçìåíåíèþ ôðîíòà
Enable Interrupts ' âêëþ÷èòü ïðåðûâàíèÿ
Enable Int1 'ïî èìïóëüñó íà íîæêå d.3
Enable Timer1 ' ... ïî ïåðåïîëíåíèþ
sek = 0
imp = 0
flag = 0
Do 'îñíîâíîé öèêë
Locate 1 , 1
Lcd "sek:" ; Sek ; " Tim1:" ; timer1 ' ñåêóíäû è òàéìåð öèêëà
if flag = 1 then
Locate 2 , 6
Lcd imp ; " Impulse"
flag = 0
end if
Waitms 100
Loop

Uphigh: 'ñåêóíäû
Incr sek
Incr sek ' äâàæäû,ò.ê. íå õîööà óìíîæàòü íà 2
Return
Change_Front: ' êîë-âî èìïóëüñîâ è âûâîä íà LCD
incr imp
flag = 1
return

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

Вс май 06, 2018 17:10:07

Novice user писал(а):то есть Waitms 100 всегда будет 100 мсек


Разумеется, эта задержка не будет всегда равна 100 мс при разной частоте тактирования, я же и написал про DELAY, просто немного некорректно выразился. :) Но здесь по сути это частота обновления дисплея, так что не особо важно.

Если что и может быть важным, то это библиотека дисплея. Там запросто могут быть софтварные задержки.

Novice user писал(а):нужно указывать компилятору частоту мк


Она на самом деле всегда указана, даже если в коде нет упоминания. "Options - Compiler - Communications". Вот "Frequency" и есть тот самый кристалл, а директива в коде эту настройку отменяет.

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

Вс май 06, 2018 17:22:48

понятно,спасибо!раз вы уж здесь давно хотел спросить у знающего человека
реально ли сделать чисто программный I2C?
у меня 2 устройства с одинаковым адресом обращения,общение к ним только по I2C,вывода CS у них нет,а надо управлять обоими по раздельности,то есть для одного устойства свои выводы sda scl,для второго-свои
это реально?

на одно устройство подаются только команды,на второе помимо команд надо считывать регистры(поправил)

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

Вс май 06, 2018 17:30:06

а кто удалил моё сообщение?...
можно, конечно
И без самодеяльности : всё есть в Баском
сейчас найду пример, я уже это делал

Добавлено after 2 minutes 16 seconds:
Config I2cbus = 0 , Scl = Portd.1 , Sda = Portd.0
Config I2cbus = 1 , Scl = Portd.3 , Sda = Portd.7

I2cbus = 0
Config I2cdelay = 50
I2cinit

I2cbus = 1
Config I2cdelay = 10
I2cinit

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

Вс май 06, 2018 17:30:20

Это именно два одинаковых устройства? То бишь у них одинаковые адреса? У некоторых железяк можно буквально запаивая перемычки на плате изменить адрес устройства. Если же действительно одинаковые, то реализовать софтварный I2C совсем не сложно. Как средствами баском, так и своими руками.

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

Вс май 06, 2018 17:39:43

нет-у них одинаковые адреса-tda6508 и rda5807
у tda6508 адрес &B1100 0000 ,у rda5807 &B0010 0000,думал все хорошо,но после сборки (линии SDA SCL объединил),но при обращении к tda6508 в rda5807 все сбивалось-оказывается rda5807 переходит в режим совместимости с tea5767,адрес которой TEA5767 MODE CHIP ID = &B1100 0000
даташит tda6508 http://p-45.narod.ru/files/TDA6508_6508 ... 509A_1.pdf
rda5807 в режиме совместимости http://www.i-biznes.com/datasheets/RDA/ ... al_1.0.pdf -на второй ст внизу написан адресс

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

Вс май 06, 2018 19:35:59

Не знаю кого перецитировать, но перенеся строки из отработки прерывания в основную программу:
Locate 2 , 6
Lcd imp;" Impulse"

...задействовав еще одну переменную 'imp_old' всё вроде стало на свои места. НО, по сути, вопрос для меня не остался закрытым, т.к. не уверен, что это "дребезг контактов" или находясь в прерывании началась обработка прерывания по выводу инфы на LCD или какую-нить паузу нужно поставить или еще хз что... Я не уверен полностью в этой проге, что при каких-то стечениях обстоятельств не глюканет :(
Спойлер$Regfile="m8adef.dat"
$crystal = 8000000
$hwstack=40
$swstack=16
$framesize=32

Config Lcdpin = Pin , Rs = Portd.0 , E = Portd.2 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
Config Lcd = 16 * 2
Config Debounce = 10

Dim sek As long
dim imp as Word
dim imp_old as Word

Config Portd.3 = Input
Config Int1 = Change 'CHANGE (при изменении фронта)
Config Timer1 = timer , Prescale = 256

On Timer1 Uphigh 'переход по переполнению
On Int1 Change_Front 'переход по изменению фронта

sek=0
imp=0
imp_old=0

Enable Interrupts ' включить прерывания
Enable Int1 'по импульсу на ножке d.3
Enable Timer1 ' ... по переполнению

Cursor Off Noblink ' курсор OFF

Do 'основной цикл
Locate 1 , 1
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
Waitms 100
if imp<>imp_old then
Locate 2 , 6
Lcd imp;" Impulse"
end if
Loop

Uphigh: 'секунды
Incr sek
Incr sek ' дважды,т.к. не хоцца умножать на 2
Return

Change_Front: ' кол-во импульсов и вывод на LCD
incr imp
return

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

Вс май 06, 2018 19:40:02

Я выше предложил подобное
можно и как у вас,только добавить
if imp<>imp_old then
Locate 2 , 6
Lcd imp;" Impulse"
imp_old=imp
end if

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

Вс май 06, 2018 21:26:58

Я выше предложил подобное
можно и как у вас,только добавить
if imp<>imp_old then
Locate 2 , 6
Lcd imp;" Impulse"
imp_old=imp
end if


Суть не в том, чтоб программа заработала, суть в том, чтоб понять из-за чего она не захотела работать в первом варианте. Не факт, что во втором варианте проги не проскочит "прерывание, паразитный импульс" и т.д., а этого на данном этапе не было осознанно, проконтролировано, учтено и, вследствие перечисленного, не собьёт работоспособность.

P.S. ... забейте... Не хочется захламлять форум.

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

Вс май 06, 2018 21:38:29

так у вас там в прерывании вывод на жки
допустим в какой то момент начала выводиться строка
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
вышло в жки sek:;Sek ;" T",то есть "im1:" еще не загрузилось а у вас сработало прерывание,там как написано отработалось и уже потом продолжается отправка в жки "im1:",в итоге на экране абра-кадабра
в принципе можно запрещать и разрешать прерывания во время общения с жки,тоже должно работать
disable Int1 -запрещаем
Locate 1 , 1
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
enable Int1-снова разрешаем

и прерывание срабатывает 2 раза,т к Config Int1 = Change...

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

Вс май 06, 2018 22:34:33

так у вас там в прерывании вывод на жки
допустим в какой то момент начала выводиться строка
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
вышло в жки sek:;Sek ;" T",то есть "im1:" еще не загрузилось а у вас сработало прерывание,там как написано отработалось и уже потом продолжается отправка в жки "im1:",в итоге на экране абра-кадабра
в принципе можно запрещать и разрешать прерывания во время общения с жки,тоже должно работать
disable Int1 -запрещаем
Locate 1 , 1
Lcd "sek:";Sek ;" Tim1:"; timer1 ' секунды и таймер цикла
enable Int1-снова разрешаем

и прерывание срабатывает 2 раза,т к Config Int1 = Change...


Возможно. Надеюсь, что это так. Поэтому и вынес вывод на ЖКИ за пределы прерывания в основную программу.

Новая фишка:
tim1=tim1+65535+sek2*65535 'tim1, sek2 as Long
ошибка
переписываю:
tim1=tim1+65535
tim1=tim1+sek2*65535
ошибка во второй строке
переписываю:
tim1=tim1+65535
tim1=sek2*65535
t1=tim1+t1 'добавляю переменную t1 as long
ok
Bascom avr не умеет считать "в одну строку?"
Ответить