Ik heb een programma in MikroBasic om een temperatuur sensor uit te lezen.
Processor: PIC16F1847.
Daarbij maak ik gebruik van de HELP-functie in MikroBasic, maar het resultaat is dat er geen temperatuur wordt weergegeven. De display zelf werkt correct en geeft de literals weer.
Ergens maak ik een fout (Ik twijfel zelf over de LATA of PORTA.
Ik heb begrepen / geleerd dat je PORT voor input en LAT voor output gebruikt (voor zover dat wordt ondersteund door de uC).
Maar er kan ook iets anders zijn.
pic basic code:
program DS18B20_1847
'==============================================================================
dim LCD_RS as sbit at LATB6_bit
LCD_EN as sbit at LATB7_bit
LCD_D4 as sbit at LATA0_bit
LCD_D5 as sbit at LATA1_bit
LCD_D6 as sbit at LATA2_bit
LCD_D7 as sbit at LATA3_bit
dim LCD_RS_Direction as sbit at TRISB6_bit
LCD_EN_Direction as sbit at TRISB7_bit
LCD_D4_Direction as sbit at TRISA0_bit
LCD_D5_Direction as sbit at TRISA1_bit
LCD_D6_Direction as sbit at TRISA2_bit
LCD_D7_Direction as sbit at TRISA3_bit
Dim Str as String[16]
const TEMP_RESOLUTION as byte = 12
Const RES_SHIFT = TEMP_RESOLUTION - 8
dim text as char[9]
temp as word
sub procedure Display_Temperature( dim temp2write as word )
dim temp_whole as byte
temp_fraction as word
text = "000.0000"
' Check if temperature is negative
if (temp2write and 0x8000) then
text[0] = "-"
temp2write = not temp2write + 1
end if
' Extract temp_whole
temp_whole = word(temp2write >> RES_SHIFT)
' Convert temp_whole to characters
if ( temp_whole div 100 ) then
text[0] = temp_whole div 100 + 48
else
text[0] = "0"
end if
text[1] = (temp_whole div 10)mod 10 + 48 ' Extract tens digit
text[2] = temp_whole mod 10 + 48 ' Extract ones digit
' Extract temp_fraction and convert it to unsigned int
temp_fraction = word(temp2write << (4-RES_SHIFT))
temp_fraction = temp_fraction and 0x000F
temp_fraction = temp_fraction * 625
' Convert temp_fraction to characters
text[4] = word(temp_fraction div 1000) + 48 ' Extract thousands digit
text[5] = word((temp_fraction div 100)mod 10 + 48) ' Extract hundreds digit
text[6] = word((temp_fraction div 10)mod 10 + 48) ' Extract tens digit
text[7] = word(temp_fraction mod 10) + 48 ' Extract ones digit
' Print temperature on Lcd
Lcd_Out(2, 5, text)
end sub
'==============================================================================
main:
'==============================================================================
' Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
' 18S20: 9 (default setting can be 9,10,11,or 12)
' 18B20: 12
ANSELA.4 = 1 ' Configure AN pins as digital I/O
text = "000.0000"
Lcd_Init() ' Initialize Lcd
Lcd_Cmd(_LCD_CLEAR) ' Clear Lcd
Lcd_Cmd(_LCD_CURSOR_OFF) ' Turn cursor off
Lcd_Out(1, 1, " Temperature: ")
Lcd_Chr(2,13,223) ' Print degree character, "C" for Centigrades
' Different Lcd displays have different char code for degree
Lcd_Chr(2,14,"C") ' If you see greek alpha letter try typing 178 instead of 223
'--- Main loop
while (TRUE)
'--- Perform temperature reading
Ow_Reset(LATA, 4) ' Onewire reset signal
Ow_Write(LATA, 4, 0xCC) ' Issue command SKIP_ROM
Ow_Write(LATA, 4, 0x44) ' Issue command CONVERT_T
Delay_us(120)
Ow_Reset(LATA, 4)
Ow_Write(LATA, 4, 0xCC) ' Issue command SKIP_ROM
Ow_Write(LATA, 4, 0xBE) ' Issue command READ_SCRATCHPAD
temp = Ow_Read(PORTA, 4)
temp = (Ow_Read(PORTA, 4) << 8) + temp
'--- Format and display result on Lcd
Display_Temperature(temp)
Delay_ms(520)
wend
end.
End.