tacbanon
- 22nd September 2012, 12:50
Hmmm,
The module is working.
You know how to use the ADC.
I guess we will have to see your code to spot the problem...
Hi, thanks for your time. Thought it is best if I give a little description to what I'm trying to achieve. I'm setting 3 buttons to navigate to some menus to display information for the accelerometer, ambient, Temp, Barometric pressure, battery level, RTC, GPS and GSM and Bluetooth connectivity on the 4x20 LCD. SdCard is used for data logging later on.
My codes mostly came from this forum(thanks to u all!), BTW currently I'm using the hyper terminal to navigate thru the menus...so here it is.
'************************************************* ***************
asm
__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_ON_2L & _BORV_2_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_OFF_2H
__CONFIG _CONFIG3H, _MCLRE_ON_3H & _LPT1OSC_OFF_3H & _PBADEN_OFF_3H & _CCP2MX_ON_3H
__CONFIG _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _ICPRT_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
endasm
DEFINE OSC 48
DEFINE HSER_RCSTA 90h ' enable serial port,
DEFINE HSER_TXSTA 20h ' enable transmit,
DEFINE HSER_BAUD 9600
DEFINE HSER_CLOERR 1 ' automatic clear overrun error
'::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
INCLUDE "MODEDEFS.BAS" ' Include Shiftin/out modes
INCLUDE "DT_INTS-18.bas" ' Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ' Include if using PBP interrupts
'::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
' Variable definition
'::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::
PortB = %00000000
TRISB = %00000000
TRISC = %10000000 ' PORTC.7 is the RX input, PORTC.6 is the TX output
RCIF VAR PIR1.5 ' Receive interrupt flag (1=full , 0=empty)
TXIF VAR PIR1.4 ' Transmit interrupt flag (1=empty, 0=full)
led var PORTD.5
StatusLed var PORTD.6
StatusLed1 var PORTD.7
holdoff var word
SerialData var byte
SerialInput var byte[50]
PortB = 0
c var byte 'counter1
cnt var byte 'counter2
cnt1 var byte 'counter3
cnt1=0
i var byte
c = 0
OptionSel var byte[1]
OptionSel = "0"
flag1 var byte
flag1 = 0
'clear
'((((((((((((((((((((((((((((((((((((((()))))))))) )))))))))))))))))))))))))))))
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR1_INT, _ToggleLED1, PBP, yes
INT_Handler RX_INT, _Getbytes, PBP, no
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
@ INT_ENABLE RX_INT ; enable RX_INT interrupts
'*******Internal interrupt
T1CON = $31 ; Prescaler = 8, TMR1ON
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
'***LCD Definitions
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 5
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 4
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
' Alias PIC pins and registers for SD/MMC card
SD_WE Var PORTA.7 ' SD card write protect A4
SD_WE_TRIS Var TRISA.7 ' SD card write protect direction
SDI Var PORTC.1 ' SPI data in PORTB.0
SDI_TRIS Var TRISC.1 ' SPI data in direction TRISB.0
SCL Var PORTC.2 ' SPI clock PORTB.1
SCL_TRIS Var TRISC.2 ' SPI clock direction TRISB.1
SD_CS Var PORTC.3 ' SD card chip select PORTB.3
SD_CS_TRIS Var TRISC.3 ' SD card chip select direction TRISB.3
SD_CD Var PORTB.6 ' SD card detect PORTB.4
SD_CD_TRIS Var TRISB.6 ' SD card detect direction TRISB.4
SDO Var PORTC.0 ' SPI data out
SDO_TRIS Var TRISC.0 ' SPI data out direction
Include "SDFS.PBP"
;SDC_UseHardSPI = TRUE ' Use hardware SSP port for SPI.
SDC_UseHardSPI = FALSE ' Use hardware SSP port for SPI.
'ADCON1 = 15 ' All I/O pins digital
'--Added Pic settings
UCON.3 = 0 'USB module disabled
UCFG.3 = 1 'USB transceiver disabled
CCP1CON=0 ' Capture/Compare OFF
CCP2CON=0 '
'ADCON1 = 15 ' All I/O pins digital
Pause 100
;----------------------------------------------------------------------------
;--For ADC modules
define ADC_BITS 8
define ADC_CLOCK 3
define ADC_SAMPLEUS 50
ambval var byte
batval var byte
axval var byte
ayval var byte
azval var byte
TRISA = %00111111
ADCON1 = %00001001
;----------------------------------------------------------------------------
' FSInit initializes the card and reads all the preliminary information from it
Gosub FSInit
Hserout ["Init: ", Dec FAT_error, " ", Dec SDC_status, " ", Dec SDC_response, $d, $a]
If (FAT_error != 0) Then Stop
' This section defines a specific short (8.3) filename
' Note that spaces are use in empty elements and must be upper case for Windows
FAT_FileName[0] = "R"
FAT_FileName[1] = "E"
FAT_FileName[2] = "C"
FAT_FileName[3] = "O"
FAT_FileName[4] = "R"
FAT_FileName[5] = "D"
FAT_FileName[6] = "S"
FAT_FileName[7] = " "
FAT_FileName[8] = "T"
FAT_FileName[9] = "X"
FAT_FileName[10] = "T"
' Set file time to 8:30:10 and date to 1/1/2008
FAT_seconds = 5
FAT_minutes = 30
FAT_hours = 8
FAT_day = 1
FAT_month = 1
FAT_year = 28
;-------------------------RTC--------------------------------------------------
'RTC pins on 4550
SDA Var PORTB.6
SCLA Var PORTB.7
'Try to change
;Led1 var PortB.2
' Allocate variables
RTCYear Var Byte
RTCMonth Var Byte
RTCDate Var Byte
RTCDay Var Byte
RTCHour Var Byte
RTCMin Var Byte
RTCSec Var Byte
RTCCtrl Var Byte
;------------------------------------------------------------------------------
SEC_O VAR BYTE: SEC_T VAR BYTE:
MIN_O VAR BYTE: MIN_T VAR BYTE
HR_O VAR BYTE: HR_T VAR BYTE:
MON_O VAR BYTE: MON_T VAR BYTE
DATE_O VAR BYTE: DATE_T VAR BYTE:
DAY_O VAR BYTE: DAY_T VAR BYTE:
YR_O VAR BYTE: YR_T VAR BYTE
CMCON = %00000111 ' Comparators = off
'--------------------------Custom characters
LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250
LCDOUT $FE,$40,$1F,$15,$11,$11,$15,$15,$15,$1F ' Cust Char #0
LCDOUT $FE,$48,$1F,$1F,$1F,$11,$15,$15,$11,$1F ' Cust Char #1
LCDOUT $FE,$50,$1F,$17,$17,$11,$15,$15,$11,$1F ' Cust Char #2
LCDOUT $FE,$58,$1F,$1F,$1F,$11,$15,$15,$11,$1F ' Cust Char #3
LCDOUT $FE,$60,$1F,$1B,$1B,$11,$1B,$1B,$19,$1F ' Cust Char #4
LCDOUT $FE,$68,$1F,$1F,$1F,$1F,$1F,$1F,$1F,$1F ' Cust Char #5
LCDOUT $FE,$70,$1F,$1F,$1F,$15,$15,$15,$1B,$1F ' Cust Char #6
LCDOUT $FE,$78,$1F,$13,$1B,$1B,$1B,$1B,$11,$1F ' Cust Char #7
pause 300
' Initialize LCD
;LCDOUT $FE,1:FLAGS=0:PAUSE 250:LCDOUT $FE,1:PAUSE 250
'Set initial time `
RTCYear = $12
RTCMonth = $09
RTCDate = $20
RTCDay = $18
RTCHour = $21
RTCMin = $55
RTCSec = 0
RTCCtrl = 0
goto mainloop
' Subroutine to write time to RTC
set:
I2CWrite SDA,SCLA,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCDay,RTCDate,RTCMonth,RTCY ear,RTCCtrl]
return
' Subroutine to read time from RTC
gettime:
I2CRead SDA,SCLA,$D0,$00,[RTCSec,RTCMin,RTCHour,RTCDay,RTCDate,RTCMonth,RTCY ear,RTCCtrl]
;--------------------------------------------------------------------------------------------
; we prepare this for later use
SEC_T = RTCSec & $70
SEC_T = SEC_T>>4
SEC_O = RTCSec & $0F
MIN_T = RTCMin & $70
MIN_T = MIN_T>>4
MIN_O = RTCMin & $0F
HR_T = RTCHour & $70
HR_T = HR_T>>4
HR_O = RTCHour & $0F
MON_T = RTCMonth & $70
MON_T = MON_T>>4
MON_O = RTCMonth & $0F
DATE_T = RTCDate & $70
DATE_T = DATE_T>>4
DATE_O = RTCDate & $0F
DAY_T = RTCDay & $70
DAY_T = DAY_T>>4
DAY_O = RTCDay & $0F
YR_T = RTCYear & $70
YR_T = YR_T>>4
YR_O = RTCYear & $0F
pause 500
;-------------------------------------------------------------------------
' FSInit initializes the card and reads all the preliminary information from it
' Open a file for write
FAT_mode = "a" ' Write mode
Gosub FSfopen ' Open file pointed to by Byte array FAT_FileName
hserout ["Open for write: ", Dec FAT_error, $d, $a]
If (FAT_error != 0) Then Stop
FAT_src[0] = ">"
FAT_src[1] = "T"
FAT_src[2] = "E"
FAT_src[3] = "S"
FAT_src[4] = "T"
FAT_src[5] = "D"
FAT_src[6] = "A"
FAT_src[7] = "T"
FAT_src[8] = "A"
FAT_src[9] = 13
FAT_src[10] = 10
FAT_count = 11
Gosub FSfwrite
hserout [ "Write ", Dec FAT_error, $d, $a]
If (FAT_error != 0) Then Stop
' Close file
Gosub FSfclose
hserout [ "Close ", Dec FAT_error, $d, $a]
;--------------------------------------------------------------------------
Return
mainloop:
'Gosub gettime ' Read the time from the RTC
c = 0 ' counter
Select case OptionSel
case "0"
gosub page0
case "1"
gosub page1
case "2"
gosub page2
case "3"
gosub page3
case "4"
gosub page4
case "5"
gosub page5
case "6"
gosub page6
End select
Goto mainloop
'((((((((((((((((((((((((((((((((((((((()))))))))) )))))))))))))))))))))))))))))
'ISR for RX_int interrupt
'((((((((((((((((((((((((((((((((((((((()))))))))) )))))))))))))))))))))))))))))
Getbytes:
While RCIF = 1 ' clear the buffer
c = c + 1
HSERIN 100,error,[Serialdata] ' take it
'--HSEROUT [Serialdata] ' take it out
SerialInput[c] = Serialdata
LCDOUT
select case Serialdata ' What to do with that data???
case "0"
Hserout ["Option 0",13]
OptionSel = "0"
flag1 = 0
case "1"
Hserout ["Option 1",13]
OptionSel = "1"
flag1 = 0
case "2"
Hserout ["Option 2",13]
OptionSel = "2"
flag1 = 0
case "3"
Hserout ["Option 3",13]
OptionSel = "3"
flag1 = 0
case "4"
Hserout ["Option 4",13]
OptionSel = "4"
flag1 = 0
case "5"
Hserout ["Option 5",13]
OptionSel = "5"
flag1 = 0
case "6"
Hserout ["Option 5",13]
OptionSel = "6"
flag1 = 0
End select
Wend
@ INT_RETURN
error:
Toggle led
@ INT_RETURN
end
'---[TMR1 - interrupt handler]--------------------------------------------------
' We try to place the module reading process here
ToggleLED1:
cnt = cnt + 1
if cnt = 10 then
TOGGLE StatusLed ' slower process
cnt = 0
Endif
cnt1 = cnt1 + 1
if cnt1 = 5 then
TOGGLE StatusLed1 ' faster process
ADCIN 0, ambval
'-------------
ADCIN 1, batval
'-------------
ADCIN 2, axval
ADCIN 3, ayval
ADCIN 5, azval
hserout ["Light ", DEC ambval," Bat ", Dec batval, " X: ",Dec axval," Y: ",Dec ayval," Z: ",Dec azval, 13] ' just to see it on the hyperterminal
cnt1 = 0
Endif
@ INT_RETURN
'---[TMR1 - interrupt handler]--------------------------------------------------
page0:
if flag1 < 1 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe,$80,0,1,2,3,4,5,6,7,5,5,5,5,5,5,5,5,5,"[1]"
LCDOUT $fe, $C0, "School Demo"
LCDOUT $fe, $94, "Designer: Tacbanon"
LCDOUT $fe, $D4, "Command: "
PAUSE 100
Return
page1:
Gosub gettime ' Read the time from the RTC
pause 100
if flag1 < 1 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe, $80, "RTC and BAT",5,5,5,5,5,5,"[2]" ' Display PULSVARs
LCDOUT $fe, $C0, "Date:",HEX DATE_T, Hex DATE_O,"/",Hex MON_T,Hex MON_O,"/",Hex YR_T, Hex YR_O
LCDOUT $fe, $94, "Time:",hex2 RTCHour, ":", hex2 RTCMin, ":", hex2 RTCSec
LCDOUT $fe, $D4, "Bat1: "
LCDOUT $fe, $D4, "Bat1: ", Dec batval
Pause 50
Return
page2:
if flag1 < 2 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe, $80, "ACCELEROMETER",5,5,5,5,"[3]"
LCDOUT $fe, $C0, "x: ",Dec axval
LCDOUT $fe, $94, "y: ",Dec ayval
LCDOUT $fe, $D4, "z: ",Dec azval
PAUSE 50
Return
page3:
if flag1 < 2 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe, $80, "MISC SENSORS",5,5,5,5,5,"[4]"
LCDOUT $fe, $C0, "Temp: "
LCDOUT $fe, $94, "Amb: "
LCDOUT $fe, $94, "Amb: ",Dec ambval
LCDOUT $fe, $D4, "Bmtr: "
PAUSE 50
Return
page4:
if flag1 < 2 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe, $80, "POSITIONING",5,5,5,5,5,5,"[5]"
LCDOUT $fe, $C0, "Lat: "
LCDOUT $fe, $94, "Lng: "
LCDOUT $fe, $D4, "Knot: "
PAUSE 50
Return
page5:
if flag1 < 2 then
gosub LcdClear
flag1 = flag1+1
endif
'LCDout $Fe, 1
LCDOUT $fe, $80, "GSM and BT",5,5,5,5,5,5,5,"[6]"
LCDOUT $fe, $C0, "Man: "
LCDOUT $fe, $94, "Sig: "
LCDOUT $fe, $D4, "BT stat: "
PAUSE 50
Return
page6:
if flag1 < 2 then
gosub LcdClear
flag1 = flag1+1
endif
LCDOUT $fe, $80, "SDCARD Info",5,5,5,5,5,5,"[7]"
LCDOUT $fe, $C0, "No. write: "
LCDOUT $fe, $94, "No. dump: "
LCDOUT $fe, $D4, "Status: "
PAUSE 50
Return
LcdClear: ' clear LCD
LCDOUT $fe, $80, " "
LCDOUT $fe, $C0, " "
LCDOUT $fe, $94, " "
LCDOUT $fe, $D4, " "
pause 400
return
/tacbanon
Powered by vBulletin® Version 4.1.7 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.