Страница 109 из 304

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

Добавлено: Пт янв 06, 2012 09:47:40
max50
Посмотри здесь.

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

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

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

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

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

Добавлено: Пт янв 06, 2012 14:55:59
mr4ester
kip96 вместо того чтоб так критиковать лучше бы помогли или подсказали, я и не отрицаю что я его по кускам собрал, и на программиста я никогда не учился, баском и вообще программирование изучаю всего 1.5 месяца, а программу надо написать, и считаю вашу критику необоснованной т.к если бы я все знал то и не просил бы помощи!, и опыт не всегда приходит с изучением, сколько не учи только только с опытом начинаешь понимать что лучше в том или ином месте применить для оптимальной работы. А max50 отдельное спасибо!

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

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

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

Gosub пример
За критикой Вы не заметили и подсказку-Вы опрашиваете 1307-это время,1820-это время(у Вас там даже задержка 700 мС стоит)
после этого только на индикатор выводите
потом я Вам ссылку дал на такой-же проект
А программы начинают писать с составления алгоритма и блок-схем
Изображение
и тогда будет всё наглядней

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

Добавлено: Пт янв 06, 2012 20:38:17
mr4ester
спасибо за разъяснение, я понимал что у меня есть такая задержка, но придумать как сделать по другому за неимением опыта так и не придумал, и решил отписаться на форуме

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

Добавлено: Пт янв 06, 2012 21:43:41
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 мс , считываете. А сделайте так, что в первую сек. меряем, а во вторую считываете. Это как вариант, что в голову пришло.
Скорее всего Вам не совсем понятно, но прочитав даташит всё станет ясно.

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

Добавлено: Сб янв 07, 2012 16:17:09
mr4ester
то есть если я правильно понял вывод SQW/OUT вешаем к примеру на внешнее прерывание к примеру INR0 и по каждому прерыванию опрашиваем 1307 и 18b20 и выводим на дисплей?

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

Добавлено: Сб янв 07, 2012 18:38:20
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

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

Добавлено: Вс янв 08, 2012 14:02:42
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
Логика понятна?
Ато и каждые пять минут, если датчик для бытовых нужд.

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

Добавлено: Вс янв 08, 2012 14:24:42
mr4ester
спасибо!! вообщем то понятно, попробую собрать программу воедино, и выложу на ваш СУД :)

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

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

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

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

Я, когда делал проект "мегатермо", сделал опрос датчиков раз в минуту по таймерному прерыванию (timer1, тактовая частота микроконтроллера 1 мгц, чуть больше минуты выходит).
Но там стоял вопрос сохранения батарейки...

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

Добавлено: Вс янв 08, 2012 21:39:33
kip96
Не путайте! Прерывание бывает один раз! Т.е. Вы находитесь в основном цикле, бац -прерывание по таймеру- отработали и вернулись в основной цикл.
А в Вашем примере проверка секунды на 0 находится в основном цикле. А нуль (чем дальше от Москвы, тем больше ноль :)) ) бывает аж 1000 мС , и даже 1000000 uC! И вот Seco = 0, уходим на Hod, через 900мС возвращаемся и Seco до сих пор равно 0! опять уходим на Hod, только начинаем общаться с 1820 , как бац нам по голове прерывание и вместо "художник" слышим "худо" :))

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

Добавлено: Вс янв 08, 2012 21:46:36
Gordon Shumway
kip96 писал(а):Не путайте! Прерывание бывает один раз! Т.е. Вы находитесь в основном цикле, бац -прерывание по таймеру- отработали и вернулись в основной цикл.
А в Вашем примере проверка секунды на 0 находится в основном цикле. А нуль (чем дальше от Москвы, тем больше ноль :)) ) бывает аж 1000 мС , и даже 1000000 uC! И вот Seco = 0, уходим на Hod, через 900мС возвращаемся и Seco до сих пор равно 0! опять уходим на Hod, только начинаем общаться с 1820 , как бац нам по голове прерывание и вместо "художник" слышим "худо" :))
Доходчиво ! :) Я об этом не подумал, потому что подпрограмма "hod" у меня выполняется пол-секунды, а прерывание сделано по спаду импульса от SQW/OUT, получается еще задержка на пол-секунды. Так что я такую проблему не смог предугадать. :)

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

Добавлено: Вт янв 10, 2012 09:40:01
mr4ester
возник такой вопрос, нет ли такой программы что то вроде терминала чтобы могла выводить данные,но к примеру каждые 30 сек. обновляла окно, чтоб можно было вывести к примеру значение температуры, и оно не шло одной длинной строчкой как в терминале?

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

Добавлено: Вт янв 10, 2012 10:30:52
vanyap1
в основном цикле перекидывает метки на опрос часов, вывод на ЖКИ, проверка будильника, настройка ШИМ, проверка одной кнопки - которая для входа в меню настройки часов.
Задержку в коде термометра убрал, ибо после чтения датчика первый раз то дает результат - 85 градусов.
Я сделал опрос температуры раз в минуту, и нормально.

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

Добавлено: Вт янв 10, 2012 16:07:19
mr4ester
вообщем я извиняюсь за мой предыдущий флуд и потраченные нервы, я решил сделать просто 2х канальный термометр с регистрацией максимальных и минимальных значений температур, и каждые 10 мин выдача текущей температуры и макс и мин результата в сом порт. И возник вопрос как лучше отсчитывать эти десять минут хотелось бы спросить вашего мнение о моей идее, конфигурируем таймер 1 на прерывание по переполнению по моим подсчетам при делителе 1024 и кварце 4 мгц он будет переполняться каждые 16 сек, в прерывании увеличиваем переменную на 1 и сравниваем с другой переменной в которое положено число 37 это количество прерываний в суме дающих 10 мин если сравнялось выдаем данные в порт обнуляем переменную счетчик и выходим из прерывания. Правильно я мыслю или это можно как нибудь по другому сделать?

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

Добавлено: Вт янв 10, 2012 17:20:20
edm2007
Подсчитывать количество переполнений таймера - это вполне нормальный ход. Только зачем сравнивать с переменной, в которую положено число 37? Можно просто с числом сравнивать. :)

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

Добавлено: Вт янв 10, 2012 19:47:33
mr4ester
вот составил схему программы как советовал kip96, хотелось бы услышать ваше мнение, нужно внести ли какие то изменения?
Изображение

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

Добавлено: Ср янв 11, 2012 14:24:30
mr4ester
возник такой вопрос можно ли так делать

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

tmin1 = Znakd2 ; Hhd2 ; "." ; Mmd2
tmin переменная типа string или integer, Znakd2 здесь знак (+) или ( - ) , Hhd2 и Mmd2 числа, "." точка разделительная ?

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

Добавлено: Ср янв 11, 2012 14:56:56
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                                             'если при опросе появился флаг ошибки делаем что то
но как мне сделать так чтоб было понятно какой датчик при опросе не отозвался чтоб установить флаг ошибки для того датчика?