Hi mister_e,
you are right...but...
i tryed to comment the lines :
'DEFINE ADC_BITS 8 ' Number of bits in ADCIN result
'ADCON1.7 = 1 ' Right Justify AD result
and
'adcin 2,value
and still the same errors
.
Printable View
Hi mister_e,
you are right...but...
i tryed to comment the lines :
'DEFINE ADC_BITS 8 ' Number of bits in ADCIN result
'ADCON1.7 = 1 ' Right Justify AD result
and
'adcin 2,value
and still the same errors
.
mm, i don't remind to already have this problem... token and line # mmmm
which compiler and which version are you using?
Yup, it's probably the version.
In Post #110 there is an image from Marin that also has the same "Bad Token" errors.
Attachment 1922
The problem was PBP version 2.30 (it's just too old)
HeHe: Beat him by a minute :)
<br>
@ post 110, i think i found 1 solution... or at least some tips... configuration fuse does not seems to be the one for an 16F877 anyways, and the comment should use ; instead of '
for this one... i don't know :( .. still thinking of the version !
yeah...i guess it's the version as my version is old as well.
thanks anyway
.
This is my version of the bar graph.
Code:'****************************************************************
'* Name : Bargraph.BAS *
'* Author : Chris Bezuidenhout *
'* Notice : Copyright (c) 2005 Micro Developments *
'* : All Rights Reserved *
'* Date : 2005/07/19 *
'* Version : 1.0 *
'* URL : http://www.patenttrade.net *
'* E-mail : [email protected] *
'* Mobile : +27-72-795-0107 *
'* Notes : This is a bargraph demo for a 2X20 LCD Display *
'* : it is free to use and distribute by any one *
'* : as long as this Copyright note is not altered or *
'* : removed, can be used as an analog meter. *
'* Device : PIC16F877 can be altered to work on other devices *
'****************************************************************
INCLUDE "Modedefs.Bas"
DEFINE OSC 4 ' Set Xtal Frequency
DEFINE LCD_DREG PORTA ' Set LCD Data port
DEFINE LCD_DBIT 0 ' Set starting Data BIT (0 OR 4) IF 4-BIT bus
DEFINE LCD_RSREG PORTA ' Set LCD Register Select port
DEFINE LCD_RSBIT 4 ' Set LCD Register Select BIT
DEFINE LCD_EREG PORTE ' Set LCD Enable port, for other devices, use PORT A or B
DEFINE LCD_EBIT 0 ' Set LCD Enable BIT
DEFINE LCD_BITS 4 ' Set LCD bus side (4 OR 8 bits)
DEFINE LCD_LINES 2 ' Set number of lines ON LCD
' md Declare the Variables md
counter VAR BYTE
Text VAR BYTE[20]
X VAR BYTE
Y VAR BYTE
PAUSE 500
Main:
'*********Modefy first 5 characters in LCD character generator to display bargraph**********
LCDOut $fe,%1000000 'SET CG RAM ADD.
FOR X =1 TO 8
LCDOUT %10000
next x
FOR X=1 TO 8
LCDOUT %11000
NEXT X
FOR X=1 TO 8
LCDOUT %11100
NEXT X
FOR X=1 TO 8
LCDOUT %11110
NEXT X
FOR X=1 TO 8
LCDOUT %11111
NEXT X
LCDOut $fe,%10000000 'SET DD RAM ADD.
' FOR X = 0 TO 255
' LCDOUT $FE,1,#X,X
' PAUSE 100
' NEXT X
LOOP1: LCDOUT $FE,1,"This is a test"
LCDOUT $FE,$C0 'clear second line and display bar graph
LCDOUT 0 'print first character
for X= 0 TO 19 'change 19 to 15 for 16 character display
PAUSE 100
LCDOUT $FE,$10,1 'move curser back and overprint previous character
PAUSE 100
LCDOUT $FE,$10,2 'move curser back and overprint previous character
PAUSE 100
LCDOUT $FE,$10,3 'move curser back and overprint previous character
PAUSE 100
LCDOUT $FE,$10,4 'move curser back and overprint previous character
PAUSE 100
LCDOUT $FE,$14 'print next character
LCDOUT $FE,0
NEXT X
GOTO LOOP1
END
Chris,
The Note says "can be used as an analog meter".
How would you do that?
<br>
It's a slight variation of Les Johnson's bargraph routine, which is in his PBP book. You load the "graphics" of the bar graph into lcd memory, then print solid bars (or blocks) until the final one which is printed as the mod of 3. The above bar graphs use a resolution of five, which has the disadvantage of a space between each five. Les' uses three, because it makes the space between the characters an unnoticed and integral part of the graph. If you don't have Les' book, then look for one of the Proton samples, because they ship with it.
You have to use a chip with AD channels like the 16F818/819 then say for 1 volt you send your 5th character and for 1.4 volt you will send the 5th and the second character for 2.2 volt you will send the 5th character twice and then your first character so your 5th character is your integer and the first four is your decimals after the point, it give you a .2 resolution .2, .4, .6, .8
You can even draw little 5X7 sprites, like a walking man or any 5X7 picture. I have a small basic compiler with some handy tools, where you can create the picture and get the data for your picture. there is also a seven segment tool, it is free to download from my site, but you can only use the compiler with the programmer from Mikro Elektronika, but the tools is handy. look in the right border for free downloads it is the first item
DT,
Really nice work! I will be using this on several of my A2D projects!!
Hope they work out for you.
You might also want to check out this one ...
Bargraph query thread
http://www.pbpgroup.com/modules/newb..._id=37&forum=2
<br>
Hello ! :)
First of all , thanks for the LCD codes.
I applied the code below , it works fine ; but at the first row ; " Value= XXX " always flickering ; like something is writing over the " Value = XXXX " and it's always flickering.
What is the problem ?
Code:@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, HS_OSC
TRISA=%00000001
TRISB=0
TRISE=0
INCLUDE "LCDbar_INC.bas"
ham var word
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTE
DEFINE LCD_RWBIT 2
DEFINE LCD_BITS 8
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 1000
DEFINE LCD_DATAUS 225
DEFINE ADC_BITS 10
DEFINE ADC_CLOCK 2
DEFINE ADC_SAMPLEUS 100
ADCON1=%10001110
LOW PORTE.2
LCDOUT $FE,1
PAUSE 200
Loop1:
ADCIN 0, ham
ham=1023-ham
LCDOUT $FE,2,"Value = ",DEC ham," "
; syntax- BARgraph Value, Row, Col, Width, Range, Style
@ BARgraph _ham, 2, 0, 16, 1023, lines
PAUSE 50
Goto Loop1
END
Pause 50 is a bit low, try to increase it a little bit more.
karamastik,
LCD_COMMANDUS 1000 seems a little low.
On most displays, the Home command ($FE,2) takes 1.6ms or 1600us.
Try increasing it to 2000, some displays need even more than that.
LCD_DATAUS 225 is pretty High. Should be around 50.
If this one is too high, it won't cause a problem. It'll just slow things down unnecessarily.
<br>
Can I pick someone's brain please?
I'm at the moment trying to make an auto switchover gadget to change from running on Diesel to Veg Oil once certain temperatures have been reached, and to try and work this out I'm using the easypic5 development board.
So far: I have a 16f877A programmed so it will switch certain outputs when certain inputs go high all and well
It even displays what it's doing on the LCD display
What I'd like to incorporate if its possible is this? or a variation of it the Bargraph but use it as a fuel level sensor, i.e. changing position depending on the level of the fuel in the tank (variable resistor)
Does anyone know any code that will do that or give me a starting place to play with?
I know I've got 2 A/D converter inputs on the developement board I can play with that have a 10K pot connected and are configured so I can change the input on either of the RA0, RA1, RA2, RA3, RA4, or RA5 pins and measure the voltage on them ( unfortunatly I'm only just learning about Pic's at the moment and know nothing about A/D and how to use it, I am learning by trying and experimenting But I am a quick learner), so IF anyone has any code they could share with me to show me how to get started with this I'd be grateful :) Thanks
well, once you have the lcd working.. it's just a matter to have few IF-THEN conditions with your ADC value and few HIGH/LOW lines, and you should be in business... maybe i've misundertood something?
I like this one. http://www.rentron.com/PICX2.htmQuote:
Does anyone know any code that will do that or give me a starting place to play with?
It is a little more complicated than ADCIN, but it is still the method I use.
Follow the code with the data sheet and it should become clear how the ADC works. Complete control.
Your forgetting im a Pseudo Blonde :)
I've no idea how to start off with ADC values or how to use them (at the moment) I've found the easiest way to learn something is by following examples that show you how to get started and then playing from there thats how I got the LCD working in the first place, and then the bargraph, then inputs and outputs... learning.. slowly!
No i didn't forget :D
let's see first example in this thread
You just need to monitor Value variable with some IF-THEN statements after ADCIN lineCode:; Initialize your hardware and LCD first.
DEFINE ADC_BITS 8 ' Number of bits in ADCIN result
ADCON1.7 = 1 ' Right Justify AD result
INCLUDE "LCDbar_INC.bas" ' Include the BARgraph routines
Value VAR WORD ' Must be a WORD even though AD is 8bit
LCDOUT $FE, 1 ' Clear Screen
Loop1:
ADCIN 0, Value
LCDOUT $FE,2,"Value = ",DEC Value," "
; syntax- BARgraph Value, Row, Col, Width, Range, Style
@ BARgraph _Value, 2, 0, 16, 255, lines
GOTO Loop1
Code:IF Value>200 then
LCDOUT $FE,2,"VALUE>200 "
endif
Thanks
I think I'm starting to get parts of it I'll try tomorrow properly when my head isn't so tired
however i do have one question, how do you tell the pic what port the input is on?
ie if the pot was connected to portA.0 how would you tell the pic to measure and display the value of that port?
Hope I've said that clearly enough, sometimes I'm better about thinking about things than trying to explain what I mean
ADCIN 0, Value
check the datasheet, PORTA.0 is AN0
I will use it to cell voltage indicator project
Here is my code for monitoring the sensors in a car. Note: this method is more accurate than ADCIN
Code:'****************************************************************
'* Name : CarMonitor.PBP *
'* Author : Chris Bezuidenhout *
'* Notice : Copyright (c) 2007 Micro Developments *
'* : All Rights Reserved *
'* Date : 2007/10/23 *
'* Version : 1.1.1 *
'* URL :http://www.patenttrade.net *
'* : *
'****************************************************************
INCLUDE "Modedefs.Bas"
OSCCON = %01100000 'set the intrc osc change bit 4 to logic 1 for 8 MHz
OSCTUNE = %000000
DEFINE OSC 4 ' Set IRC Frequency
DEFINE ADC_BITS 10 ' Set number of bits in result
DEFINE ADC_CLOCK 1 ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 50 ' Set sampling time in microseconds
IgnIn var word
Altin var word
Oilin var word
TempIn var word
ResIn var word 'Reserve input
IgnOut var portb.0
AltOut var portb.1
OilOut var portb.2
TempOut var portb.3
Buzzer var portb.4
ComO var portb.5
SigOut var portb.6
sp2 var portb.7
Spin1 var porta.6
Spin2 var porta.7
X var byte
Y var byte
TRISA = %11111111 'Porta 0-4 all analog 5 input only pull high
TRISB = %00000000
ADCON0 = %11000001
Pause 2000 ' Wait .5 second
ADCON1 = %10000010 ' Set PORTA analog and RIGHT justify result
OPTION_REG = $7f ' Enable PORTB pullups
pause 500
portb = 0
low Buzzer
Main:
gosub CIgn
gosub CAlt
gosub COil
gosub CTemp
gosub Send
Ignition:
if ignin = 0 then
high Ignout
gosub Send
goto main
endif
if ignin > 300 then
low ignout
goto Alternator
endif
' if ignin > 0 and ignin < 300 then
for y = 1 to 3
gosub CIgn
gosub Send
if ignin > 300 then Alternator
for x = 1 to 2
high Ignout
high buzzer
pause 200
low buzzer
pause 200
next x
pause 1000
next y
' endif
Alternator:
if ignin = 0 then goto main
low ignout
if Altin > 1020 then
high altout '?????????Kalibreer
for y = 1 to 3
gosub CAlt
gosub Send
if altin < 1020 then Oil
for x = 1 to 4
high buzzer
pause 200
low buzzer
pause 200
next x
pause 1000
next y
endif
Oil:
if ignin = 0 then goto main
low altout
if Oilin > 10 then 'This variable have to be calibrated to sensor unit
high Oilout 'for a plain on/of it must be set to 0, the pot at minimum
for y = 1 to 3 'if there is some contact resistance it can be calibrated acordingly
gosub COil 'For a analog (resistive) sensor it have to be calibrated to
gosub Send 'the sensor
if oilin < 10 then Temperature 'So is this one
for x = 1 to 6
high buzzer
pause 200
low buzzer
pause 200
next x
pause 1000
next y
endif
Temperature:
if ignin = 0 then goto main
low Oilout
if tempin < 85 then
high tempout
for y = 1 to 3
gosub CTemp
gosub Send
if tempin > 85 then main
for x = 1 to 8
high buzzer
pause 200
low buzzer
pause 200
next x
pause 1000
next y
endif
low tempout
goto main
CIgn:
ADCON0 = %11000101 'start ADC A0
gosub notdone
IgnIn.highbyte = ADRESH
IgnIn.Lowbyte = ADRESL
write 0,ignin.highbyte
write 1,ignin.lowbyte
return
CAlt:
ADCON0 = %11001101 'start ADC A1
gosub notdone
altin.highbyte = ADRESH
altin.Lowbyte = ADRESL
write 2,Altin.highbyte
write 3,Altin.lowbyte
return
COil:
ADCON0 = %11010101 'start ADC A2
gosub notdone
oilin.highbyte = ADRESH
oilin.Lowbyte = ADRESL
write 4,oilin.highbyte
write 5,oilin.lowbyte
return
CTemp:
ADCON0 = %11011101 'start ADC A3
gosub notdone
TempIn.highbyte = ADRESH
TempIn.Lowbyte = ADRESL
write 6,tempin.highbyte
write 7,tempin.lowbyte
return
CRes:
ADCON0 = %11100101 'start ADC A4
gosub notdone
resin.highbyte = ADRESH
resin.Lowbyte = ADRESL
Return
Send:
serout SigOut, N2400,["A",IgnIn.highbyte,IgnIn.lowbyte,altin.highbyte,altin.lowbyte,Oilin.highbyte,Oilin.lowbyte,Tempin.highbyte,Tempin.lowbyte,resin.highbyte,resin.lowbyte]
return
notdone: Pause 5
If ADCON0.2 = 1 Then notdone' Wait for low on bit-2 of ADCON0, conversion finished
return
end
hi darrel...
i m using pbp 2.50b compiler and using pbpl.
how can i use your include file with pbpl?
For each DIV32, change it to a normal divide ...
Was: Limit1 = DIV32 10
To: Limit1 = Limit1 / 10
or you can combine them with the previous statements
Limit1 = (BAR_range * 3) / 10
for all the occurances.
And change the WORD vars to LONG.
<br>
hi friends
I am a new member I can little speak english maybe my errors I am sorry
My problem is LCD bargraph How I can on pictures project. on pictures LCD 2x16 char , LCD has 32 bars per char has two bars project has two buttons minus and plus I need this projects pic basic code Can you help me. Already tahnks
I TRIED YOUR INCLUDE FILE FOR PBPL AND MADE WHAT U SAID.
IT'S WORKING GOOD THANKS.
but there is a problem ; when i want to use different bar type on lcd for different rows bar types are mixing.Code:'****************************************************************
'* Creates a variable sized BAR-graph anywhere on the screen *
'****************************************************************
'* Name : LCDbar_INC.bas *
'* Author : Darrel Taylor *
'* Notice : Copyright (c) 2005 *
'* Date : 9/8/2005 *
'* Version : 1.0 *
'* Notes : Maximum Range is 32768 *
'* : Range must always be a Constant *
'* : Value must always be a WORD variable *
'* : *
'****************************************************************
; default
BAR_width VAR BYTE : BAR_width = 16 ; Width of the BARgraph 16
BAR_range VAR LONG : BAR_range = 100 ; Range of Values (0-100) 100 ;;;;;;;;;;;
BAR_row VAR BYTE : BAR_row = 1 ; Row location (1-4) 1
BAR_col VAR BYTE : BAR_col = 0 ; Column location (0-15) 0
BAR_value VAR LONG : BAR_value = 0 ; Current BAR value 0 ;;;;;;;;;;;
BAR_style VAR BYTE : BAR_style = 1 ; 1=lines, 2=boxed, 3=blocks 1
; --- Temporary vars ----
BARtemp VAR LONG ;;;;;;;;
Remainder VAR LONG ;;;;;;;;
BARloop VAR BYTE
LastCharset VAR BYTE : LastCharset = 0
Limit1 VAR LONG ;;;;;;;;
GOTO overBAR ; Skip over Subroutines
ThreeBARS CON 0 ; Identify the Custom Characters
TwoBARS CON 1
OneBAR CON 2
ASM
lines = 0x10000001 ; Define the Styles
boxed = 0x10000002
blocks = 0x10000003
ENDASM
; --- lines Style custom chars ----
CharsetLines:
LCDOut $FE,$40,REP $15\8 ; Custom char 0 - 3 lines |||
LCDOut $FE,$48,REP $14\8 ; Custom char 1 - 2 lines ||
LCDOut $FE,$50,REP $10\8 ; Custom char 2 - 1 line |
RETURN
; --- boxed Style custom chars ----
CharsetBoxed:
LCDOut $FE,$40,$1F,REP $15\6,$1F ; III
LCDOut $FE,$48,$1C,REP $14\6,$1C ; II
LCDOut $FE,$50,REP $10\8 ; I
RETURN
; --- blocks Style custom chars ----
CharsetBlocks:
LCDOut $FE,$40,REP $1F\8
LCDOut $FE,$48,REP $1C\8
LCDOut $FE,$50,REP $10\8
RETURN
; ----- Show the BAR graph -----------------------------------------------------
ShowBAR:
IF BAR_width = 0 then BARdone
if LastCharset <> BAR_style then ; If the Style has changed ?
LastCharset = BAR_style
SELECT CASE BAR_style ; Load the new custom chars
CASE 1 : GOSUB CharsetLines
CASE 2 : GOSUB CharsetBoxed
CASE 3 : GOSUB CharsetBlocks
END SELECT
endif
@ ifdef LCD4X20
LOOKUP BAR_row,[$80,$80,$C0,$94,$D4],BARtemp
@ else
LOOKUP BAR_row,[$80,$80,$C0,$90,$D0],BARtemp
@ endif
LCDOUT $FE, BARtemp + BAR_col ; Move cursor to start of the BAR
;;;;;;;;BARtemp = BAR_value * BAR_width ; calc the char position
;;;;;;;;BARtemp = DIV32 BAR_range
BARtemp = (BAR_value * BAR_width)/BAR_range ; CHANGED
Remainder = R2
For BARloop = 0 to BAR_width -1
SELECT CASE BARtemp
CASE IS > BARloop
LCDOUT ThreeBARS ; send 3 bars |||
CASE IS < BARloop
LCDOUT " " ; clear to end of BARwidth
CASE IS = BARloop
;;;;Limit1 = BAR_range * 6
;;;;Limit1 = DIV32 10
Limit1 = (BAR_range * 6)/10 ; CHANGED
if Remainder >= Limit1 then
LCDOUT TwoBARS ; send 2 bars ||
else
;;;;Limit1 = BAR_range * 3
;;;;Limit1 = DIV32 10
Limit1 = (BAR_range * 3)/10 ; CHANGED
if Remainder >= Limit1 then ; 30%
LCDOUT OneBAR ; send 1 bar |
else
LCDOUT " " ; no bars
endif
endif
END SELECT
NEXT BARloop
BARdone:
RETURN
ASM
; --- The main macro for creating BARgraphs ------------------------------------
BARgraph macro Value, Row, Col, Width, Range, Style
MOVE?CW Range, _BAR_range ; Range MUST be a constant
MOVE?WW Value, _BAR_value ; Value MUST be a WORD variable
if (Row < 5) ; Row is a constant
MOVE?CB Row, _BAR_row
else ; Row is a variable
MOVE?BB Row, _BAR_row
endif
if (Col < 16) ; Is Col a constant ?
MOVE?CB Col, _BAR_col
else ; NO, it's a variable
MOVE?BB Col, _BAR_col
endif
if (Width <= 40)
MOVE?CB Width, _BAR_width
else
MOVE?BB Width, _BAR_width
endif
if ((Style >= lines) & (Style <= blocks)) ; Is Style a valid constant ?
MOVE?CB Style, _BAR_style
else ; NO, treat it like a variable
MOVE?BB Style, _BAR_style
endif
L?CALL _ShowBAR
endm
ENDASM
overBAR:
example:
row1 blocks
row2 lines
row3 boxed
row4 blocks
when use it like this all rows are one type bar.
Great! Glad you got it working, and thanks for the updated code. http://www.picbasic.co.uk/forum/images/icons/icon14.gif
There's only 1 area for custom characters in the LCD.
So you can only have one Style at a time. Sorry.
<br>
turkish mean
özdemir dostum bu program nasıl çalışıyor uygulama şemasını ekleye bilirmisin banada resimdeki 2 butonlu bargraph uygulaması lazım yukarıda resimleri ekledim bu programı 2 butonlu şekilde düzenleyebilirmiyiz. şimdiden teşekkürler bide ingilizce yazmaya çalışım ayıp olmasın
english mean ,maybe my errors, Im sorry
özdemir my friend,how is run this program can you attach application circuit I need on picture bargraph application with two buttons How I can make this project can you helpme already thanks
Great stuff :)
Worked on the first try in my latest program, which I didn't really expected :)
I started to write something own, until I remembered that I had a vague memory of seeing something like this on the forum, and here it was, ready to be used :)
Would be really nice to have a logarithmic scale too, I didn't really understood everything people wrote about logarithmic, did anyone come up with a quick software-only solution ?
In software you need a lot of maths. So better use a hardware solution. Faster and wide dynamics (up to 64db).
Ioannis
But how do I do that ? a logarithmic filter ?
If you mean in hardware, please look at previous post:
http://www.picbasic.co.uk/forum/show...1&postcount=66
The chips include a logarithmic amplifier. So you take the output of this amplifier and feed it in the analog converter of the PIC. At the input you feed the analog signal either directly or through an active rectifier.
Ioannis
Several times in this thread people have mentioned log amplifiers for audio signals.
See thatcorp.com THAT2252
http://thatcorp.com/datashts/2252data.pdf
The output is +0.3 to –0.3 volts over a 100db range. A simple op-amp will amplify the 0.6 volt signal and add an offset to get 0 to 5 volts.
Nice chip, but I believe the other three (3089, 3189 and NE604) are more convienient since they work with single supply and are much wider in freq. range.
Ioannis
The compiler signalise error in line 29, no is alabel?
:rolleyes:
Line 29 is GOTO overBAR, and overBAR: is the last line in the include file.
Check the end of the file and make sure overBAR is there. If not, you may have received a partial download. Try downloading it again.
<br>
What kind of licence did u put on your code Darrel ?
I currently making a little project for a contest in a swedish electronics forum, and I really would like to use a LCD bargraph, and the rules states that I only can use includes that are "GPL or more free.", can I use this, or do I have to write something much more ugly myself ? :)