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