Простой индикатор заряда батареи на PIC компиляция St-link под linux
Создано: 05-03-2012 20:05:34 изменено: 18-05-2012 10:20:26  Метки: electronic pic

Решил тут собрать термометр 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 
3252 просмотров комментировать
Создано: asdff 26-03-2012 20:07:29 Ответить
А можно схемку на два датчика и прошивку под китайский дисплей на e-mail ???
Создано: sanych 26-03-2012 21:27:38 Ответить
схема по ссылке а прошивка вот. Обвязку 4 ноги делать не надо, 2 датчик ставится параллельно первому. Да слово конфигурации 0x31CC

Создано: Velerad 16-10-2012 07:05:58 Ответить
Доброе время суток. Помогите новичку А в какой среде писалась писалась программа??? И как понять выражение "обвязку на 4 ноги делать не надо" Спасибо!
Создано: sanych 24-12-2012 10:58:39 Ответить
Извините за молчание... Среда picbasic pro. Это значит что ее можно оставить висеть в воздухе или (в данном конкретном случае) через резистор 10кОм подключить к плюсу питания...
Создано: Евгений 09-01-2014 16:24:59 Ответить
Спасибо, sanych, за исходник. Сам я начинающий, пытаюсь писать тоже на PicBasicPro. Хочу сделать графику на китайском 3310. Есть вопросы, но зайти на сайт к Ивице Новаковичу не получается. Может Вы сможете помочь с командами для графики?
Создано: sanych 01-04-2014 14:57:13 Ответить
я изучал picbasic по книге: Хилинский В.Н. "Учимся программировать микроконтроллеры PIC на языке PIC Basic Pro". Посмотрите, может она вам поможет.

Простой индикатор заряда батареи на PIC компиляция St-link под linux