-- --------------------------------------------------------------------
-- file : jpicm.jal
-- author : Wouter van Ooijen
-- date : 02-APR-2000
-- purpose : access to PIC peripherals
-- requires : -
--
-- Copyright (C) 1998, 2000 Wouter van Ooijen
--
-- This library is free software; you can redistribute it and/or
-- modify it under the terms of the GNU Library General Public
-- License as published by the Free Software Foundation; either
-- version 2 of the License, or (at your option) any later version.
--
-- This library is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-- Library General Public License for more details.
--
-- You should have received a copy of the GNU Library General Public
-- License along with this library; if not, write to the
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-- Boston, MA 02111-1307, USA.
--
-- after june 2000 adapted by V.Surducan for more 877
-- 02-APR-2000 adapted for 12c509a and 16F877
-- 17-DEC-1998 ???
-- --------------------------------------------------------------------
-- --------------------------------------------------------------------
-- some special function registers and bits within these registers
-- --------------------------------------------------------------------
var volatile byte indf at 0
var volatile byte tmr0 at 1
var volatile byte pcl at 2
var volatile byte status at 3
var volatile byte fsr at 4
var volatile byte port_a at 5
var volatile byte port_b at 6
var volatile byte port_c at 7
var volatile byte port_d at 8
var volatile byte port_e at 9
var volatile byte x84_eedata at 8
var volatile byte x84_eeadr at 9
var volatile byte pclath at 10
var volatile byte intcon at 11
var volatile byte f877_t2con at 0x12
var volatile byte f877_ccpr1l at 0x15
var volatile byte f877_ccpr1h at 0x16
var volatile byte f877_ccp1con at 0x17
var volatile byte f877_adcon1 at 0x9F
var volatile byte f877_adcon0 at 0x1F
var volatile byte f877_pr2 at 0x92
var volatile byte f877_adresl at 0x9E
var volatile byte f877_adresh at 0x1E
var volatile byte f877_eeadr at 0x10D
var volatile byte f877_eedath at 0x10E
var volatile byte f877_eeadrh at 0x10F
var volatile byte f877_eedata at 0x10C
var volatile byte f877_eecon1 at 0x18C
var volatile byte f877_eecon2 at 0x18D
-- pseudo-variable in bank 1
var volatile byte option
var volatile bit pin_a0 at port_a : 0
var volatile bit pin_a1 at port_a : 1
var volatile bit pin_a2 at port_a : 2
var volatile bit pin_a3 at port_a : 3
var volatile bit pin_a4 at port_a : 4
var volatile bit pin_a5 at port_a : 5
var volatile bit pin_b0 at port_b : 0
var volatile bit pin_b1 at port_b : 1
var volatile bit pin_b2 at port_b : 2
var volatile bit pin_b3 at port_b : 3
var volatile bit pin_b4 at port_b : 4
var volatile bit pin_b5 at port_b : 5
var volatile bit pin_b6 at port_b : 6
var volatile bit pin_b7 at port_b : 7
var volatile bit pin_c0 at port_c : 0
var volatile bit pin_c1 at port_c : 1
var volatile bit pin_c2 at port_c : 2
var volatile bit pin_c3 at port_c : 3
var volatile bit pin_c4 at port_c : 4
var volatile bit pin_c5 at port_c : 5
var volatile bit pin_c6 at port_c : 6
var volatile bit pin_c7 at port_c : 7
var volatile bit pin_d0 at port_d : 0
var volatile bit pin_d1 at port_d : 1
var volatile bit pin_d2 at port_d : 2
var volatile bit pin_d3 at port_d : 3
var volatile bit pin_d4 at port_d : 4
var volatile bit pin_d5 at port_d : 5
var volatile bit pin_d6 at port_d : 6
var volatile bit pin_d7 at port_d : 7
var volatile bit pin_e0 at port_e : 0
var volatile bit pin_e1 at port_e : 1
var volatile bit pin_e2 at port_e : 2
var volatile bit status_c at status : 0
var volatile bit status_dc at status : 1
var volatile bit status_z at status : 2
var volatile bit status_pd at status : 3
var volatile bit status_to at status : 4
var volatile bit status_rp0 at status : 5
var volatile bit status_rp1 at status : 6
var volatile bit status_irp at status : 7
var volatile bit intcon_gie at intcon : 7
var volatile bit intcon_eeie at intcon : 6
var volatile bit intcon_peie at intcon : 6
var volatile bit intcon_t0ie at intcon : 5
var volatile bit intcon_inte at intcon : 4
var volatile bit intcon_rbie at intcon : 3
var volatile bit intcon_t0if at intcon : 2
var volatile bit intcon_intf at intcon : 1
var volatile bit intcon_rbif at intcon : 0
var volatile bit ccp1x at f877_ccp1con : 5
var volatile bit ccp1y at f877_ccp1con : 4
var volatile bit adcon0_go at f877_adcon0 : 2
var volatile bit adcon0_ch0 at f877_adcon0 : 3
var volatile bit adcon0_ch1 at f877_adcon0 : 4
var volatile bit adcon0_ch2 at f877_adcon0 : 5
var volatile bit eecon1_rd at f877_eecon1 : 0
var volatile bit eecon1_wr at f877_eecon1 : 1
var volatile bit eecon1_wren at f877_eecon1 : 2
var volatile bit eecon1_wrerr at f877_eecon1 : 3
var volatile bit eecon1_eepgd at f877_eecon1 : 7
-- --------------------------------------------------------------------
-- register bank selection
-- --------------------------------------------------------------------
procedure bank_0 is
if( target_chip == pic_16f877 ) then
asm bcf status, 5
asm bcf status, 6
end if
asm bank 0
end procedure
procedure bank_1 is
if( target_chip == pic_16f877 ) then
asm bsf status, 5
asm bcf status, 6
end if
asm bank 1
end procedure
procedure bank_2 is
if( target_chip == pic_16f877 ) then
asm bcf status, 5
asm bsf status, 6
end if
asm bank 2
end procedure
procedure bank_3 is
if( target_chip == pic_16f877 ) then
asm bsf status, 5
asm bsf status, 6
end if
asm bank 3
end procedure
procedure bank_4 is
asm bank 4
end procedure
procedure bank_5 is
asm bank 5
end procedure
procedure bank_6 is
asm bank 6
end procedure
procedure bank_7 is
asm bank 7
end procedure
-- --------------------------------------------------------------------
-- option put and get
-- --------------------------------------------------------------------
procedure option'put( byte in x ) is
assembler
bank movfw x
option
end assembler
end procedure
function option'get return byte is
var byte x
asm bank movfw 0x81
if( target_chip == pic_16f877 ) then bank_1 end if
asm bank movwf x
if( target_chip == pic_16f877 ) then bank_0 end if
return x
end function
-- --------------------------------------------------------------------
-- port and pin direction
-- --------------------------------------------------------------------
const bit input = on
const bit output = off
const byte all_input = 0b_1111_1111
const byte all_output = 0b_0000_0000
-- shadows of the actual tris values
var byte trisa
var byte trisb
var byte trisc
var byte trisd
var byte trise
-- Bring the applicable trisX values in accordance
-- with the power-on hardware defaults.
trisa = all_input
if target_cpu != pic_12 then
trisb = all_input
end if
if target_chip == pic_16f877 | target_cpu == sx_12 then
trisc = all_input
end if
if target_chip == pic_16f877 then
trisd = all_input
trise = 0x0F -- high nibble has other functions!
end if
procedure _trisa_flush is
assembler
bank movfw trisa
tris 5
end assembler
end procedure
procedure _trisb_flush is
assembler
bank movfw trisb
tris 6
end assembler
end procedure
procedure _trisc_flush is
assembler
bank movfw trisc
tris 7
end assembler
end procedure
procedure _trisd_flush is
asm movfw trisd
bank_1
asm movwf 0x8
bank_0
end procedure
procedure _trise_flush is
asm movfw trise
bank_1
asm movwf 0x9
bank_0
end procedure
var byte port_a_direction at trisa
procedure port_a_direction'put( byte in x at trisa ) is
_trisa_flush
end procedure
var byte port_b_direction at trisb
procedure port_b_direction'put( byte in x at trisb ) is
_trisb_flush
end procedure
var byte port_c_direction at trisc
procedure port_c_direction'put( byte in x at trisc ) is
_trisc_flush
end procedure
var byte port_d_direction at trisd
procedure port_d_direction'put( byte in x at trisd ) is
_trisd_flush
end procedure
var byte port_e_direction at trise
procedure port_e_direction'put( byte in x ) is
var byte c at trise = ( trise & 0xF0 ) | ( x & 0x0F )
_trise_flush
end procedure
var bit pin_a0_direction at trisa : 0
var bit pin_a1_direction at trisa : 1
var bit pin_a2_direction at trisa : 2
var bit pin_a3_direction at trisa : 3
var bit pin_a4_direction at trisa : 4
var bit pin_a5_direction at trisa : 5
procedure pin_a0_direction'put( bit in d at trisa : 0 ) is
_trisa_flush
end procedure
procedure pin_a1_direction'put( bit in d at trisa : 1 ) is
_trisa_flush
end procedure
procedure pin_a2_direction'put( bit in d at trisa : 2 ) is
_trisa_flush
end procedure
procedure pin_a3_direction'put( bit in d at trisa : 3 ) is
_trisa_flush
end procedure
procedure pin_a4_direction'put( bit in d at trisa : 4 ) is
_trisa_flush
end procedure
var bit pin_b0_direction at trisb : 0
var bit pin_b1_direction at trisb : 1
var bit pin_b2_direction at trisb : 2
var bit pin_b3_direction at trisb : 3
var bit pin_b4_direction at trisb : 4
var bit pin_b5_direction at trisb : 5
var bit pin_b6_direction at trisb : 6
var bit pin_b7_direction at trisb : 7
procedure pin_b0_direction'put( bit in d at trisb : 0 ) is
_trisb_flush
end procedure
procedure pin_b1_direction'put( bit in d at trisb : 1 ) is
_trisb_flush
end procedure
procedure pin_b2_direction'put( bit in d at trisb : 2 ) is
_trisb_flush
end procedure
procedure pin_b3_direction'put( bit in d at trisb : 3 ) is
_trisb_flush
end procedure
procedure pin_b4_direction'put( bit in d at trisb : 4 ) is
_trisb_flush
end procedure
procedure pin_b5_direction'put( bit in d at trisb : 5 ) is
_trisb_flush
end procedure
procedure pin_b6_direction'put( bit in d at trisb : 6 ) is
_trisb_flush
end procedure
procedure pin_b7_direction'put( bit in d at trisb : 7 ) is
_trisb_flush
end procedure
var bit pin_c0_direction at trisc : 0
var bit pin_c1_direction at trisc : 1
var bit pin_c2_direction at trisc : 2
var bit pin_c3_direction at trisc : 3
var bit pin_c4_direction at trisc : 4
var bit pin_c5_direction at trisc : 5
var bit pin_c6_direction at trisc : 6
var bit pin_c7_direction at trisc : 7
procedure pin_c0_direction'put( bit in d at trisc : 0 ) is
_trisc_flush
end procedure
procedure pin_c1_direction'put( bit in d at trisc : 1 ) is
_trisc_flush
end procedure
procedure pin_c2_direction'put( bit in d at trisc : 2 ) is
_trisc_flush
end procedure
procedure pin_c3_direction'put( bit in d at trisc : 3 ) is
_trisc_flush
end procedure
procedure pin_c4_direction'put( bit in d at trisc : 4 ) is
_trisc_flush
end procedure
procedure pin_c5_direction'put( bit in d at trisc : 5 ) is
_trisc_flush
end procedure
procedure pin_c6_direction'put( bit in d at trisc : 6 ) is
_trisc_flush
end procedure
procedure pin_c7_direction'put( bit in d at trisc : 7 ) is
_trisc_flush
end procedure
var bit pin_d0_direction at trisd : 0
var bit pin_d1_direction at trisd : 1
var bit pin_d2_direction at trisd : 2
var bit pin_d3_direction at trisd : 3
var bit pin_d4_direction at trisd : 4
var bit pin_d5_direction at trisd : 5
var bit pin_d6_direction at trisd : 6
var bit pin_d7_direction at trisd : 7
procedure pin_d0_direction'put( bit in d at trisd : 0 ) is
_trisd_flush
end procedure
procedure pin_d1_direction'put( bit in d at trisd : 1 ) is
_trisd_flush
end procedure
procedure pin_d2_direction'put( bit in d at trisd : 2 ) is
_trisd_flush
end procedure
procedure pin_d3_direction'put( bit in d at trisd : 3 ) is
_trisd_flush
end procedure
procedure pin_d4_direction'put( bit in d at trisd : 4 ) is
_trisd_flush
end procedure
procedure pin_d5_direction'put( bit in d at trisd : 5 ) is
_trisd_flush
end procedure
procedure pin_d6_direction'put( bit in d at trisd : 6 ) is
_trisd_flush
end procedure
procedure pin_d7_direction'put( bit in d at trisd : 7 ) is
_trisd_flush
end procedure
var bit pin_e0_direction at trisc : 0
var bit pin_e1_direction at trisc : 1
var bit pin_e2_direction at trisc : 2
procedure pin_e0_direction'put( bit in d at trise : 0 ) is
_trise_flush
end procedure
procedure pin_e1_direction'put( bit in d at trise : 1 ) is
_trise_flush
end procedure
procedure pin_e2_direction'put( bit in d at trise : 2 ) is
_trise_flush
end procedure
procedure port_a_low_direction'put( byte in d ) is
var byte a at trisa = ( trisa & 0xF0 ) | ( d & 0x0F )
_trisa_flush
end procedure
procedure port_a_high_direction'put( byte in d ) is
var byte a at trisa = ( trisa & 0x0F ) | ( ( d & 0x0F ) << 4 )
_trisa_flush
end procedure
procedure port_b_low_direction'put( byte in d ) is
var byte b at trisb = ( trisb & 0xF0 ) | ( d & 0x0F )
_trisb_flush
end procedure
procedure port_b_high_direction'put( byte in d ) is
var byte b at trisb = ( trisb & 0x0F ) | ( ( d & 0x0F ) << 4 )
_trisb_flush
end procedure
procedure port_c_low_direction'put( byte in d ) is
var byte c at trisc = ( trisc & 0xF0 ) | ( d & 0x0F )
_trisc_flush
end procedure
procedure port_c_high_direction'put( byte in d ) is
var byte c at trisc = ( trisc & 0x0F ) | ( ( d & 0x0F ) << 4 )
_trisc_flush
end procedure
procedure port_d_low_direction'put( byte in d ) is
var byte c at trisd = ( trisd & 0xF0 ) | ( d & 0x0F )
_trisd_flush
end procedure
procedure port_d_high_direction'put( byte in d ) is
var byte c at trisd = ( trisd & 0x0F ) | ( ( d & 0x0F ) << 4 )
_trisd_flush
end procedure
procedure port_e_low_direction'put( byte in d ) is
var byte c at trise = ( trise & 0xF0 ) | ( d & 0x0F )
_trise_flush
end procedure
function port_a_low_direction'get return byte is
var byte a at trisa
return a & 0x0F
end function
function port_a_high_direction'get return byte is
var byte a at trisa
return a >> 4
end function
function port_b_low_direction'get return byte is
var byte b at trisb
return b & 0x0F
end function
function port_b_high_direction'get return byte is
var byte b at trisb
return b >> 4
end function
function port_c_low_direction'get return byte is
var byte b at trisc
return b & 0x0F
end function
function port_c_high_direction'get return byte is
var byte b at trisc
return b >> 4
end function
function port_d_low_direction'get return byte is
var byte b at trisd
return b & 0x0F
end function
function port_d_high_direction'get return byte is
var byte b at trisd
return b >> 4
end function
function port_e_low_direction'get return byte is
var byte b at trise
return b & 0x0F
end function
-- port and pin value
var byte _port_a_buffer
var byte _port_b_buffer
var byte _port_c_buffer
var byte _port_d_buffer
var byte _port_e_buffer
procedure _port_a_flush is
var volatile byte port_a at 5 = _port_a_buffer
end procedure
procedure _port_b_flush is
var volatile byte port_b at 6 = _port_b_buffer
end procedure
procedure _port_c_flush is
var volatile byte port_c at 7 = _port_c_buffer
end procedure
procedure _port_d_flush is
var volatile byte port_d at 8 = _port_d_buffer
end procedure
procedure _port_e_flush is
var volatile byte port_e at 9 = _port_e_buffer
end procedure
procedure port_a'put( byte in x at _port_a_buffer ) is
_port_a_flush
end procedure
procedure port_b'put( byte in x at _port_b_buffer ) is
_port_b_flush
end procedure
procedure port_c'put( byte in x at _port_c_buffer ) is
_port_c_flush
end procedure
procedure port_d'put( byte in x at _port_d_buffer ) is
_port_d_flush
end procedure
procedure port_e'put( byte in x at _port_e_buffer ) is
_port_e_flush
end procedure
procedure port_a_low'put( byte in x ) is
_port_a_buffer = ( _port_a_buffer & 0xF0 ) | ( x & 0x0F )
_port_a_flush
end procedure
function port_a_low'get return byte is
return _port_a_buffer & 0x0F
end function
procedure port_b_low'put( byte in x ) is
_port_b_buffer = ( _port_b_buffer & 0xF0 ) | ( x & 0x0F )
_port_b_flush
end procedure
function port_b_low'get return byte is
return _port_b_buffer & 0x0F
end function
procedure port_b_high'put( byte in x ) is
_port_b_buffer = ( _port_b_buffer & 0x0F ) | ( x << 4 )
_port_b_flush
end procedure
function port_b_high'get return byte is
return _port_b_buffer >> 4
end function
procedure port_c_low'put( byte in x ) is
_port_c_buffer = ( _port_c_buffer & 0xF0 ) | ( x & 0x0F )
_port_c_flush
end procedure
function port_c_low'get return byte is
return _port_c_buffer & 0x0F
end function
procedure port_c_high'put( byte in x ) is
_port_c_buffer = ( _port_c_buffer & 0x0F ) | ( x << 4 )
_port_c_flush
end procedure
function port_c_high'get return byte is
return _port_c_buffer >> 4
end function
procedure port_d_low'put( byte in x ) is
_port_d_buffer = ( _port_d_buffer & 0xF0 ) | ( x & 0x0F )
_port_d_flush
end procedure
function port_d_low'get return byte is
return _port_d_buffer & 0x0F
end function
procedure port_d_high'put( byte in x ) is
_port_d_buffer = ( _port_d_buffer & 0x0F ) | ( x << 4 )
_port_d_flush
end procedure
function port_d_high'get return byte is
return _port_d_buffer >> 4
end function
procedure port_e_low'put( byte in x ) is
_port_e_buffer = ( _port_e_buffer & 0xF0 ) | ( x & 0x0F )
_port_e_flush
end procedure
function port_e_low'get return byte is
return _port_e_buffer & 0x0F
end function
procedure pin_a0'put( bit in x at _port_a_buffer : 0 ) is
_port_a_flush
end procedure
procedure pin_a1'put( bit in x at _port_a_buffer : 1 ) is
_port_a_flush
end procedure
procedure pin_a2'put( bit in x at _port_a_buffer : 2 ) is
_port_a_flush
end procedure
procedure pin_a3'put( bit in x at _port_a_buffer : 3 ) is
_port_a_flush
end procedure
procedure pin_a4'put( bit in x at _port_a_buffer : 4 ) is
_port_a_flush
end procedure
procedure pin_a5'put( bit in x at _port_a_buffer : 5 ) is
_port_a_flush
end procedure
procedure pin_b0'put( bit in x at _port_b_buffer : 0 ) is
_port_b_flush
end procedure
procedure pin_b1'put( bit in x at _port_b_buffer : 1 ) is
_port_b_flush
end procedure
procedure pin_b2'put( bit in x at _port_b_buffer : 2 ) is
_port_b_flush
end procedure
procedure pin_b3'put( bit in x at _port_b_buffer : 3 ) is
_port_b_flush
end procedure
procedure pin_b4'put( bit in x at _port_b_buffer : 4 ) is
_port_b_flush
end procedure
procedure pin_b5'put( bit in x at _port_b_buffer : 5 ) is
_port_b_flush
end procedure
procedure pin_b6'put( bit in x at _port_b_buffer : 6 ) is
_port_b_flush
end procedure
procedure pin_b7'put( bit in x at _port_b_buffer : 7 ) is
_port_b_flush
end procedure
procedure pin_c0'put( bit in x at _port_c_buffer : 0 ) is
_port_c_flush
end procedure
procedure pin_c1'put( bit in x at _port_c_buffer : 1 ) is
_port_c_flush
end procedure
procedure pin_c2'put( bit in x at _port_c_buffer : 2 ) is
_port_c_flush
end procedure
procedure pin_c3'put( bit in x at _port_c_buffer : 3 ) is
_port_c_flush
end procedure
procedure pin_c4'put( bit in x at _port_c_buffer : 4 ) is
_port_c_flush
end procedure
procedure pin_c5'put( bit in x at _port_c_buffer : 5 ) is
_port_c_flush
end procedure
procedure pin_c6'put( bit in x at _port_c_buffer : 6 ) is
_port_c_flush
end procedure
procedure pin_c7'put( bit in x at _port_c_buffer : 7 ) is
_port_c_flush
end procedure
procedure pin_d0'put( bit in x at _port_d_buffer : 0 ) is
_port_d_flush
end procedure
procedure pin_d1'put( bit in x at _port_d_buffer : 1 ) is
_port_d_flush
end procedure
procedure pin_d2'put( bit in x at _port_d_buffer : 2 ) is
_port_d_flush
end procedure
procedure pin_d3'put( bit in x at _port_d_buffer : 3 ) is
_port_d_flush
end procedure
procedure pin_d4'put( bit in x at _port_d_buffer : 4 ) is
_port_d_flush
end procedure
procedure pin_d5'put( bit in x at _port_d_buffer : 5 ) is
_port_d_flush
end procedure
procedure pin_d6'put( bit in x at _port_d_buffer : 6 ) is
_port_d_flush
end procedure
procedure pin_d7'put( bit in x at _port_d_buffer : 7 ) is
_port_d_flush
end procedure
procedure pin_e0'put( bit in x at _port_e_buffer : 0 ) is
_port_e_flush
end procedure
procedure pin_e1'put( bit in x at _port_e_buffer : 1 ) is
_port_e_flush
end procedure
procedure pin_e2'put( bit in x at _port_e_buffer : 2 ) is
_port_e_flush
end procedure
-- --------------------------------------------------------------------
-- indirect access to the file registers
-- --------------------------------------------------------------------
procedure file_get( byte in a, byte out d ) is begin
if target_cpu != pic_14 then
pragma error -- not implemented yet
end if
fsr = a
d = indf
end procedure
procedure file_put( byte in a, byte in d ) is begin
if target_cpu != pic_14 then
pragma error -- not implemented yet
end if
fsr = a
indf = d
end procedure
-- --------------------------------------------------------------------
-- (indirect) access to the eeprom
-- original versions corrected by AxelK
-- --------------------------------------------------------------------
procedure eeprom_get( byte in a, byte out d ) is
if ( target_chip == pic_16c84 ) | ( target_chip == pic_16f84 ) then
var volatile bit ee_read at 8 : 0
x84_eeadr = a
status_rp0 = on -- select page 1
ee_read = on -- set read bit in EECON1
status_rp0 = off -- back to page 0
d = x84_eedata -- the actual data from eeprom
elsif target_chip == pic_16f877 then
f877_eeadr = a
-- 16F877 datasheet p45
assembler
bank bcf eecon1_eepgd
bsf eecon1_rd
end assembler
a = f877_eedata
else
pragma error -- eeprom not available
end if
end procedure
procedure eeprom_put( byte in a, byte in d ) is
if ( target_chip == pic_16c84 ) | ( target_chip == pic_16f84 ) then
var volatile bit ee_write at 8 : 1
var volatile bit ee_write_enable at 8 : 2
-- preparation
x84_eeadr = a
x84_eedata = d
status_rp0 = on -- select page 1
ee_write_enable = on
x84_eeadr = 0x55 -- to EECON2
x84_eeadr = 0xAA -- to EECON2
ee_write = on
-- wait for completion
while ee_write loop end loop
ee_write_enable = off -- disable writing to prevent accidental writes
status_rp0 = off -- back to page 0
elsif target_chip == pic_16f877 then
f877_eeadr = a
f877_eedata = d
-- 16F877 datasheet p45
assembler
bank bcf eecon1_eepgd
bank bsf eecon1_wren
bank bcf intcon_gie
movlw 0x55
bank movwf f877_eecon2
movlw 0xAA
bank movwf f877_eecon2
bank bsf eecon1_wr
bank bsf intcon_gie
sleep
bank bcf eecon1_wren
end assembler
else
pragma error -- eeprom not available
end if
end procedure
-- --------------------------------------------------------------------
-- (indirect) access to the code flash
-- --------------------------------------------------------------------
procedure flash_get(
byte in al,
byte in ah,
byte out dl,
byte out dh
) is
if ( target_chip != pic_16f877 ) then
pragma error -- flash read/write not available
end if
f877_eeadrh = ah
f877_eeadr = al
-- 16F877 datasheet p44
assembler
bank bsf status_rp0
bank bsf status_rp1
bank bsf eecon1_eepgd
bank bsf eecon1_rd
nop
nop
end assembler
dl = f877_eedata
dh = f877_eedath
end procedure
procedure flash_put(
byte in al,
byte in ah,
byte in dl,
byte in dh
) is
if ( target_chip != pic_16f877 ) then
pragma error -- flash read/write not available
end if
f877_eeadrh = ah
f877_eeadr = al
dl = f877_eedata
dh = f877_eedath
-- 16F877 datasheet p45
assembler
bank bsf status_rp0
bank bsf status_rp1
bank bsf eecon1_eepgd
bank bsf eecon1_wren
bank bcf intcon_gie
movlw 0x55
bank movwf f877_eecon2
movlw 0xAA
bank movwf f877_eecon2
bank bsf eecon1_wr
nop
nop
bank bsf intcon_gie
bank bcf eecon1_wren
end assembler
end procedure
-- --------------------------------------------------------------------
-- pic special functions
-- --------------------------------------------------------------------
procedure sleep is
asm sleep
end procedure
procedure clear_watchdog is
asm clrwdt
end procedure
procedure swap_nibbles( byte in out x ) is
asm bank swapf x, f
end procedure
-- disable the f877 A/D to be able to use port a as input
procedure disable_a_d_functions is
bank_1
asm movlw 7
asm movwf 0x1F
bank_0
end procedure
Questions:
| file: /Techref/piclist/jal/jpicm.htm, 26KB, , updated: 2008/2/22 18:06, local time: 2025/10/21 15:38,
216.73.216.114,10-3-244-150:LOG IN
|
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://www.piclist.com/Techref/piclist/jal/jpicm.htm"> PIC JAL Routine </A> |
| Did you find what you needed? |
|
o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. |
|
The Backwoods Guide to Computer Lingo |
.