PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Vu meter



Carlos31
30.11.2008, 15:33
Guten tag:
Ich hab ein kleines project für die weihnachtsfeier von meine firma es ist ein applausometer mit 16 stufen , also brauche 16 pins von mein atmega 16, ich verwende port c und d, ich hab der code vom bascom beispiel Bg30db led ein bischen modifiziert , ich benutze ein analogeingang (ADC 0), an dieser eingang hab ich ein microfon mit ein transistor als verstärker angeschlossen.
es funktioniert alles , aber ich täte mir wünschen das der spitzenwert erhalten bleibt für ein paar sekunden , und das die leds ein bischen ruhiger werden , hatt vielleicht jemand von euch schon so was gebaut ?
Zum project , es sind 48 reihen und 11 spalten mit 10 mm leds bestückt , also 528 ultrahelle leds :-).
Möchte es ansteuern mit 3 led reihen pro pin , dazu will ich verwenden ein uln 2803.
Wenn jemand ideen oder vorschläge hatt bitte her damit :-)





'--------------------------------------------------------------------------------
'name : BG30dB_LED.bas
'copyright : (c) 1995-2005, MCS Electronics
'purpose : create a logarithmic LED bar graph dB (VU) meter
'micro : AT90S2313-10
'suited for demo : yes
'commercial addon needed : no
'use in simulator : possible
'
' Author : Ger langezaal
'
'---[ Small program description ]-----------------------------------------------
'
' This program is written to create a logarithmic LED bar graph dB (VU) meter
' with peak-hold and drop-down. Scale range is 30dB in 3dB steps.
' Log conversion is done with the analog comparator on a RC discharge curve.
' C1 is charged each 4mS with PB0 as output on a Timer0 Interrupt.
' Then PB0 is set to AIN0 (analog comparator +input) Timer1 is reset
' and start counting, C1 will be discharged by R1.
' Timer1 is counting until AIN0 < AIN1.
' Analog Comparator Output = ACSR bit 5.
' Timer1 value is in T1 stored for calculation.
'
' Display mode is set with PD6 (pin 11).
' 1 = bar mode
' 0 = dot mode (for low current applications)

'---[ LED to AVR connections ]--------------------------------------------------
'
' AVR Resistor Cathode dB
' Port pin Ohm LED nr Scale
' PD5 9 >--[680]--> 11 +6
' PD4 8 >--[680]--> 10 +3
' PD3 7 >--[680]--> 9 0
' PD2 6 >--[680]--> 8 -3
' PD1 3 >--[680]--> 7 -6
' PD0 2 >--[680]--> 6 -9
' PB7 19 >--[680]--> 5 -12
' PB6 18 >--[680]--> 4 -15
' PB5 17 >--[680]--> 3 -18
' PB4 16 >--[680]--> 2 -21
' PB3 15 >--[680]--> 1 -24
' PB2 14 >--[680]--> 0 infinit
'
' All LED Anodes to +5 Volt
'
'---[ Analog comparator inputs ]------------------------------------------------
'
'
' Meter DC input >-------[ R2 ]-------> PB1 (AIN1 pin 13)
' |
' GND <---------||-----
' C2
'
' ---[ R1 ]---
' GND <----| |----> PB0 (AIN0 pin 12)
' -----||-----
' C1
' R1 = 10k 5%
' R2 = 10k
' C1 = 47nF 5%
' C2 = 47nF
'
'---[ DC input versus Timer1 and Led position ]---------------------------------
'
' Measured Timer1 values for calculation:
' DC input = 3500mV Timer1 = 192 ( +6dB)
' DC input = 312mV Timer1 = 1544 (-15dB) 21dB = factor 11.22
' 21dB = 1543 - 192 = 1351 Timer1 counts
' 3dB = 1351 / 7 = 193 Timer1 counts
'
' Input mv Timer1 LED pos dB scale
' 3500 192 11 +6
' 2477 385 10 +3
' 1753 578 9 0
' 1241 771 8 -3
' 879 965 7 -6
' 622 1158 6 -9
' 440 1351 5 -12
' 312 1544 4 -15
' 220 1737 3 -18
' 156 1930 2 -21
' 110 2123 1 -24
' <110 >2123 0 infinit
'
'---[ Compiler and hardware related statements ]--------------------------------

$regfile = "m32def.dat" 'register file for AT90S2313
$crystal = 16000000 '10MHz crystal
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 'default use 10 for the SW stack
$framesize = 40 'default use 40 for the frame space

Config Portc = Output
Config Portd = Output
config portb = output
Config Porta.0 = Input 'output high and enable input pullup
$sim
'enable analog comparator ACSR bit 7 = 0

'---[ Variables ]---------------------------------------------------------------

Dim Peak_pos As Byte
Dim Peak_hold As Byte
Dim Drop_hold As Byte
Dim Led_pos As Word
Dim Bar_pattern As Word
Dim T1 As Word

'---[ Constants ]---------------------------------------------------------------

Const Peak_hold_time = 200
Const Drop_down_time = 40
Const Led_max = 16 'Led 0 - 11
Const T1_fs = 325
'full scale Timer1 value
Const T1_step = 12 '3dB step Timer1 value
'Calculate Timer1 range


'---[ Timer Configuration ]-----------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Internal
'R/C Timer
'reset after 1 Sec no reset watchdog

Start Adc
'---[ Main program loop ]-------------------------------------------------------

Do
'set all bits

'bar display mode
Bar_pattern = Lookup(led_pos , Bar_mode)

'reset peak bit
Portd.7 = Bar_pattern.15
Portd.6 = Bar_pattern.14 'led 11 = bit 11
Portd.5 = Bar_pattern.13 'reset peak bit
Portd.4 = Bar_pattern.12
Portd.3 = Bar_pattern.11 'led 11 = bit 11
Portd.2 = Bar_pattern.10


Portc.0 = Bar_pattern.7
Portc.1 = Bar_pattern.6
Portc.2 = Bar_pattern.5
Portc.3 = Bar_pattern.4
Portc.4 = Bar_pattern.3
Portc.5 = Bar_pattern.2
Portc.6 = Bar_pattern.1
Portc.7 = Bar_pattern.0

'led 0 = bit 0

Print T1
'-------------------------------------------------------------------------------

'-------------------------------------------------------------------------------

'---[ Interrupt Service Routine on Timer0 overflow ]---------------------------

'read Timer1 value
T1 = Getadc(0)


Led_pos = T1_fs - T1 'calculate led position
Led_pos = Led_pos \ T1_step 'led_pos = 0 - 11


Loop
Return

'---[ Led Bar pattern lookup data ]---------------------------------------------

' Led 11......... 0
Bar_mode:
Data &B1111111111111111% 'Word constants must end with the %-sign
Data &B1111111111111110%
Data &B1111111111111100%
Data &B1111111111111000%
Data &B1111111111110000%
Data &B1111111111100000%
Data &B1111111111000000%
Data &B1111111110000000%
Data &B1111111100000000%
Data &B1111111000000000%
Data &B1111110000000000%
Data &B1111100000000000%
Data &B1111000000000000%
Data &B1110000000000000%
Data &B1100000000000000%
Data &B1000000000000000%

Rage_Empire
30.11.2008, 16:11
Um die LEDs ruhiger zu bekommen mußt du integrieren. Entweder mit einem Kondensator am ADC oder sofwareseitig mit einer Mittelwertbildung. Dadurch gehen aber evtl. Spitzenwerte verloren.

Dirk
30.11.2008, 17:07
@Carlos31:

... ich täte mir wünschen das der spitzenwert erhalten bleibt für ein paar sekunden , und das die leds ein bischen ruhiger werden ...
Ruhiger wird die Anzeige schon einmal durch eine Pause in der DO-LOOP Schleife.

Gruß Dirk

Carlos31
30.11.2008, 23:42
vielen dank für eure hilfe ,
Mir fehlt es nur , wie ich das anstelle damit das maximal wert gespeichert bleibt für ein paar sekunden , ich benutze ein atmega 32 und kein 16 hatte mich vertippt.
Bin von beruf Betriebselektriker also kein profiprogramierer,ich mache hobbiemässig meine erste versuche mit bascom :-)
bin für jeden tip dankbar

hab der code ein bischen aufgeräumt


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Portc = Output
Config Portd = Output
Config Portb = Output
Config Porta.0 = Input

Dim Led_pos As Word
Dim Bar_pattern As Word
Dim T1 As Word
Const Led_max = 16
Const T1_fs = 325
Const T1_step = 16
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Do
If Led_pos >= 15 Then
Led_pos = 15
End If
If Led_pos <= 0 Then
Led_pos = 0
End If
Bar_pattern = Lookup(led_pos , Bar_mode)

Portd.7 = Bar_pattern.15
Portd.6 = Bar_pattern.14
Portd.5 = Bar_pattern.13
Portd.4 = Bar_pattern.12
Portd.3 = Bar_pattern.11
Portd.2 = Bar_pattern.10
Portd.1 = Bar_pattern.9
Portd.0 = Bar_pattern.8
Portc.0 = Bar_pattern.7
Portc.1 = Bar_pattern.6
Portc.2 = Bar_pattern.5
Portc.3 = Bar_pattern.4
Portc.4 = Bar_pattern.3
Portc.5 = Bar_pattern.2
Portc.6 = Bar_pattern.1
Portc.7 = Bar_pattern.0
T1 = Getadc(0) - 90
Led_pos = T1_fs - T1
Led_pos = Led_pos \ T1_step


Loop
Return


Bar_mode:
Data &B1111111111111111%
Data &B1111111111111110%
Data &B1111111111111100%
Data &B1111111111111000%
Data &B1111111111110000%
Data &B1111111111100000%
Data &B1111111111000000%
Data &B1111111110000000%
Data &B1111111100000000%
Data &B1111111000000000%
Data &B1111110000000000%
Data &B1111100000000000%
Data &B1111000000000000%
Data &B1110000000000000%
Data &B1100000000000000%
Data &B0000000000000000%