Страница 86 из 304
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт июн 02, 2011 21:35:20
Gordon Shumway
edm2007 писал(а):Gordon Shumway писал(а):Вот при таком раскладе при нажатии на кнопку выводится всякая чушь
Здравствуйте, Алексей. А что значит "чушь"? Вообще на экране или именно со значениями?
Если не нажимать на кнопку, то все ок. Если нажали на кнопку - сначала выводится картинка (видно), а потом на экран вылезают
цифры, кавычки и прочи мусор. Он висит пять секунд, потом возвращается нормальный вид - основной экран с показаниями температуры.
Вывод картинок отключал - без изменений... Завтра смогу весь код выложить и фотки того, что получается.
Если убрать прерывания и сделать if pinX.X=0 then
то глюка не наблюдается.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Чт июн 02, 2011 21:37:31
edm2007
Gordon Shumway писал(а):Завтра смогу весь код выложить и фотки того, что получается.
Вот это будет замечательно.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 10:40:50
Gordon Shumway
edm2007 писал(а):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
Config 1wire = Portb.7
Dim A 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 Single , 1tmin As Single
Dim 2tmax As Single , 2tmin As Single
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
Enable Interrupts
Enable Int0
'конфигурируем 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
Do
'If Pind.2 = 0 Then Gosub Maxmin
1wreset
1wwrite &HCC ' Выдаем команду чтения ПЗУ
1wwrite &H44 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE ' Команда чтения ОЗУ датчика
Byte0 = 1wread() ' Читаем нулевой байт
Byte1 = 1wread()
Waitms 750
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5 ' Выдаем команду чтения ПЗУ
1wwrite &H44 , 1 , Pinc , 5 ' Запуск измерения
Waitms 750 ' Ждем окончания преобразования
1wreset Pinc , 5
1wwrite &HCC , 1 , Pinc , 5
1wwrite &HBE , 1 , Pinc , 5 ' Команда чтения ОЗУ датчика
Byte2 = 1wread(1 , Pinc , 5) ' Читаем нулевой байт
Byte3 = 1wread(1 , Pinc , 5) ' Читаем первый байт
If Byte1 > 248 Then ' Проверка на отрицательность температуры
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Else
1sign = "+"
End If
T1 = Byte0 / 16 ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T2 = Byte1 * 16 ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
T1 = T1 + T2
If Byte1 > 248 Then
T1 = T1 + 1
T1 = T1 * -1
1sign = ""
End If
If 1sign = "+" And T1 = 0 Then ' убираем знак "+" с нулевой температуры
1sign = " "
End If
If A = 0 Then
1tmax = T1
1tmin = T1
End If
If T1 > 1tmax Then 1tmax = T1
If T1 < 1tmin Then 1tmin = T1
If 1tmax > 0 Then 1signmax = "+"
If 1tmax <= 0 Then 1signmax = ""
If 1tmin > 0 Then 1signmin = "+"
If 1tmin <= 0 Then 1signmin = ""
1temper = Fusing(t1 , "#.#")
1temper = 1sign + 1temper
1temper = 1temper + "_C"
1tempermax = Fusing(1tmax , "#.#")
1tempermax = 1signmax + 1tempermax
1tempermax = 1tempermax + "_C"
1tempermin = Fusing(1tmin , "#.#")
1tempermin = 1signmin + 1tempermin
1tempermin = 1tempermin + "_C"
'расчет показаний второго датчика
If Byte3 > 248 Then ' Проверка на отрицательность температуры
Byte2 = &HFF - Byte0
Byte3 = &HFF - Byte1
Else
2sign = "+"
End If
T3 = Byte2 / 16
T4 = Byte3 * 16
T3 = T3 + T4
If Byte3 > 248 Then
T3 = T3 + 1
T3 = T3 * -1
2sign = ""
End If
If 2sign = "+" And T3 = 0 Then ' убираем знак "+" с нулевой температуры
2sign = " "
End If
If A = 0 Then
2tmax = T3
2tmin = T3
A = 1
End If
If T3 > 2tmax Then 2tmax = T3
If T3 < 2tmin Then 2tmin = T3
If 2tmax > 0 Then 2signmax = "+"
If 2tmax <= 0 Then 2signmax = ""
If 2tmin > 0 Then 2signmin = "+"
If 2tmin <= 0 Then 2signmin = ""
2temper = Fusing(t3 , "#.#")
2temper = 2sign + 2temper
2temper = 2temper + "_C"
2tempermax = Fusing(2tmax , "#.#")
2tempermax = 2signmax + 2tempermax
2tempermax = 2tempermax + "_C"
2tempermin = Fusing(2tmin , "#.#")
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
Return
$include "3310end.bas"
$include "bmp1.bas"
$include "bmp2.bas"
Основной Экран:
- 1.jpg
- (72.94 КБ) 1144 скачивания
Жмем кнопку:
- 2.jpg
- (76.88 КБ) 1350 скачиваний
Через пять сек. возврат в основной экран. Там все нормально.
Если убрать прерывания:
- 3.jpg
- (78.86 КБ) 1617 скачиваний
Я использовал подправленный файл 3310end.bas из библиотеки - закомментировал все неиспользуемые символы и буквы, иначе в мегу8 не помещается.
Похоже с чушью я справился - убрал лишние инициализации дисплея.
Теперь просто не выводятся значения максимумов и минимумов. Если убратьпрерывания - выводятся нормально.
Вот такая закрутка...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:00:45
AVRDaemon
А LCD графический от чего? можно узнать?
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:05:44
Gordon Shumway
AVRDaemon писал(а):А LCD графический от чего? можно узнать?
От мобильника nokia3310. Нашел по 55 рублей, грех не использовать.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:21:22
edm2007
Получается что разница только в том, что по gosub он уходит четко в начале, а прерывание может прервать выполнение где угодно... Только где оно мешает...

Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:26:24
Gordon Shumway
edm2007 писал(а):Получается что разница только в том, что по gosub он уходит четко в начале, а прерывание может прервать выполнение где угодно... Только где оно мешает...

Как выяснилось, вариант без прерывания тоже глючит - иногда вместо картинки чушь все-таки вылезает. Символы всякие на весь экран, частично портится картинка и т.д.
Сейчас убрал все кнопки, сделал автоперемену через 3 секунды - все выводится отлично....
И куда ж копать ?....

Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:32:26
edm2007
Вы можете еще скинуть bmp1 и bmp2, хоть в протеусе накидаю...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:41:46
kip96
При беглом просмотре (может где и не заметил):
Прерывание может нарушить вообще процес общения с 1wire, по-этому при обращении к датчикам, лучше отключать прерывание. Далее в прерывании выводите на экран
Код: Выделить всё
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
А если на кнопку нажали в момент выполнения какой-либо строчки?
Код: Выделить всё
2temper = Fusing(t3 , "#.#")
2temper = 2sign + 2temper
2temper = 2temper + "_C"
2tempermax = Fusing(2tmax , "#.#")
2tempermax = 2signmax + 2tempermax
2tempermax = 2tempermax + "_C"
2tempermin = Fusing(2tmin , "#.#")
2tempermin = 2signmin + 2tempermin
2tempermin = 2tempermin + "_C"
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:46:03
edm2007
kip96 писал(а):по-этому при обращении к датчикам, лучше отключать прерывание.
Это само собой, мешать обмену вообще ничего не должно. Но Алексей вроде говорил что отключал прерывания... А вот про второе это да, тоже об этом подумал когда речь шла про то, что по gosub все работает... Но сейчас выясняется что и так тоже плохо.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:53:20
kip96
отключаем прерывание, выводим на экран, включаем.
При опросе датчиков, вместо Waitms 750 воспользуйтесь Bitwait Portb.7 , Set ( датчики то, на разных портах). Преобразование происходит быстрей, чем 750 милисекунд.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 13:58:56
kip96
edm2007 писал(а):Но Алексей вроде говорил что отключал прерывания...
Чего-та в коде я не увидел.
edm2007 писал(а):хоть в протеусе накидаю...
Не плохо-бы было

( я подожду

)
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 14:01:23
edm2007
Точнее так: "говорил что пробовал отключать".

Для протеуса файлов картинок не хватает...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 14:17:51
Gordon Shumway
edm2007 писал(а):Точнее так: "говорил что пробовал отключать".
Пробовал. Сейчас я вообще сделал так:
do
disable int0
disable interrupts
программа
вывод на экран
enable interrupts
enable int0
wait 1
loop
То есть включаю прерывания только на 1 секунду, пока wait 1 идет.
Такая же ерунда поолучается...
kip96, спасибо, сейчас попробую.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 14:21:47
Gordon Shumway
edm2007 писал(а):Вы можете еще скинуть bmp1 и bmp2, хоть в протеусе накидаю...
Вот они. Я их немного перерисовал. Покрасивее стало.
Спасибо, edm2007 !
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 15:14:16
edm2007
Минут 5 понять не мог, почему он при компиляции ругается. Пока bmp1 и bmp2 не открыл. Там в заголовках-то 11 и 22. Вы-то в коде поправили наверняка.

Теперь по делу: нарисовал в протеусе, и в обычном режиме все работает, но только почему-то при уходе в отрицательную температуру картинка бьется и что-то типа -4096 С. Вы не проверяли в холодильнике? И при нажатии на кнопку да, иногда мусор а иногда просто тишина...
Комментарий к файлу: Перезалил! Там была ошибка с метками.
Ага. А я только сейчас увидел. Ну да там поправить не проблема была.
Вот проект для 7.7. Если нужна модель дисплея то скину. А то в протеусе нет 3310...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 15:33:39
Gordon Shumway
edm2007 писал(а): Теперь по делу: нарисовал в протеусе, и в обычном режиме все работает, но только почему-то при уходе в отрицательную температуру картинка бьется и что-то типа -4096 С. Вы не проверяли в холодильнике? И при нажатии на кнопку да, иногда мусор а иногда просто тишина...
Вот проект для 7.7. Если нужна модель дисплея то скину. А то в протеусе нет 3310...
В выходные попробую (если моя мелкая позволит), в том числе и с холодильником, а то отрицательные температуры проверить было негде.
Про протеус - я пока с ним не работал, но, видимо, пора осваивать.
Спасибо за помощь !
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 15:50:59
edm2007
Да пока не за что.
Если что, то вот
Proteus Professional 7.7 SP2
А это
Модель дисплея NOKIA3310. Ее в Proteus нет. Надо из папок архива скопировать в соответствующие папки Proteus.
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 17:24:31
edm2007
Да, забыл совсем, при gosub действительно переходит и отображает нормально. Только на "домашнем" термометре при уходе в минус все нормально, а вот на "уличном" как только 0С и ниже, тут же бъется картинка с непонятными показаниями в итоге.
То бишь бьется только УЛИЧНЫЙ термометр, и именно он (по крайней мере в протеусе) разносит картинку и показания в хлам. А ДОМАШНИЙ отображает отрицательную нормально. Только знак "-" надо добавить.... Алексей, а почему Вы не посадили на один пин оба датчика? Так же проще...
Re: BASCOM AVR в вопросах и ответах
Добавлено: Пт июн 03, 2011 17:47:33
AVRDaemon
Привет еще раз)
хочу сваять время в пути для бортовика, таймер1 занят тахометром, таймер0 свободен, можно ли на нем сделать время в пути?