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

Обсуждаем контроллеры компании Atmel.
Ответить
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

так в чем проблема?, опрашиваете по очереди ножки, ножка=1? старт таймерХ, и так далее.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Реклама
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

Сообщение implex »

mr4ester писал(а):так в чем проблема?, опрашиваете по очереди ножки, ножка=1? старт таймерХ, и так далее.
На ножке следующий расклад: 10мс единица, 10мс ноль. Необходим сброс таймера в момент перехода с ноля на единицу и наоборот. При вашем варианте, как мне кажется, первые 10 мс таймер будет постоянно сбрасываться, а вторые 10 мс будет работать так как надо. Всё равно спасибо. Свой вариант уже написал, должно получиться, завтра проверю. Если получится отпишусь.
Реклама
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

Сообщение implex »

Вообщем всё заработало правильно следующим способом:

Код: Выделить всё

Dim A As Bit
A = 1
Do
If Pinb.3 = A Then
Else
A = Pinb.3
Stop Timer0
Timer0 = 0
Start Timer0
.........
loop
End If
Если есть возможность проще реализовать такую же функцию, прошу отписаться.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры

Сообщение mr4ester »

вам не кажется что вы не правильно описали функцию. зачем вам else, у вас сейчас написано ели пин=А тогда, иначе ......, зачем это иначе?, и зачем вот это A = Pinb.3 действие?, и вообще не до конца понятно, что вам нужно считать.
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Пт мар 16, 2012 13:28:31

Сообщение purgen »

Добрый день уважаемые коты. Никак не могу скомпилить прилагаемый код, слишком мало опыта. Пожите кто чем может. Спасибо!
Вложения
2.txt
(17.49 КБ) 258 скачиваний
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Добрый.

Откуда код-то? Для начала все кавычки в коде неправильные. Например, подключаться файл должен так:

Код: Выделить всё

$regfile = "m168def.dat"
а не так:

Код: Выделить всё

$regfile = “m168def.dat”
Комментарии опять же:

Код: Выделить всё

'configure lcd screen
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

Сообщение implex »

mr4ester писал(а):вам не кажется что вы не правильно описали функцию. зачем вам else, у вас сейчас написано ели пин=А тогда, иначе ......, зачем это иначе?, и зачем вот это A = Pinb.3 действие?, и вообще не до конца понятно, что вам нужно считать.
Случайно не правильно скопировал:

Код: Выделить всё

Dim A As Bit
A = 1
Do
If Pinb.3 = A Then
Else
A = Pinb.3
Stop Timer0
Timer0 = 0
Start Timer0
.........
loop
Изначально требовалось следующее: сброс таймера при изменении состояния ножки. Я ввожу переменную, которая хранит состояние ножки. Программа выполняет следующее: сравнивает состояние порта с предыдущим состоянием, если состояние равно предыдущему, то ничего не происходит и таймер продолжает считать, если состояние изменилось то записывем новое состояние, останавливаем таймер, записываем внего 0 и запускаем. Так же и для других таймеров, только другая переменная и сравнивается с состоянием другой ножки. Then потом сразу else - я догадывался что это не совсем корректно, но программа заработала именно так как нужно. Если есть способ сделать более правильно эту часть, тогда подскажите, пожалуйста. Нужно следующее: если порт не равен переменной то....
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

implex писал(а):Нужно следующее: если порт не равен переменной то....
А, вот откуда эта ерунда с Else. :)) Если нужна проверка на неравенство:

Код: Выделить всё

If Pinb.3 <> A Then
A = Pinb.3
Stop Timer0
Timer0 = 0
Start Timer0
.........
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Родился
Сообщения: 15
Зарегистрирован: Пт фев 17, 2012 23:19:13

Сообщение implex »

Edm 2007 огромное спасибо! Именно то, что нужно. Вводил в гугл "неравно в bascom" и не нашел - плохо искал. По этому думал, что знака неравно нету. В исходниках по ходу то же редко встречается.
Мучитель микросхем
Аватара пользователя
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37

Сообщение dimon-790 »

кто подскажет как переменную типа word , вытащить на 4х разрядный led индикатор ?. Пробовал разбить её на два байта , с помощью high и low и последующим делением на 10 но получается какято хрень . Кто и как это победил ?
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Какая разница сколько разрядов на индикаторе и какой тип переменной? Есть масса вариантов по разносу переменной по разрядам, и тип / разряды тут не имеют никакого значения. Можно оформить все это в цикл, который сам разобьет переменную по разрядам, а можно просто разнести руками, используя элементарно деление / остаток от деления. Будьте добры пример кода, в котором у Вас возникли затруднения.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37

Сообщение dimon-790 »

Dim Razdisp(4)as Byte , N As Byte , L As Byte , Displ As Byte , Dat_adc As Word , R As Byte , G As Byte
Patcon:
Dat_adc = 256
'Razdisp(4) = High(dat_adc)
'Razdisp(3) = Low(dat_adc)

R = Dat_adc / 10
Razdisp(1) = Dat_adc Mod 10 '5
Razdisp(2) = R Mod 10
Razdisp(3) = R / 10
'razdisp(4) = Dat_adc / 10
Return

вот этот кусок программы , если в Dat_adc положитьчисло до 255 то всё нормально а если больше начинаются чудеса .
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Для начала разберитесь с типами переменных, у Вас Dat_adc имеет тип Word, а переменная R всего лишь Byte, в которой этот Word Вы пытаетесь делить. Та же история происходит в операциях с массивом Razdisp. Разумеется, будут чудеса если значение больше 255, оно же превышает значение типа Byte.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 442
Зарегистрирован: Пт авг 29, 2008 09:22:37

Сообщение dimon-790 »

Согласен с переменными бардак , давно не баскомил позабывал многое , спасибо edm2007 . Дальше я уже сам .
Все мы работаем по методу Робинзона Крузо – ждем пятницу.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Да это всего лишь с типами переменных немного ошибка. Ерунда совсем. Конечно R не может нормально разделить переменную, она просто не в состоянии вместить тип Word. Та же история с Razdisp(..). А в остальном все верно.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Грызет канифоль
Аватара пользователя
Сообщения: 268
Зарегистрирован: Чт май 17, 2007 09:44:13
Откуда: Украина, г. Кривой Рог

Сообщение pavel123 »

Если уже было, извините... :)
Вот еще сайт с обучалками и примерами.
Может кому пригодится.
http://avr.ru/beginer/bascom
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Подскажите пожалуйста как отключить опрос датчиков на шине I2C если они отсутствуют? Потому как если я отключу от МК датчик температуры то схема останавливается полностью.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

vanyap1 писал(а):Потому как если я отключу от МК датчик температуры то схема останавливается полностью.
Это с чего вдруг?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Электрический кот
Сообщения: 1048
Зарегистрирован: Пт июл 30, 2010 11:49:03
Откуда: Украина

Сообщение vanyap1 »

Схема работает стабильно, все в полном порядке, но если отключить датчик температуры или часы и не убрать опрос с программы то вся схема становится нерабочей. Все датчики и часы находятся на одной шине I2C, МК - Atmega8.
Можно как то установить флаг отсутствия устройства при первом опросе и не опрашивать последующий раз?
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Если не был получен импульс присутствия, то Err возвращает 1.

Код: Выделить всё

1wreset                                                     ' сбрасываем линию

If Err = 1 Then                                             ' если датчик не отозвался...
........
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Ответить

Вернуться в «AVR»