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
.
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?
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
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>
Last edited by Darrel Taylor; - 8th November 2007 at 04:07. Reason: mister_e
DT
@ 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 !
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
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
Last edited by ChrisMicro; - 9th January 2008 at 17:26.
You can't teach an old dog new tricks, but I'm always willing to try.
Chris,
The Note says "can be used as an analog meter".
How would you do that?
<br>
DT
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
Last edited by ChrisMicro; - 22nd January 2008 at 12:35.
You can't teach an old dog new tricks, but I'm always willing to try.
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
Last edited by ChrisMicro; - 22nd January 2008 at 13:02. Reason: spel
You can't teach an old dog new tricks, but I'm always willing to try.
DT,
Really nice work! I will be using this on several of my A2D projects!!
Padawan-78
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>
DT
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.
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
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>
DT
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?
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
I like this one. http://www.rentron.com/PICX2.htmDoes 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.
Dave
Always wear safety glasses while programming.
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
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
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
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
Steve
It's not a bug, it's a random feature.
There's no problem, only learning opportunities.
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
Last edited by ChrisMicro; - 4th July 2008 at 05:16.
You can't teach an old dog new tricks, but I'm always willing to try.
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>
DT
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
Last edited by tekniker_erhan; - 7th September 2008 at 16:22.
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.
There's only 1 area for custom characters in the LCD.
So you can only have one Style at a time. Sorry.
<br>
DT
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
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?
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>
DT
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 ?
Bookmarks