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

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

Сообщение edm2007 »

Алексей, у меня вопрос, разбирая расчет на отрицательную температуру увидел следующее:

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

If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
а следом

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

If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
Так если Byte1 был больше 248 и отнялся от FF в первом случае, то как он может потом проверяться?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

AVRDaemon писал(а):можно ли на нем сделать время в пути?
Так это Вам виднее. Никто же не подозревает как Вы сохранять время собрались. Мне бы и 20 часов пути за один раз мало было...

А вообще, это же таймер, считайте что хотите, в чем проблема-то?
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

Таймер0 походу 8-битный, и без дополнительных примочек заставить его считать реальное время будет проблематично ;)
Даже остановленные часы два раза в сутки показывают правильное время.
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

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

edm2007 писал(а):Да, забыл совсем, при gosub действительно переходит и отображает нормально. Только на "домашнем" термометре при уходе в минус все нормально, а вот на "уличном" как только 0С и ниже, тут же бъется картинка с непонятными показаниями в итоге.

То бишь бьется только УЛИЧНЫЙ термометр, и именно он (по крайней мере в протеусе) разносит картинку и показания в хлам. А ДОМАШНИЙ отображает отрицательную нормально. Только знак "-" надо добавить.... Алексей, а почему Вы не посадили на один пин оба датчика? Так же проще...
Ну, у меня на минус проверить пока негде было, завтра с холодильником буду экспериментировать - взял домой плату с программатором.
А по поводу двух датчиков на один пин - пока не разобрался как это сделать.

edm2007 писал(а):Алексей, у меня вопрос, разбирая расчет на отрицательную температуру увидел следующее:

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

If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
а следом

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

If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
Так если Byte1 был больше 248 и отнялся от FF в первом случае, то как он может потом проверяться?
Точно, тут я накосячил. А T1=T1*-1 - этим я хотел вывести отрицательную температуру.
С уважением,
Алексей.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Gordon Shumway писал(а):А по поводу двух датчиков на один пин - пока не разобрался как это сделать.
А всё просто!

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

Term:
Dsid1(1) = 1wsearchfirst()           -определяем номера датчиков
Dsid2(1) = 1wsearchnext()



Do
   1wreset                                    -запускаем датчики на измерение
   1wwrite &HCC
   1wwrite &H44
Waitms 750
'---------------------------------
   1wreset                                    -теперь поочереди считываем из памяти каждого датчика
   1wwrite &H55
   1wverify Dsid1(1)
   1wwrite &HBE
   I1 = 1wread(2)
'---------------------------------
   1wreset
   1wwrite &H55
   1wverify Dsid2(1)
   1wwrite &HBE
   I2 = 1wread(2)
'****
Cls
   Gosub Shot
   Locate 1 , 1
   Lcd Chr(1) ; Text ; Chr(3)

  I1 = I2
  Gosub Shot
   Lowerline
   Lcd Chr(0) ; Text ; Chr(3)
Loop
Shot:
 I1 = I1 * 10
   I1 = I1 \ 16
   Text = Str(i1)
  Text = Format(text , " 0.0")
  Return
только из-за того, что номера датчиков нужно хранить в памяти, много жрёт :))
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Вот подправил, в плане измерения температуры. Хочу обратить внимание на уменьшение исп. памяти. Остальное по анологии.
Вложения
Gordon3310.rar
(62.58 КБ) 215 скачиваний
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

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

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

Сообщение edm2007 »

В протеусе что-то даже картинка вторая не выводится. По крайней мере у меня. Экран очищается что-то и все. И вообще МК ошибками обвешивается. Странно все это... Как раз при нажатии кнопки ругается. В стеке дело, похоже...

Да, и при отрицательной температуре показания теперь правильные, а картинка все равно бъется. Алексей, Вы не проверяли в железе отрицательную?

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

Сообщение edm2007 »

И что интересно, если в прерывании кнопки не сохранять все регистры (On Int0 Maxmin Nosave) то кнопка работает и картинка выводится... Только показания 0. А картинка бъется только при уходе ниже -9.
Последний раз редактировалось edm2007 Сб июн 04, 2011 13:07:22, всего редактировалось 1 раз.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Да, я изменил только измерение температуры, и всё.
У меня протеус 7.6. Картинка выводится медленно, может протеус, а может комп :)) . Но видно чётко, что картинку бьёт именно сама строка температуры. При -10 она становится длинее и переходит на другой ряд, что и бьёт строку. Вообщем с этим тоже реально побороться, способов много. С остальным пока :dont_know:
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

Попробуйте ради интереса

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

On Int0 Maxmin Nosave
Только сброс флага добавьте при выходе из прерывания (GIFR=64). Так хоть прерывание работает и протеус не ругает. Пошагово посмотрел, это в максимум/минимум при расчете пишутся 0. Вот он их и выводит. Надо поглядеть почему так.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск

Сообщение edm2007 »

edm2007 писал(а):Пошагово посмотрел, это в максимум/минимум при расчете пишутся 0. Вот он их и выводит. Надо поглядеть почему так.
А, все верно. Там расчет минимума/максимума от старого кода остался, а в новом изменились переменные температур (1temper, 2temper). Вот и нули.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

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

kip96 писал(а):Вот подправил, в плане измерения температуры. Хочу обратить внимание на уменьшение исп. памяти. Остальное по анологии.
Ваш код работает, температуры выводятся корректно, в том числе отрицательные (эксперимент с холодильником прошел успешно), только я не понял, где, собственно, отрицательное число получается ? Я в своем примере умножал на -1, а у вас я ни вижу ничего похожего. Откуда берется отрицательное число ?

Мой код не прошел холодильника - домашний некорректно показывал знак, а уличный показал -4096 градусов ! Старику Кельвину такое не снилось ! :shock:
edm2007 писал(а):Попробуйте ради интереса

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

On Int0 Maxmin Nosave
Только сброс флага добавьте при выходе из прерывания (GIFR=64). Так хоть прерывание работает и протеус не ругает. Пошагово посмотрел, это в максимум/минимум при расчете пишутся 0. Вот он их и выводит. Надо поглядеть почему так.
Похоже это работает, выводятся нулевые максимум и минимум, но это надо с переменными разбираться. Экраны не портятся.

Только я теперь не понимаю, откуда минус берется, то есть как отрицательные числа получились.

Завтра буду пытаться "причесать" код.

Спасибо вам ! Похоже вы это сделали !!!!!!!!!!!!!
С уважением,
Алексей.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2106
Зарегистрирован: Ср сен 17, 2008 14:32:15
Откуда: Старые Васюки

Сообщение Секретный кот »

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

Сообщение edm2007 »

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

Сообщение edm2007 »

Gordon Shumway, а чтобы было совсем хорошо, можно посмотреть в дизассемблере какие регистры использует прерывание, и сохранить только их. Ну и статусный регистр SREG. Попробовал, все работает. А на душе спокойнее. :)

Дизассемблер можно завести прямо в протеусе, загрузив OBJ, далее ШАГ, а затем правой кнопкой по исходному коду - Дизассемблер. Тут-то все и видно. :) Потом нужные регистры ассемблерной вставкой поместить в стек, а при выходе извлечь...
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Gordon Shumway писал(а):только я не понял, где, собственно, отрицательное число получается ?
Так сам датчик его и даёт!. У меня ведь:

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

Dim D1 As Integer , D2 As Integer
Разбивать число на байты выгодно только когда работаешь с "семисегментниками".
А Когда работаешь с строкой, то чё парится! Баском сильно облегчает в этом плане.
Ошибка большинства, в том, выкинут в сеть какой либо код, и пихают его все , куда не лень! Сам такой-же :)) , и код тоже ни я придумал, а содрал от куда-то.
Кстати, тот-же код:

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

If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
лучше и короче получится:

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

If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 =not Byte0
Byte1 =not Byte1
подумайте сами, в первом случае баскому нужно проводить вычисления, во втором просто инвертировать, или байт0 все сдвигают делением на 16 :shock: , а для контролера проще сдвинуть шифтом. Еслиб, контроллер мог материться, много-бы мы о себе узнали :)) :)) :))
Я присмотрел код, можно уменьшить до 50% памяти, так-то проект можно развить, добавить часы(RTC), датчики там разные, короче сделать не плохую метеостанцию, или терморегулятор для тёплых полов. Я думаю себе что-нибудь сделаю. Но с индикатором 3301 не работал :cry: . Как Вы картинки рисуете?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Мучитель микросхем
Аватара пользователя
Сообщения: 485
Зарегистрирован: Пн авг 20, 2007 21:35:45
Откуда: Мытищи, Московская область

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

Вот, работает ! Вроде разобрался !
Но появился еще один непонятный глюк - значения максимума и минимума почему-то иногда сбрасываются на текущие значения... Особенно это заметно с датчиком, который в холодильник клал. Смотришь за температурой, падает, жмешь кнопку - а там максимум текущая температура...
$regfile = "m8def.dat"
$crystal = 1000000

$hwstack = 32
$swstack = 8
$framesize = 100

Config Portd.4 = Output
Portd.4 = 0

Config Portb.0 = Output 'D/C (pin 4)
D3310dc Alias Portb.0

Config Portd.3 = Output 'SCE (pin 5)
D3310ce Alias Portd.3

Config Portd.6 = Output 'Reset (pin 8 )
D3310re Alias Portd.6

'Config Pind.2 = Input

Config Int0 = Falling
On Int0 Maxmin Nosave

Config 1wire = Portb.7

Dim A As Bit
Dim B As Bit
Dim Byte0 As Byte , Byte1 As Byte 'читать датчики
Dim Byte2 As Byte , Byte3 As Byte

'Dim T1 As Single , T2 As Single
'Dim T3 As Single , T4 As Single

Dim 1sign As String * 1
Dim 1signmax As String * 1
Dim 1signmin As String * 1

Dim 2sign As String * 1
Dim 2signmax As String * 1
Dim 2signmin As String * 1

Dim 1tmax As Integer , 1tmin As Integer
Dim 2tmax As Integer , 2tmin As Integer

Dim 1temper As String * 7

Dim 1tempermax As String * 10
Dim 1tempermin As String * 10

Dim 2temper As String * 7
Dim 2tempermax As String * 10
Dim 2tempermin As String * 10

Dim D1 As Integer , D2 As Integer



'конфигурируем SPI в программном режиме. SCLK (pin 2) - PORTD.0; SDA (pin 3) - PORTD.1;
Config Spi = Soft , Din = Portb.1 , Dout = Portd.1 , Ss = None , Clock = Portd.0

'Initialise Spi
Spiinit

$include "3310init.bas"

'Initialise the display
Call D3310reset
Call D3310init
Call D3310clear

Restore Bmp1 'D3310Bmp1 is the label name for the first bmp
Call D3310bmpout

'A = 0
'B = 0

Do

Disable Int0
Disable Interrupts

1wreset

1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения

Bitwait Portb.7 , Set ' Ждем окончания преобразования

1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика


D1 = 1wread(2) '

Waitms 750

1wreset Pinc , 5

1wwrite &HCC , 1 , Pinc , 5 ' Выдаем команду чтения ПЗУ
1wwrite &H44 , 1 , Pinc , 5 ' Запуск измерения

Bitwait Pinc.5 , Set ' Ждем окончания преобразования
1wreset Pinc , 5

1wwrite &HCC , 1 , Pinc , 5
1wwrite &HBE , 1 , Pinc , 5 ' Команда чтения ОЗУ датчика
D2 = 1wread(2 , Pinc , 5) '

D1 = D1 * 10
D1 = D1 \ 16


1temper = Str(d1)
1temper = Format(1temper , "0.0")


D2 = D2 * 10
D2 = D2 \ 16
2temper = Str(d2)
2temper = Format(2temper , "0.0")

Enable Interrupts
Enable Int0


If A = 0 Then
1tmax = D1
1tmin = D1
A = 1
End If

If D1 > 0 Then
1sign = "+"
Else
1sign = ""
End If


If D1 > 1tmax Then 1tmax = D1
If D1 < 1tmin Then 1tmin = D1
If 1tmax > 0 Then 1signmax = "+"
If 1tmax <= 0 Then 1signmax = ""
If 1tmin > 0 Then 1signmin = "+"
If 1tmin <= 0 Then 1signmin = ""

1temper = 1sign + 1temper

If D1 < 100 And D1 > -100 Then
1temper = 1temper + "_C "
Else
1temper = 1temper + "_C"
End If


1tempermax = Str(1tmax)
1tempermax = Format(1tempermax , "0.0")
1tempermax = 1signmax + 1tempermax
1tempermax = 1tempermax + "_C"

1tempermin = Str(1tmin)
1tempermin = Format(1tempermin , "0.0")
1tempermin = 1signmin + 1tempermin
1tempermin = 1tempermin + "_C"

'расчет показаний второго датчика

If B = 0 Then
2tmax = D2
2tmin = D2
B = 1
End If

If D2 > 0 Then
2sign = "+"
Else
2sign = ""
End If

If D2 > 2tmax Then 2tmax = D2
If D2 < 2tmin Then 2tmin = D2
If 2tmax > 0 Then 2signmax = "+"
If 2tmax <= 0 Then 2signmax = ""
If 2tmin > 0 Then 2signmin = "+"
If 2tmin <= 0 Then 2signmin = ""

2temper = 2sign + 2temper

If D2 < 100 And D2 > -100 Then
2temper = 2temper + "_C "
Else
2temper = 2temper + "_C"
End If

2tempermax = Str(2tmax)
2tempermax = Format(2tempermax , "0.0")
2tempermax = 2signmax + 2tempermax
2tempermax = 2tempermax + "_C"

2tempermin = Str(2tmin)
2tempermin = Format(2tempermin , "0.0")
2tempermin = 2signmin + 2tempermin
2tempermin = 2tempermin + "_C"

Call D3310position(6 , 1)
Call D3310print(1temper)

Call D3310position(6 , 4)
Call D3310print(2temper)

Wait 1

Loop

End

Maxmin:

Call D3310clear

Restore Bmp2
Call D3310bmpout

Call D3310position(6 , 1)
Call D3310print(1tempermax)

Call D3310position(6 , 2)
Call D3310print(1tempermin)

Call D3310position(6 , 4)
Call D3310print(2tempermax )

Call D3310position(6 , 5)
Call D3310print(2tempermin)

Wait 5

Call D3310clear

Restore Bmp1
Call D3310bmpout
Gifr = 64
Return

$include "3310end.bas"
$include "bmp1.bas"
$include "bmp2.bas"
kip96 писал(а): Я присмотрел код, можно уменьшить до 50% памяти, так-то проект можно развить, добавить часы(RTC), датчики там разные, короче сделать не плохую метеостанцию, или терморегулятор для тёплых полов. Я думаю себе что-нибудь сделаю. Но с индикатором 3301 не работал :cry: . Как Вы картинки рисуете?
Программка FastlCD.exe. Ставим размер экрана 84х48 точек, рисуем или загружаем свой заранее подготовленный bmp черно-белый. Жмем кнопку BAS - получаем файл имя.bas. редактируем его - ставим Data в начале каждой строки.
Вложения
FastLCD.rar
(63.23 КБ) 214 скачиваний
С уважением,
Алексей.
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

О, спасибо! :beer:
Если хотите "+" показывать при положительной температуре - напишите так:

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

1temper = Format(1temper , "+0.0")
А остальные " если " уберите. Ещё код сократится!
Правда есть недостаток- при нулевой температуре тоже будет плюс. Тут можно оставить условие.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Сообщение kip96 »

Gordon Shumway писал(а):Но появился еще один непонятный глюк - значения максимума и минимума почему-то иногда сбрасываются на текущие значения...
Я правда не понял логику показывания минимума и максимума, но вот вставил в подпрограмму Maxmin:- А=0, В=0, и стало паказывать мин и макс, от последнего нажатия кнопки.
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Ответить

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