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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
max50
Мучитель микросхем
Сообщения: 497
Зарегистрирован: Ср дек 10, 2008 21:24:28
Откуда: Алтайский край, Барнаул

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

Сообщение max50 »

Посмотри здесь.
Того, кто не задумывается о далеких трудностях, ожидают близкие неприятности.
Реклама
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

mr4ester писал(а):можно небольшой пример? если бы не примеры я бы даже не написал и эту программу.
Да Вы её и не написали! А собрали по кускам, не вникая в принцип работы.

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

Do
         Gosub Ds1307                                       'уходим на выполнение подпрограммы чтобы узнать время и дату
         Gosub Ds18b20
         Gosub Displey                                      'выполняем подпрограмму вывода на дисплей
Loop
Ну чё-это за бред?
Тот-же датчик температуры- упорно все пихают кусок кода для семисегментного индикатора, хотя для LCD код намного проще. Изучите даташиты. Смените алгоритм программы. У Вас индикация не выходит пока, не отработает обмен с переферией.
mr4ester писал(а):может вам с более большим опытом что то придет в голову?
Опыт приходит с изучением.
К примеруhttp://avrproject.ru/publ/kak_podkljuch ... 7/2-1-0-11
Не принимайте близко к сердцу! С праздником!
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

kip96 вместо того чтоб так критиковать лучше бы помогли или подсказали, я и не отрицаю что я его по кускам собрал, и на программиста я никогда не учился, баском и вообще программирование изучаю всего 1.5 месяца, а программу надо написать, и считаю вашу критику необоснованной т.к если бы я все знал то и не просил бы помощи!, и опыт не всегда приходит с изучением, сколько не учи только только с опытом начинаешь понимать что лучше в том или ином месте применить для оптимальной работы. А max50 отдельное спасибо!
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

Да, не обижайтесь, ради Бога!
Вы же сами просите:
ожно небольшой пример? если бы не примеры я бы даже не написал и эту программу
что-бы наверняка вставить очередной

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

Gosub пример
За критикой Вы не заметили и подсказку-Вы опрашиваете 1307-это время,1820-это время(у Вас там даже задержка 700 мС стоит)
после этого только на индикатор выводите
потом я Вам ссылку дал на такой-же проект
А программы начинают писать с составления алгоритма и блок-схем
Изображение
и тогда будет всё наглядней
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

спасибо за разъяснение, я понимал что у меня есть такая задержка, но придумать как сделать по другому за неимением опыта так и не придумал, и решил отписаться на форуме
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Реклама
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

вот описание (действительно на русском)http://piclist.ru/D-DS-DS1307-RUS/D-DS-DS1307-RUS.html
Хороший совет был использовать SQW/OUT
читаем:
SQW/OUT (Square Wave/Output Driver - сигнал с прямоугольными импульсами) - когда включен, т.е. бит SQWE установлен в 1, вывод SQW/OUT выдаёт прямоугольные импульсы с одной из четырёх частот (1 Гц, 4 кГц, 8 кГц, 32 кГц). Вывод SQW/OUT - с открытым стоком и требует внешнего подтягивающего резистора. SQW/OUT будет работать как при питании от VCC, так и при питании от VBAT.
Вешаем на него прерывание , и по прерыванию опрашиваем 1307 и выводим на дисплей.
Или\и
1820 нет необходимости опрашивать часто, даже вредно(говорят на точность влияет), Потом, сначала даёте команду 1820 на измерение,ждёте 700 мс , считываете. А сделайте так, что в первую сек. меряем, а во вторую считываете. Это как вариант, что в голову пришло.
Скорее всего Вам не совсем понятно, но прочитав даташит всё станет ясно.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

то есть если я правильно понял вывод SQW/OUT вешаем к примеру на внешнее прерывание к примеру INR0 и по каждому прерыванию опрашиваем 1307 и 18b20 и выводим на дисплей?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 486
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

mr4ester писал(а):то есть если я правильно понял вывод SQW/OUT вешаем к примеру на внешнее прерывание к примеру INR0 и по каждому прерыванию опрашиваем 1307 и 18b20 и выводим на дисплей?
Я сделал так:

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

'включаем 1 гц с выхода SQW/OUT
I2cstart
I2cwbyte Ds1307w
I2cwbyte 7
I2cwbyte &B00010000
I2cstop

'включаем прерывание int0
Config Int0 = Falling
On Int0 Startds

Enable Interrupts
Enable Int0

'основной цикл

Do

If Seco = 0 Then Gosub Hod ' тут проверка на 0 секунд для выполнения хитрых функций

Loop

startds:
'опрашиваем ds1307
        I2cstart
        I2cwbyte Ds1307w
        I2cwbyte &H00
        I2cstart
        I2cwbyte Ds1307r
        I2crbyte Seco , Ack
        I2crbyte Mine , Ack
        I2crbyte Hour , Nack
        I2cstop

Hour = Hour And &B00011111 'у меня 12-часовой формат, поэтому убираем лишнее

        Seco = Makedec(seco)
        Mine = Makedec(mine)
        Hour = Makedec(hour)

'выводим на дисплей
Cls

Ho = Str(hour)
Mi = Str(mine)
Ss = Str(seco)

Ho = Format(ho , "00")
Mi = Format(mi , "00")
Ss = Format(ss , "00")

Locate 1 , 5
Lcd Ho ; ":" ; Mi ; ":" ; Ss

Return
С уважением,
Алексей.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

mr4ester писал(а): каждому прерыванию опрашиваем 1307 и 18b20 и выводим на дисплей?
Не надо только 1820 в прерывании опрашивать. А то выйдет то=же самое что и в первый раз, а то и хуже! Я же говорил - слишком много времени. К тому-же у Вас думаю не АЭС, что-бы каждую секунду температуру контролировать :)) Вот по примеру Gordon Shumway:

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

Do

If Seco = 0 Then Gosub Hod ' тут проверка на 0 секунд для выполнения хитрых функций

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

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

If Seco = 0 and Флаг=0 Then Gosub Hod
Логика понятна?
Ато и каждые пять минут, если датчик для бытовых нужд.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

спасибо!! вообщем то понятно, попробую собрать программу воедино, и выложу на ваш СУД :)
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 486
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

kip96 писал(а): Только я думаю, что бы не обрабатывалась 1820 больше одного раза в минуту нужно ввести флаг.По прерыванию его сбрасывать, а в подпрограмме Hod его выставлять. А команду подправить так:

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

If Seco = 0 and Флаг=0 Then Gosub Hod
Логика понятна?
Ато и каждые пять минут, если датчик для бытовых нужд.
А зачем флаг ? Ведь 0 секунд бывает только раз в минуту, так что только раз в минуту и опросит.

Я, когда делал проект "мегатермо", сделал опрос датчиков раз в минуту по таймерному прерыванию (timer1, тактовая частота микроконтроллера 1 мгц, чуть больше минуты выходит).
Но там стоял вопрос сохранения батарейки...
С уважением,
Алексей.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

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

Сообщение kip96 »

Не путайте! Прерывание бывает один раз! Т.е. Вы находитесь в основном цикле, бац -прерывание по таймеру- отработали и вернулись в основной цикл.
А в Вашем примере проверка секунды на 0 находится в основном цикле. А нуль (чем дальше от Москвы, тем больше ноль :)) ) бывает аж 1000 мС , и даже 1000000 uC! И вот Seco = 0, уходим на Hod, через 900мС возвращаемся и Seco до сих пор равно 0! опять уходим на Hod, только начинаем общаться с 1820 , как бац нам по голове прерывание и вместо "художник" слышим "худо" :))
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Аватара пользователя
Gordon Shumway
Мучитель микросхем
Сообщения: 486
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область
Контактная информация:

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

Сообщение Gordon Shumway »

kip96 писал(а):Не путайте! Прерывание бывает один раз! Т.е. Вы находитесь в основном цикле, бац -прерывание по таймеру- отработали и вернулись в основной цикл.
А в Вашем примере проверка секунды на 0 находится в основном цикле. А нуль (чем дальше от Москвы, тем больше ноль :)) ) бывает аж 1000 мС , и даже 1000000 uC! И вот Seco = 0, уходим на Hod, через 900мС возвращаемся и Seco до сих пор равно 0! опять уходим на Hod, только начинаем общаться с 1820 , как бац нам по голове прерывание и вместо "художник" слышим "худо" :))
Доходчиво ! :) Я об этом не подумал, потому что подпрограмма "hod" у меня выполняется пол-секунды, а прерывание сделано по спаду импульса от SQW/OUT, получается еще задержка на пол-секунды. Так что я такую проблему не смог предугадать. :)
С уважением,
Алексей.
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

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

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

Сообщение vanyap1 »

в основном цикле перекидывает метки на опрос часов, вывод на ЖКИ, проверка будильника, настройка ШИМ, проверка одной кнопки - которая для входа в меню настройки часов.
Задержку в коде термометра убрал, ибо после чтения датчика первый раз то дает результат - 85 градусов.
Я сделал опрос температуры раз в минуту, и нормально.
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

вообщем я извиняюсь за мой предыдущий флуд и потраченные нервы, я решил сделать просто 2х канальный термометр с регистрацией максимальных и минимальных значений температур, и каждые 10 мин выдача текущей температуры и макс и мин результата в сом порт. И возник вопрос как лучше отсчитывать эти десять минут хотелось бы спросить вашего мнение о моей идее, конфигурируем таймер 1 на прерывание по переполнению по моим подсчетам при делителе 1024 и кварце 4 мгц он будет переполняться каждые 16 сек, в прерывании увеличиваем переменную на 1 и сравниваем с другой переменной в которое положено число 37 это количество прерываний в суме дающих 10 мин если сравнялось выдаем данные в порт обнуляем переменную счетчик и выходим из прерывания. Правильно я мыслю или это можно как нибудь по другому сделать?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

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

Сообщение edm2007 »

Подсчитывать количество переполнений таймера - это вполне нормальный ход. Только зачем сравнивать с переменной, в которую положено число 37? Можно просто с числом сравнивать. :)
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

вот составил схему программы как советовал kip96, хотелось бы услышать ваше мнение, нужно внести ли какие то изменения?
Изображение
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

возник такой вопрос можно ли так делать

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

tmin1 = Znakd2 ; Hhd2 ; "." ; Mmd2
tmin переменная типа string или integer, Znakd2 здесь знак (+) или ( - ) , Hhd2 и Mmd2 числа, "." точка разделительная ?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Аватара пользователя
mr4ester
Держит паяльник хвостом
Сообщения: 900
Зарегистрирован: Чт авг 27, 2009 20:09:01
Откуда: Приднестровье г.Бендеры
Контактная информация:

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

Сообщение mr4ester »

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

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

Ini:

W = 1wirecount()                                            ' ищем датчики
Dath1 = 1wsearchfirst()                                     ' считываем код первого датчика
Dath2 = 1wsearchnext()                                      ' считываем код 2 датчика

 1wreset
   1wwrite &HCC
   1wwrite &H44
   Waitms 901

 1wreset
   1wwrite &H55
   1wverify Dath1                                           'указываем адрес 1 датчика
   1wwrite &HBE

Byte0d1 = 1wread()                                          ' Читаем нулевой байт
Byte1d1 = 1wread()                                          ' Читаем первый байт
End If
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0d1 = &HFF - Byte0
Byte1d1 = &HFF - Byte1

Znakd1 = "-"
Else
Znakd1 = "+"
End If

T1d1 = Byte0d1 / 16                                         ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2d1 = Byte1d1 * 16                                         ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1d1 = T1d1 + T2d1
Hhd1 = Fix(t1d1)                                            'отсекаем от температуры все после запятой
Ttempd1 = T1 * 10                                           '
Mmd1 = Ttempd1 Mod 10                                   ' берем десятую часть температуры
и не могу двинуться дальше так как хочу ввести такое

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

1wreset

If Err = 1 Then                                             'если при опросе появился флаг ошибки делаем что то
но как мне сделать так чтоб было понятно какой датчик при опросе не отозвался чтоб установить флаг ошибки для того датчика?
Работа избавляет нас от трех великих зол: скуки, порока, нужды. (Вольтер)
Ответить

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