Решил тут собрать термометр http://www.ivica-novakovic.from.hr/Nokia%20Lcd%20Termometar.htm а заодно по разбираться с microchip pic. Ну конечно оригинального дисплея от nokia 3310 у меня нет, а с китайским из "Профи" (55 руб - очень демократично) на экране оказался мусор. Решил все переписать, заодно увеличил размер цифр на экране и доточил для работы с 2 датчиками. Единственный минус - не писал опрос шины 1wire, а сунул адреса датчиков в eeprom - адреса 0x60 и 0x70. Также в eeprom находится шрифт.
Ну вобщем по исходникам довольно просто разобраться. Даже осталась свободная память в пике - можно еще что-либо реализовать. Правда свободна только одна нога и та голый вход, без АЦП...
В показаниях выносного датчика минус - т.к. я его воздухом из балона заморозил :)update:Из почты:
Т.к. я новичок, подскажите пожалуйста: PIC прошил (программа WinPic800),заработало - на эране 2 надписи "-0.00" переодически мигают. И все... А как прописывать слово конфигурации, какое вы написали на форуме? Я просто раньше заливал прошивку в pic и все, в atmele ставил еще фьюзы... А с pic у меня непонятки :-( Помогите разобраться пожалуйста.кроме прошивки нужно поменять адреса датчиков ds18b20 по адресам eeprom 0x60 и 0x70. Адреса можно прочитать с помощью какого либо адаптера 1wire - com. Я читал с помощью http://arv.radioliga.com/content/view/79/44/ и программы http://arv.radioliga.com/component/option,com_remository/Itemid,27/func,startdown/id,140/. по поводу фьюзов, я не пользовался WinPic800, но примерно вот так:
- intrc_osc_noclkout - для использования внутреннего генератора
- mclr_off - чтобы не делать обвязку резета
- pwrte_on - задержка на 72 us от включения питания, чтобы закончились переходные процессы
- wdt_off - поскольку надписи переодически мерцают - значит чип сбрасывается по watchdog, поэтому выключаем
В вашем случае достаточно выключить фьюз WDT и прошить в eeprom адреса датчиков
Спасибо за помощь новичку! Термометр заработал!!! Только вот беда - после включения работает мах минуты две и экран гаснет. Думал на контакт, так проверил и перепоял все раза четыре :-( И без результатно... Неподскажите в чем может быть дело?питание должно быть от 2.5 до 3.5 вольт - у меня 2 пальчиковые батарейки
экран может гаснуть если питание падает ниже 2.5 вольт, пропадает контакт на экран, а больше и предположить ничего не могу если у вас "китаец" у него контакты прижимаются прямо к стеклу - на фотографиях видно как я сделал - подложил кусочек текстолита и приклеил его термоклеем для прижима Удачи!!! Исходник:
'****************************************************************
'* Name : Nokia LCD Termometar *
'* Author : Novakovic Ivica *
'* Notice : Copyright (c) 2004 [Elektronika Kifo] *
'* : All Rights Reserved *
'* Date : 9.10.2004 *
'* Version : 1.0 *
'* Notes : Pic12F675 , Nokia3310 Lcd & DS18B20 *
'* e-mail : ivica.novakovic@vz.t-com.hr *
'* url : http://free-vz.t-com.hr/Ivica-Novakovic/ *
'****************************************************************
@device = pic12F675,INT_OSC0,WDT_ON,PWRT_ON, BOD_ON,WRT_OFF,PROTECT_OFF
D_C var GPIO.0
rst var GPIO.1
DQ var GPIO.2
SDIN var GPIO.4
SCK var GPIO.5
temperature Var Word
TempHigh var temperature.highbyte
TempH var byte
Stat VAR BIT
TempL var byte
Bitovi var byte
Predznak var Bitovi.0
Minus var Byte
LcdReg var byte
x var byte
y var byte
t var byte
e var byte
z var byte
Offset var byte
Char var byte
a var byte
addr var byte[8]
'-------------------------------------------------------------------------------
CMCON = 7
ANSEL=0 'digital IO " samo za 12F675 "
TrisIO = 0
GPIO = 0
'-------------------------------------------------------------------------------
DATA @0,$3E,$51,$49,$45,$3E,_ ';// 0
$00,$42,$7F,$40,$00,_ ';// 1
$42,$61,$51,$49,$46,_ ';// 2
$21,$41,$45,$4B,$31,_ ';// 3
$18,$14,$12,$7F,$10,_ ';// 4
$27,$45,$45,$45,$39,_ ';// 5
$3C,$4A,$49,$49,$30,_ ';// 6
$01,$71,$09,$05,$03,_ ';// 7
$36,$49,$49,$49,$36,_ ';// 8
$06,$49,$49,$29,$1E,_ ';// 9
$08,$08,$3E,$08,$08,_ ';// +
$08,$08,$08,$08,$08,_ ';// -
$00,$60,$60,$00,$00 ';// .
data @$60,$28,$21,$DD,$01,$03,$00,$00,$46 ' адрес первого датчика
DATA @$70,$28,$18,$00,$02,$03,$00,$00,$07 ' адрес второго датчика
RST = 1
LcdReg = %00100001 'LCD Extended Commands.
call PrintCtrlLcd
LcdReg = 228 'Set LCD Vop (Contrast).
call PrintCtrlLcd
LcdReg = %00000111 'Set Temp coefficent.
call PrintCtrlLcd
LcdReg = %00010011 'LCD bias mode 1:48.
call PrintCtrlLcd
LcdReg = %00100000 'LCD Standard Commands, Horizontal addressing mode.
call PrintCtrlLcd
LcdReg = %00001100
call PrintCtrlLcd
call CursorHome
Call ClearLcd
Main:
Offset = $60 ' первый датчик
y = 1
call read_ds18b20
Offset = $70 ' второй датчик
y = 4
call read_ds18b20
nap 7 ' пауза
Goto main
' читаем из датчика
read_ds18b20:
for e = 1 to 8
read Offset,addr[e]
Offset = Offset + 1
Next e
OWOut DQ, 1, [$55,addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7],addr[8],$44]
W1: OWIN DQ, 4, [Stat] ' Проверяем занятость датчика
clearwdt
IF Stat = 0 THEN W1
OWOut DQ, 1, [$55,addr[1],addr[2],addr[3],addr[4],addr[5],addr[6],addr[7],addr[8],$BE]
OWIn DQ, 2, [temperature.LOWBYTE, temperature.HIGHBYTE]
Predznak = 0
if TempHigh.7 = 1 then temperature = (~ temperature) + 1 : Predznak = 1
TempH = temperature >> 4
Templ = temperature.lowbyte & $0f
Temperature = templ * 625
if TempH > 99 then ' если больше 100 градусов вместо "+" "1"
Char = 1
else
Char = 10 ' + plus
if Predznak = 1 then Char = 11 ' - minus
endif
x = 12
call PrintChar
Char = (temph dig 1) ' десятки
call PrintChar
Char = (temph dig 0) ' единицы
call PrintChar
Char = 12 ' точка
call PrintChar
Char = (temperature dig 3) ' десятичная часть
Call PrintChar
return
' Перевод курсора x=0..83 y=0..5
CursorHome: x = 0
y = 0
SetCursor: LcdReg = %10000000 + x ' cursor X
call PrintCtrlLcd
LcdReg = %01000000 + y ' cursor Y
call PrintCtrlLcd
return
' печать символа удвоенного размера
PrintChar: offset = Char * 5
for a = 1 to 5
read offset, z
t = (z & 1)*3
t = t|((z & 2)*6)
t = t|((z & 4)*12)
t = t|((z & 8)*24)
call SetCursor
LcdReg = t
call PrintDataLcd
LcdReg = t
call PrintDataLcd
z = z >> 4
t = (z & 1)*3
t = t|((z & 2)*6)
t = t|((z & 4)*12)
t = t|((z & 8)*24)
y = y + 1
call SetCursor
LcdReg = t
call PrintDataLcd
LcdReg = t
call PrintDataLcd
offset = offset + 1
x = x + 2
y = y - 1
next a
x = x + 2
return
' очистка китайца (804 нулевых байта)
ClearLcd:
D_C = 1
LcdReg = 0
for t = 0 to 235
for a = 0 to 2
call PrintDataLcd
next a
next t
Return
' отправка данных/команд на lcd
PrintCtrlLcd: D_C = 0
PrintDataLcd: for e = 1 to 8
SDIN = LcdReg.7
LcdReg = LcdReg << 1
SCK = 1
SCK = 0
next e
D_C = 1
return
end

4115 просмотров
комментировать