Hallo,
Ik ben bezig met een versterker-projectje, daarvoor zou ik graag een vu-meter op een PLED display willen maken.
Om de zaak aan te sturen zal wel een PIC nodig zijn, neem ik aan?!
Is iemand al eens een soortgelijk project tegengekomen ergens, ben namelijk nog niet zo'n programmeer-held.
Dank!
LaStei
carpe cerevisi
Je ontkomt inderdaad niet om een uC heen (kan een PIC maar enig andere processor met een AD converter zou moeten werken), maar zo moeilijk is programeren niet. Wat je wilt doen in hele kleine stapjes breken en die op een logische volgorde weer achter elkaar zetten. Voor die VU meter zou dat moetne zijn:
Start AD converter, lees waare van AD converter, bepaal welke elementen er gestuurd moeten worden, stuur comando naar display, Als je al bekend met met Basic kijk eens op de Voti website, die hebben daar een cursus. En voor specifiekere vragen heb je hier het forum.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
In mikrobasic zit er een voorbeeldje van zo'n programma, bij de user example's (Adc bargraph van Yeslam), was oorspronkelijk voor een 18F PIC maar is doodsimpel aan te passen naar wat je maar wil.
Het valt trouwens onder de 2KWords limiet, je kan dus gewoon met de gratis versie van mikrobasic aan de slag.
program ADC_Bargraph
dim aa as string[20]
t as word
tlong as longint
b as byte
ch as byte
accum as byte
char_ram as byte
t_temp as word
Column_Position as byte
Column_Value as byte
sub procedure adclcdwrite
t = ADC_READ(2) 'Read ADC2
If t <> t_temp then 'Check for change...if not skip all LCD writing
t_temp = t
'"***************************************************************************
'"* MIKROELEKTRONIKA "ADC_2_LCD" EXAMPLE ROUTINE FOR LCD LINE 2 *
'"***************************************************************************
LCD_OUT(2,2,aa) 'print string a on LCD, 2nd row, 1st column
tlong = t*5000
t = (tlong >> 10)
ch = t div 1000 'prepare value for diplay
LCD_CHR(2,10,48+ch) 'write ASCII at 2nd row, 9th column
LCD_CHR(2,11,".")
ch = (t div 100) mod 10
LCD_CHR(2,12,48+ch)
ch = (t div 10) mod 10
LCD_CHR(2,13,48+ch)
ch = t mod 10
LCD_CHR(2,14,48+ch)
LCD_CHR(2,15,"V")
'"****************************************************************************
'"* ADC_2_BARGRAPH ROUTINE FOR LCD LINE 1 *
'"****************************************************************************
Column_Position = (t_temp DIV 65) + 1 'which column is ADC value
Column_Value = t_temp MOD 65 'what value in column
for b = 1 to 16
If b < Column_Position Then 'fill in dark columns behind ADC value
LCD_CHR(1, b, $04)
Else 'clear columns ahead of ADC value
LCD_CHR(1, b, $FE)
end if
next b
LCD_CHR(1, Column_Position, Column_Value DIV 13) 'Place Character Value in proper column
end if
end sub
main:
PORTD = 0 ' clear portD
TRISD = 0 ' designate portd as output (LCD is connected to portd)
intcon = 0 ' disable all interrupts
TRISA = $FF
LCD_INIT(PORTD) 'initialize (4-bit interface connection)
LCD_CMD( LCD_CURSOR_OFF) 'send command to LCD (cursor off)
LCD_CMD(LCD_CLEAR) 'send command to LCD (clear LCD)
' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' " Create 5 custom "character" bars, each filled progressively dark from left to right "
' " Each character is 8 lines tall x 5 pixels wide = 8 bytes "
' " This routine fills 40 bytes (5 characters x 8 bytes) starting with LCD Character RAM address $00 "
' " LCD Character RAM Address $00 is the start of Character $00, and then each new character every 8 bytes "
' """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
'*************************************************************************************************************
LCD_CMD(%01000000) 'set the CGRam address to Char 0, 1st row
ch = $20
accum = 0
For char_ram = 1 To 5 'fill all bytes consecutively
ch = ch >> 1
accum = accum + ch
For b = 1 To 8
LCD_CHR_CP(accum) 'CGRam automatically increments to next RAM address after LCD_CHR_CP
next b
next char_ram
LCD_CMD(LCD_RETURN_HOME) 'exits CGRam writing mode
'"*************************************************************************************************************"
aa = "voltage as "
t_temp = 0
while true
adclcdwrite
Delay_ms(20) 'Delay helps stabilize a jittery display
wend
end.
[Bericht gewijzigd door Videomodulator op ]
Ah, bedankt!
Hiermee zal ik eens wat gaan spelen en idd ik zit ook een beetje te kijken met die Trial-limiet.
Het ziet er niet makkelijk uit, maar met wat experimenteren moet er toch wel wat van te maken zijn. 
Om nog even terug te komen op dit verhaal:
Dit is toch niet wat ik zoek eigenlijk, de bedoeling is dat de schaal van de meter logaritmisch is.
Volgens mij komt er dan een hele hoop rekenwerk in het Pic programma te zitten en ook nog eens best moeilijk!
Daarom had ik het volgende "simpele" idee:
* Gewoon een led-vu rond een Lm3915 opbouwen, dan heb ik mijn gewenste schaalverdeling.
* De uitgangen van de LM naar de ingangen van de PIC
* De PIC misbruiken voor enkel-en-alleen de LCD sturing
Beetje omslachtig misschien, maar wat denken jullie ervan?
Is dit uit te voeren of gewoon een belachelijk idee 
Zal wel kunnen werken, maar je kunt in het pic-programma gewoon een tabelletje met de log-waarden opnemen. Dan heb je die LM3915 niet nodig.
Ah, dus eigenlijk een lijstje met constanten aanmaken en die steeds vergelijken met de gemeten waarde.
Of kun je die waarden beter in een array stoppen misschien?
Hmmm, toch wel het proberen waard.
Ben benieuwd of ik eruit ga komen.
Geen LOG10 commando aanwezig?
PICbasic heeft dat voor de 16-bitters, traag en geheugenvretend...
[Bericht gewijzigd door Henry S. op ]