Erik
In order to succeed you must fail, so that you know what not to do the next time.
Hallo allemaal,
Nadat het vanochtend gelukt is om mijn 2x20 lcd aan te sluiten op mijn 16f84A(20mhz) probeer ik nu 1-wire aan de praat te krijgen via JAL en de id code te laten zien op het lcd schermpje.
Wat er gebeurd is het volgende. Wanneer ik een 1-wire apparaat probeer in te lezen ( een ds18s20 tempsensor of een ds1990 i-button ) merkt de pic wel dat een een apparaat is aangesloten (als er niks is aangesloten hoord het lcd'tje leeg te blijven ) maar de serial word vertoond als 2 regels met FFFFFFFF erop( vars zijn dus leeg ). Als library heb ik eentje van de JALlist gepakt. welke ik hieronder zal neerzetten.
Ik denk dat ik ongeveer wel weet waar het probleem zit namelijk dat het een timingsprobleem is. De library is bedoeld voor een 16f877 4mhz en ik draai hem op een 16f84A 20mhz. Voor zover ik zie zitten hier een hardcoded delay in maar omdat ik niet zo'n ster ben in asm vraag ik jullie hulp daarbij.
De code die ik gebruik:
include 16f84_20
include jpic
include jprint
include 1wire
include hd447804
var byte temp
var byte ser0
var byte ser1
var byte ser2
var byte ser3
var byte ser4
var byte ser5
var byte ser6
var byte ser7
forever loop
temp = 1
while (temp != 0) loop
temp = _1w_reset
end loop
_1w_writebyte(0x33)
ser7 = _1w_readbyte
ser6 = _1w_readbyte
ser5 = _1w_readbyte
ser4 = _1w_readbyte
ser3 = _1w_readbyte
ser2 = _1w_readbyte
ser1 = _1w_readbyte
ser0 = _1w_readbyte
hd44780_clear
print_hexadecimal_2(hd44780, ser0, "0")
print_hexadecimal_2(hd44780, ser1, "0")
print_hexadecimal_2(hd44780, ser2, "0")
print_hexadecimal_2(hd44780, ser3, "0")
hd44780_position(64)
print_hexadecimal_2(hd44780, ser4, "0")
print_hexadecimal_2(hd44780, ser5, "0")
print_hexadecimal_2(hd44780, ser6, "0")
print_hexadecimal_2(hd44780, ser7, "0")
delay_1s(1)
end loop
en de 1wire library die erbij hoort:
-- DalSemi 1-Wire library for JAL
-- P. Pemberton. Licensed under the LGPL.
-- Uses a single I/O pin and a 4k7 pullup to communicate over the 1-Wire bus.
-- Tested with:
-- 1x DS1822 "Econo Digital Thermometer"
-- 2x DS1990A-F5 "Serial Number iButton"
-- 2x DS1973-F3 "EEPROM iButton"
include 1wirep
procedure _1w_delay(byte in dlp) is
var byte Delay
assembler
local DelayLoop
movf dlp, w
movwf Delay
DelayLoop:
nop
decfsz Delay, f
goto DelayLoop
end assembler
end procedure
-- Generates a reset pulse on the 1-Wire bus
-- Return values:
-- 0 - Presence pulse received
-- 1 - No presence pulse received
-- 2 - 1-Wire bus is short circuited
function _1w_reset return byte is
var bit presence
_1w_dq_dir = input -- Direction = input
if ! _1w_dq then -- Short circuit?
return 2 -- Yes. Exit with errorcode 2
end if
_1w_dq_dir = output -- Reset pulse
_1w_delay(192) -- Short delay
_1w_dq_dir = input -- Allow bus to float high
assembler -- Allow for rise time
nop
nop
nop
nop
nop
nop
end assembler
presence = low -- Assume no presence pulse
for 145 loop -- Loop 145 times
if ! _1w_dq then -- Presence pulse?
presence = high -- Yes - set the flag
end if
end loop
if presence then -- Presence pulse detected?
return 0 -- Yes - return with errorcode 0
else
return 1 -- No - return with errorcode 1
end if
end function
-- Write a byte to the 1-Wire bus
procedure _1w_writebyte(byte in ib) is
var byte temp
temp = ib
for 8 loop
asm rrf temp, f
if (status_c) then
-- Output a "1"
_1w_dq_dir = output -- Momentary low
_1w_dq_dir = input
_1w_delay(20) -- 60uS delay
else
-- Output a "0"
_1w_dq_dir = output -- 60uS low
_1w_delay(20)
_1w_dq_dir = input
end if
end loop
end procedure
-- Read a byte from the 1Wire bus
function _1w_readbyte return byte is
var byte temp
temp = 0
for 8 loop
_1w_dq_dir = output -- momentary low
_1w_dq_dir = input
if (! _1w_dq) then -- sample data bit
status_c = low -- it's low.
asm rrf temp, f
else
status_c = high -- it's high.
asm rrf temp, f
end if
_1w_delay(20) -- timeslot delay
end loop
return temp
end function
-- Wait for a temperature conversion to complete
procedure _1w_waitconv is
var byte temp
temp = 0
-- DS182x sensors return 0x00 if conversion is in progress
while (temp != 0xFF) loop
temp = _1w_readbyte
end loop
end procedure
_1w_dq_dir = input
_1w_dq = low
Het probleem zal hem dus wel in het procedure _1w_delay gedeelte zitten omdat de snelheid 5x verhoogd is zal de chip wel niet genoeg tijd krijgen om de serial te versturen.
Als jullie denken dat dat het probleem is zou ik dan het beste de library kunnen aanpassen of simpelweg de pic te downclocken naar 4mhz om zo ook het probleem te omzijlen( kristal vervangen van 20 naar 4mhz om hem zo langzamer te krijgen kan toch? )
.
EDIT: het is al opgelost door het kristal te vervangen door een 4mhz variant