-- --------------------------------------------------------------------
-- 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
See:
Interested:
Questions: