ruijc
- 18th February 2008, 12:59
Hi all,
i've sucessfuly made some programs already but i'm still in a very rookie position.
I'm working on a program ( pic 16F88 ) to read temp and save it into an external eeprom.
Here's the code and at the end the questions ;)
*****
SSPCON.5 = 0 ; Disable SSP Module
TXSTA.5 = 0 ; Disable AUSART Tx
RCSTA.7 = 0 ; Disable Serial Port
OSCCON = %01111110 'Internal RC w/ I/Os
INTCON=0
PIE1 = 0
'PIE2 = 0
PIR1 = 0 'off
CMCON= 7
CVRCON= 0 'Vref Off
CCP1CON= 0
T1CON= 0
'T2CON = %00000100
'************************************************* ****************************
'DEFINEs
'************************************************* ****************************
@ DEVICE INTRC_OSC
@ DEVICE MCLR_OFF
@ DEVICE PROTECT_OFF
DEFINE osc 4
@ DEVICE CPD_OFF
@ DEVICE LVP_OFF
@ DEVICE BOD_OFF
@ DEVICE PWRT_OFF
@ DEVICE WDT_OFF
'************************************************* ****************************
'ADC
DEFINE ADC_BITS 10 ' Set number of bits in result ( 8 or 10 bits )
DEFINE ADC_CLOCK 3 ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS
'************************************************* ****************************
'ADC parameters
ADCON1 =%10000000 'right justify
ANSEL =%00000101
ADCON0 =%11000001
'************************************************* ****************************
INCLUDE "modedefs.bas"
'settings for serial comm
DEFINE debug_reg PORTA
DEFINE debug_bit 1
DEFINE debug_baud 9600
DEFINE debug_mode 1
'************************************************* ****************************
'I/O's
PORTA=0
PORTB=0
TRISA=%00100101
TRISB=%00000011
'************************************************* ****************************
'PINS
temp var PORTA.0
out var PORTA.1
volt var PORTA.2
a3 var PORTA.3
A4 var PORTA.4
but1 var PORTA.5
led2 var PORTA.6
led1 var PORTA.7
but2 var PORTB.0
but3 var PORTB.1
SCL var PORTB.2
SDA var PORTB.3
green var PORTB.4
red var PORTB.5
led4 var PORTB.6
led3 var PORTB.7
************************************************** ***************************
' variables
va var word
va2 var word
tempe var word
volte var word
mem var byte
p1a var word
p1b var word
p2a var word
p2b var word
p3a var word
p3b var word
p4a var word
p4b var word
state var byte
st var word
ed var word
ADDR var word
m1 var byte
m2 var byte
m3 var byte
m4 var byte
slot var bit
w var byte
CTW VAR BYTE
km var byte
ra var word
set1 VAR BYTE
set2 VAR BYTE
rm var byte
x var byte
CLEAR
'************************************************* ****************************
mem=1
state=1
p1a=$10
p1b=$1070
p2a=$1080
p2b=$2140
p3a=$2160
p3b=$3220
p4a=$3230
p4b=$4290
'************************************************* ****************************
start:
high out
debug $0D, $0A
PAUSE 50
CTW=$A0
'************************************************* ****************************
debug "start menu",13,10
startmenu:
I2CREAD SDA,SCL,CTW,1,[m1]
I2CREAD SDA,SCL,CTW,2,[m2]
I2CREAD SDA,SCL,CTW,3,[m3]
I2CREAD SDA,SCL,CTW,4,[m4]
if (mem=1) and (m1=0) then
led1=1
led2=0
led3=0
led4=0
slot=0
endif
if (mem=1) and (m1<>0) then
pause 300
toggle led1
led2=0
led3=0
led4=0
slot=1
endif
if (mem=2) and (m2=0) then
led1=0
led2=1
led3=0
led4=0
slot=0
endif
if (mem=2) and (m2<>0) then
led1=0
pause 300
toggle led2
led3=0
led4=0
slot=1
endif
if (mem=3) and (m3=0) then
led1=0
led2=0
led3=1
led4=0
slot=0
endif
if (mem=3) and (m3<>0) then
led1=0
pause 300
led2=0
toggle led3
led4=0
slot=1
endif
if (mem=4) and (m4=0) then
led1=0
led2=0
led3=0
led4=1
slot=0
endif
if (mem=4) and (m4<>0) then
led1=0
pause 300
led2=0
led3=0
toggle led4
slot=1
endif
if state=1 then
green=0
red=1
endif
if state=2 then
green=1
red=0
endif
if state=3 then
green=1
red=1
endif
if (but1=1) and (state=1) then
gosub readmenu
endif
if (but1=1) and (state=2) then
gosub recordmenu
endif
if (but1=1) and (state=3) then
gosub erasemenu
endif
if but3=1 then
gosub memorymenu
endif
if but2=1 then
gosub statemenu
endif
goto startmenu
'*****************
recordmenu:
debug "Record Menu",13,10
if slot=1 then
goto warningmenu
endif
if mem=1 then
st=p1a
ed=p1b
endif
if mem=2 then
st=p2a
ed=p2b
endif
if mem=3 then
st=p3a
ed=p3b
endif
if mem=4 then
st=p4a
ed=p4b
endif
'******************
recordmem:
debug "2s pause before start recording",13,10
PAUSE 2000
FOR ADDR= st TO ed
for w = 0 to 15
ADCIN temp, va
va2=va + (temp>>4)
NEXT
va = (va2 */ 5000 ) >> 2
va=va/10
toggle red
pause 824
debug " Saved value: ", dec va2," - ", dec va," In position ", dec ADDR, 13,10
debug " VA2 = ", dec va2,13,10
I2CWRITE SDA,SCL,CTW,ADDR,[VA.highbyte]
pause 10
ADDR=ADDR+1
I2CWRITE SDA,SCL,CTW,ADDR,[VA.lowbyte]
pause 10
ADDR=ADDR+1
I2CWRITE SDA,SCL,CTW,mem,[addr]
if but1=1 then 'stop recording
pause 600
goto startmenu
endif
toggle led1
toggle led4
NEXT
red=1
return
'******************
erasemenu:
'*****************
eraseblock:
debug "erasing block",dec mem,13,10
red=0
I2Cread SDA,SCL,CTW,mem,[x]
debug "before in position ",dec mem," - ",dec x,13,10
I2CWRITE SDA,SCL,CTW,mem,[0]
pause 500
red=1
return
'******************
memorymenu:
if mem < 4 then
mem=mem+1
else
mem=1
endif
debug DEC mem,13,10
pause 300
return
'******************
statemenu:
if state < 3 then
state=state+1
else
state=1
endif
debug "state change - ", DEC state,13,10
pause 300
return
'******************
end
The code is mostly working but i have encountered some issues.
One of them is the eeprom ( 24LC512 ). I cant access ( read or write ) into it.
I have sucessfuly worked with this eeprom with a PIC12F675 but not with this 16F88 :(
Other issue is reading the temp sensor. If i connect the sensor into PORTa.1 i get no decent readings ( just 1 and 0 ).
But if i change ADCON0, Ansel and Trisa to porta.0 it works.
I'm guessing this is due to some bad configuration i dont know were.
This is why i'm asking you pros to help me and take some questions away.
questions:
1.How do i turn the comparator off ?
I'm guessing that CCP1CON will turn it off.
If this is right, do i still need to add CMCON ?
2. I'm using the internal osc ( with MCLR off ). The OSCCON option should be "10 = Internal RC is used for system clock".
what does the other mean ?
00 = Oscillator mode defined by FOSC<2:0>
01 = T1OSC is used for system clock
3. For AD i have seen 2 diferent ways of programing:
One where we use a line to start the conversion, a line to capture the value and another to stop the conversion.
I always used the ADCin portx,a mode to do the job.
So, for ADCON0, my way i shoud use :
"bit 0 ADON: A/D On bit - 1 = A/D converter module is operating"
and "bit 2 GO/DONE: A/D Conversion Status bit - 1 = A/D conversion in progress (setting this bit starts the A/D conversion)"
Am i right ?
For the next bits :
000 = Channel 0 (RA0/AN0)
001 = Channel 1 (RA1/AN1)
010 = Channel 2 (RA2/AN2)
011 = Channel 3 (RA3/AN3)
100 = Channel 4 (RA4/AN4)
101 = Channel 5 (RB6/AN5)
110 = Channel 6 (RB7/AN6)
this means i can only choose one channel for ADC ? What if i need 2 input channels ?
Finally the last bits:
Since i'm using the internal OSC which one should i use and why ?
bit 7-6 ADCS<1:0>: A/D Conversion Clock Select bits
If ADSC2 = 0:
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (clock derived from the internal A/D module RC oscillator)
If ADSC2 = 1:
00 = FOSC/4
01 = FOSC/16
10 = FOSC/64
11 = FRC (clock derived from the internal A/D module RC oscillator)
Sorry for the long post and many questions
.
i've sucessfuly made some programs already but i'm still in a very rookie position.
I'm working on a program ( pic 16F88 ) to read temp and save it into an external eeprom.
Here's the code and at the end the questions ;)
*****
SSPCON.5 = 0 ; Disable SSP Module
TXSTA.5 = 0 ; Disable AUSART Tx
RCSTA.7 = 0 ; Disable Serial Port
OSCCON = %01111110 'Internal RC w/ I/Os
INTCON=0
PIE1 = 0
'PIE2 = 0
PIR1 = 0 'off
CMCON= 7
CVRCON= 0 'Vref Off
CCP1CON= 0
T1CON= 0
'T2CON = %00000100
'************************************************* ****************************
'DEFINEs
'************************************************* ****************************
@ DEVICE INTRC_OSC
@ DEVICE MCLR_OFF
@ DEVICE PROTECT_OFF
DEFINE osc 4
@ DEVICE CPD_OFF
@ DEVICE LVP_OFF
@ DEVICE BOD_OFF
@ DEVICE PWRT_OFF
@ DEVICE WDT_OFF
'************************************************* ****************************
'ADC
DEFINE ADC_BITS 10 ' Set number of bits in result ( 8 or 10 bits )
DEFINE ADC_CLOCK 3 ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in uS
'************************************************* ****************************
'ADC parameters
ADCON1 =%10000000 'right justify
ANSEL =%00000101
ADCON0 =%11000001
'************************************************* ****************************
INCLUDE "modedefs.bas"
'settings for serial comm
DEFINE debug_reg PORTA
DEFINE debug_bit 1
DEFINE debug_baud 9600
DEFINE debug_mode 1
'************************************************* ****************************
'I/O's
PORTA=0
PORTB=0
TRISA=%00100101
TRISB=%00000011
'************************************************* ****************************
'PINS
temp var PORTA.0
out var PORTA.1
volt var PORTA.2
a3 var PORTA.3
A4 var PORTA.4
but1 var PORTA.5
led2 var PORTA.6
led1 var PORTA.7
but2 var PORTB.0
but3 var PORTB.1
SCL var PORTB.2
SDA var PORTB.3
green var PORTB.4
red var PORTB.5
led4 var PORTB.6
led3 var PORTB.7
************************************************** ***************************
' variables
va var word
va2 var word
tempe var word
volte var word
mem var byte
p1a var word
p1b var word
p2a var word
p2b var word
p3a var word
p3b var word
p4a var word
p4b var word
state var byte
st var word
ed var word
ADDR var word
m1 var byte
m2 var byte
m3 var byte
m4 var byte
slot var bit
w var byte
CTW VAR BYTE
km var byte
ra var word
set1 VAR BYTE
set2 VAR BYTE
rm var byte
x var byte
CLEAR
'************************************************* ****************************
mem=1
state=1
p1a=$10
p1b=$1070
p2a=$1080
p2b=$2140
p3a=$2160
p3b=$3220
p4a=$3230
p4b=$4290
'************************************************* ****************************
start:
high out
debug $0D, $0A
PAUSE 50
CTW=$A0
'************************************************* ****************************
debug "start menu",13,10
startmenu:
I2CREAD SDA,SCL,CTW,1,[m1]
I2CREAD SDA,SCL,CTW,2,[m2]
I2CREAD SDA,SCL,CTW,3,[m3]
I2CREAD SDA,SCL,CTW,4,[m4]
if (mem=1) and (m1=0) then
led1=1
led2=0
led3=0
led4=0
slot=0
endif
if (mem=1) and (m1<>0) then
pause 300
toggle led1
led2=0
led3=0
led4=0
slot=1
endif
if (mem=2) and (m2=0) then
led1=0
led2=1
led3=0
led4=0
slot=0
endif
if (mem=2) and (m2<>0) then
led1=0
pause 300
toggle led2
led3=0
led4=0
slot=1
endif
if (mem=3) and (m3=0) then
led1=0
led2=0
led3=1
led4=0
slot=0
endif
if (mem=3) and (m3<>0) then
led1=0
pause 300
led2=0
toggle led3
led4=0
slot=1
endif
if (mem=4) and (m4=0) then
led1=0
led2=0
led3=0
led4=1
slot=0
endif
if (mem=4) and (m4<>0) then
led1=0
pause 300
led2=0
led3=0
toggle led4
slot=1
endif
if state=1 then
green=0
red=1
endif
if state=2 then
green=1
red=0
endif
if state=3 then
green=1
red=1
endif
if (but1=1) and (state=1) then
gosub readmenu
endif
if (but1=1) and (state=2) then
gosub recordmenu
endif
if (but1=1) and (state=3) then
gosub erasemenu
endif
if but3=1 then
gosub memorymenu
endif
if but2=1 then
gosub statemenu
endif
goto startmenu
'*****************
recordmenu:
debug "Record Menu",13,10
if slot=1 then
goto warningmenu
endif
if mem=1 then
st=p1a
ed=p1b
endif
if mem=2 then
st=p2a
ed=p2b
endif
if mem=3 then
st=p3a
ed=p3b
endif
if mem=4 then
st=p4a
ed=p4b
endif
'******************
recordmem:
debug "2s pause before start recording",13,10
PAUSE 2000
FOR ADDR= st TO ed
for w = 0 to 15
ADCIN temp, va
va2=va + (temp>>4)
NEXT
va = (va2 */ 5000 ) >> 2
va=va/10
toggle red
pause 824
debug " Saved value: ", dec va2," - ", dec va," In position ", dec ADDR, 13,10
debug " VA2 = ", dec va2,13,10
I2CWRITE SDA,SCL,CTW,ADDR,[VA.highbyte]
pause 10
ADDR=ADDR+1
I2CWRITE SDA,SCL,CTW,ADDR,[VA.lowbyte]
pause 10
ADDR=ADDR+1
I2CWRITE SDA,SCL,CTW,mem,[addr]
if but1=1 then 'stop recording
pause 600
goto startmenu
endif
toggle led1
toggle led4
NEXT
red=1
return
'******************
erasemenu:
'*****************
eraseblock:
debug "erasing block",dec mem,13,10
red=0
I2Cread SDA,SCL,CTW,mem,[x]
debug "before in position ",dec mem," - ",dec x,13,10
I2CWRITE SDA,SCL,CTW,mem,[0]
pause 500
red=1
return
'******************
memorymenu:
if mem < 4 then
mem=mem+1
else
mem=1
endif
debug DEC mem,13,10
pause 300
return
'******************
statemenu:
if state < 3 then
state=state+1
else
state=1
endif
debug "state change - ", DEC state,13,10
pause 300
return
'******************
end
The code is mostly working but i have encountered some issues.
One of them is the eeprom ( 24LC512 ). I cant access ( read or write ) into it.
I have sucessfuly worked with this eeprom with a PIC12F675 but not with this 16F88 :(
Other issue is reading the temp sensor. If i connect the sensor into PORTa.1 i get no decent readings ( just 1 and 0 ).
But if i change ADCON0, Ansel and Trisa to porta.0 it works.
I'm guessing this is due to some bad configuration i dont know were.
This is why i'm asking you pros to help me and take some questions away.
questions:
1.How do i turn the comparator off ?
I'm guessing that CCP1CON will turn it off.
If this is right, do i still need to add CMCON ?
2. I'm using the internal osc ( with MCLR off ). The OSCCON option should be "10 = Internal RC is used for system clock".
what does the other mean ?
00 = Oscillator mode defined by FOSC<2:0>
01 = T1OSC is used for system clock
3. For AD i have seen 2 diferent ways of programing:
One where we use a line to start the conversion, a line to capture the value and another to stop the conversion.
I always used the ADCin portx,a mode to do the job.
So, for ADCON0, my way i shoud use :
"bit 0 ADON: A/D On bit - 1 = A/D converter module is operating"
and "bit 2 GO/DONE: A/D Conversion Status bit - 1 = A/D conversion in progress (setting this bit starts the A/D conversion)"
Am i right ?
For the next bits :
000 = Channel 0 (RA0/AN0)
001 = Channel 1 (RA1/AN1)
010 = Channel 2 (RA2/AN2)
011 = Channel 3 (RA3/AN3)
100 = Channel 4 (RA4/AN4)
101 = Channel 5 (RB6/AN5)
110 = Channel 6 (RB7/AN6)
this means i can only choose one channel for ADC ? What if i need 2 input channels ?
Finally the last bits:
Since i'm using the internal OSC which one should i use and why ?
bit 7-6 ADCS<1:0>: A/D Conversion Clock Select bits
If ADSC2 = 0:
00 = FOSC/2
01 = FOSC/8
10 = FOSC/32
11 = FRC (clock derived from the internal A/D module RC oscillator)
If ADSC2 = 1:
00 = FOSC/4
01 = FOSC/16
10 = FOSC/64
11 = FRC (clock derived from the internal A/D module RC oscillator)
Sorry for the long post and many questions
.