Решил тут собрать термометр 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