Forum: Mikrocontroller und Digitale Elektronik vu meter mit atmel


von matthias (Gast)


Lesenswert?

hallo hat von euch schon jemand ein vu meter mit einem 8515 realisiert?
dann bitte kurz melden
wäre auch froh über source vorschläge
meins steuert nicht richtig aus ..

von Kay (Gast)


Lesenswert?

hi,

muss es unbedingt ein AMTEL sein ? es gibt auch weniger teure und auch
kleinere IC´s, die dafür geschaffen sind.

mfg Kay

von Dirk (Gast)


Lesenswert?

Hi,

auf der Bascom Homepage ist ein Appnote fuer sowas.


Mfg

dirk

von matthias (Gast)


Lesenswert?

ja genau die apnote
die habe ich verwendet

ich möchte 16 leds ansteuern
und deshalb reichte mir der 2313 nicht
habe nun n 8515 er komme aber nicht zurecht
habe den code zwar abgeändert aber ...

wenn ihr wollt kann ich mal den code
posten

von matthias (Gast)


Lesenswert?

habe es genau so wie in der appnote aufgebaut

nur meine analogen inputs an den 8515 angepasst
ein anderes def file genommen ( für den 8515 er )
die mhz von 10 auf 8 runter
dann die ports definiert
die ich im 85 er mehr habe
ein paar "led zeilen" eingefügt
und den datenblock ganz unten geändert...

aber nocht zu keinem vernünftigen resultat gekommen ..

von Dirk (Gast)


Lesenswert?

Hi,

poste mal plz dein Quellcode .... maybe kann dann jemand besser helfen.



" aber nocht zu keinem vernünftigen resultat gekommen .."

Was meinste genau damit?



Mfg

Dirk

von matthias (Gast)


Lesenswert?

mein problem speziell ist
wenn ich im code einen anderen db wert setze z.b. 1db step
und oder einen niedrigeren maximal pegel
dann leuchten mir 5 oder gar 6 led s von vorneherein... und
die ganze anzeige steuert maximal 2 led s aus der rest blinkt wie 30
herz...
halt keinen schönen und schnellen ausschlag .......
von -8 bis +3 z.b. ....

habe ich da was im signal eingang falsch gemacht ?
habe es genauso wie auf dem plan
natürlich änderung at2313 und 8515 realisiert...
n kumpel von mir meinte
die bauteile oder die schaltung so wäre schwachsinn da sie alles
unter ca 2khz filtert ?!

'
'  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


anbei mein jetziger code !

von matthias (Gast)


Lesenswert?

'---[ Compiler and hardware related statements ]---------------------

$regfile = "8515def.dat"
$crystal = 8000000

Ddrb = &B11110011
Portb.2 = 0
Portb.3 = 0
Ddrd = &B10111111
Portd = &B11111111
Ddrc = &B11111111
Portc = &B11111111
Ddra = &B11111111
Porta = &B11111111
Acsr.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
Const T1_fs = 1385
Const T1_step = 200
Const T1_range = T1_step * Led_max + T1_fs

Displ_mod Alias Pind.6
Ac_out Alias Acsr.5

'---[ Timer Configuration ]------------------------------------------

Config Timer0 = Timer , Prescale = 256
Config Timer1 = Timer , Prescale = 8
Config Watchdog = 1024
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Dc_input_sample
Timer0 = 0
Timer1 = 0
Start Timer0
Start Timer1

'---[ Main program loop ]--------------------------------------------

Do
  Bar_pattern = &HFFFF

  If Displ_mod = 1 Then
    Bar_pattern = Lookup(led_pos , Bar_mode)
  Else
    Bar_pattern.led_pos = 0
  End If

  Bar_pattern.peak_pos = 0

  Porta.0 = Bar_pattern.16
  Porta.1 = Bar_pattern.15
  Porta.2 = Bar_pattern.14
  Porta.3 = Bar_pattern.13
  Porta.4 = Bar_pattern.12
  Porta.5 = Bar_pattern.11
  Porta.6 = Bar_pattern.10
  Porta.7 = Bar_pattern.9
  Portc.7 = Bar_pattern.8
  Portc.6 = Bar_pattern.7
  Portc.5 = Bar_pattern.6
  Portc.4 = Bar_pattern.5
  Portc.3 = Bar_pattern.4
  Portc.2 = Bar_pattern.3
  Portc.1 = Bar_pattern.2
  Portc.0 = Bar_pattern.1
  Portd.0 = Bar_pattern.0                       'led 0 = bit 0
Loop

'--------------------------------------------------------------------
End
'--------------------------------------------------------------------

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

Dc_input_sample:
  Timer0 = 100

  Ddrb.2 = 1
  Portb.2 = 1
  Waitus 200
  Ddrb.2 = 0
  Portb.2 = 0

  Timer1 = 0
  Bitwait Ac_out , Reset
  T1 = Timer1

  If T1 < T1_fs Then
    T1 = T1_fs
  Elseif T1 > T1_range Then
    T1 = T1_range
  End If

  Led_pos = T1_range - T1
  Led_pos = Led_pos \ T1_step

  If Led_pos >= Peak_pos Then
    Peak_pos = Led_pos
    Peak_hold = Peak_hold_time
  Else
    If Peak_hold > 0 Then
      Decr Peak_hold
    Else
      If Drop_hold > 0 Then
        Decr Drop_hold
      Else
        Drop_hold = Drop_down_time
        If Peak_pos > 0 Then Decr Peak_pos
      End If
    End If
  End If
  Reset Watchdog
Return

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

'      Led 16......... 0
Bar_mode:


Data &B11111111111111111110%
Data &B11111111111111111100%
Data &B11111111111111111000%
Data &B11111111111111110000%
Data &B11111111111111100000%
Data &B11111111111111000000%
Data &B11111111111110000000%
Data &B11111111111100000000%
Data &B11111111111000000000%
Data &B11111111110000000000%
Data &B11111111100000000000%
Data &B11111111000000000000%
Data &B11111110000000000000%
Data &B11111100000000000000%
Data &B11111000000000000000%
Data &B11110000000000000000%

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

von matthias (Gast)


Lesenswert?

nun der orginalcode
von der bascom seite
speziell für den AT90S2313 10 MHZ


'--------------------------------------------------------------------
' Filename   : BG30dB_LED.bas
' Revision   : 1.0
' Controller : AVR AT90S2313-10
' Author     : Ger langezaal
' Compiler   : BASCOM-AVR   Rev. 1.11.6.2
' ROM image  : 3EE hex  (1006 dec)
'
'---[ Small program description ]------------------------------------
'
' This program is written to create a logarithmic LED bar graphdB
' (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 = "2313def.dat"           'register file for AT90S2313
$crystal = 10000000                '10MHz crystal

Ddrb = &B11111100                  'PB0 and PB1 are analog inputs
Portb.0 = 0                        'disable input pullup
Portb.1 = 0                        'disable input pullup

Ddrd = &B10111111              'config PD6 as input
Portd = &B11111111             'output high and enable input pullup

Acsr.7 = 0              '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 = 11                 'Led 0 - 11
Const T1_fs = 192                  'full scale Timer1 value
Const T1_step = 77                 '3dB step Timer1 value
Const T1_range = T1_step * Led_max + T1_fs 'Calculate Timer1 range

Displ_mod Alias Pind.6           'display mode 1 = Dot 0 = Bar
Ac_out Alias Acsr.5         'analog comparator output = ACSR bit 5

'---[ Timer Configuration ]------------------------------------------

Config Timer0 = Timer , Prescale = 256     'On Interrupt Timer
Config Timer1 = Timer , Prescale = 8       'R/C Timer
Config Watchdog = 1024        'reset after 1 Sec no reset watchdog
Enable Interrupts
Enable Timer0
Enable Timer1
On Timer0 Dc_input_sample       'on overflow timer0 jump to label
Timer0 = 0
Timer1 = 0
Start Timer0
Start Timer1

'---[ Main program loop ]--------------------------------------------

Do
  Bar_pattern = &HFFFF           'set all bits

  If Displ_mod = 1 Then          'bar display mode
    Bar_pattern = Lookup(led_pos , Bar_mode)
  Else                           'dot display mode
    Bar_pattern.led_pos = 0      'reset dot bit
  End If

  Bar_pattern.peak_pos = 0       'reset peak bit

  Portd.5 = Bar_pattern.11       'led 11 = bit 11
  Portd.4 = Bar_pattern.10
  Portd.3 = Bar_pattern.9
  Portd.2 = Bar_pattern.8
  Portd.1 = Bar_pattern.7
  Portd.0 = Bar_pattern.6
  Portb.7 = Bar_pattern.5
  Portb.6 = Bar_pattern.4
  Portb.5 = Bar_pattern.3
  Portb.4 = Bar_pattern.2
  Portb.3 = Bar_pattern.1
  Portb.2 = Bar_pattern.0         'led 0 = bit 0
Loop

'--------------------------------------------------------------------
End
'--------------------------------------------------------------------

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

Dc_input_sample:
  Timer0 = 100                  'preset Timer0 for sample rate of 4mS

  Ddrb.0 = 1                   'set AIN0 as PB0 output
  Portb.0 = 1                  'set PB0 high to charge C1
  Waitus 200                   'wait for charge complete
  Ddrb.0 = 0                   'reset PB0 as AIN0 analog input
  Portb.0 = 0                  'disable AIN0 pullup

  Timer1 = 0                   'clear R/C Timer1
  Bitwait Ac_out , Reset       'wait for AIN0 < AIN1
  T1 = Timer1                  'read Timer1 value

  If T1 < T1_fs Then           'check T1 low limit
    T1 = T1_fs                 'T1 clipping
  Elseif T1 > T1_range Then    'check T1 high limit
    T1 = T1_range              'T1 clipping
  End If

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

  If Led_pos >= Peak_pos Then     'new peak value
    Peak_pos = Led_pos            'store peak value
    Peak_hold = Peak_hold_time    'preset peak hold timer
  Else
    If Peak_hold > 0 Then
      Decr Peak_hold
    Else
      If Drop_hold > 0 Then
        Decr Drop_hold
      Else
        Drop_hold = Drop_down_time     'preset drop down timer
        If Peak_pos > 0 Then Decr Peak_pos  'drop down one position
      End If
    End If
  End If
  Reset Watchdog
Return

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

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

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

von matthias (Gast)


Lesenswert?

bei meiner version leuchtet auch noch die oberste led andauernd ....

von matthias (Gast)


Lesenswert?

ich programmiere über die spi schnittstelle
mit hilfe des isp adapters (eigenbau)
und der atmel isp software

sobald ich den atmel aus seiner fassung nehme
und in eine andere ( ohne externen quarz) an xtal1 und xtal2
ect

zeigt bleibt der atmel komplett
"aus"

nun meine frage benötigeich auch noch in meiner endgültigen schaltung
den 8 mhz quarz den ich sonst nur zum programmiern nehme

der müsste mir doch erspart bleiben
denn der avr hat ja einen internen mit 8mhz ?
oder stimmt da was am code nicht ?

danke schon mal mal für jede art von hilfe !

von Dirk (Gast)


Lesenswert?

Hi,

erstmal die RC Kombination fuer den Analogcomperator stellt eine RC
Zeit dar(Aufladezeit des Kondensators).

Diese Auflade/Entladezeit wird gemessen und umgerechnet in die db
Skala.

Mfg

Dirk

von matthias (Gast)


Lesenswert?

aha

nun meine frage wieso läuft der atmel auf meiner isp programmier
platine auf der ein 8 mhz quarz stckt und wieso auf einer anderen
leiterplatte ohne quarz nicht
ich dachte es wird nur der timer verwendet ?

von matthias (Gast)


Lesenswert?

würde statt dem RC Glied auch ein
Gleichrichter mit nachgeschaltetem Tiefpaß, der das Audiosignal
gleichrichtet und glättet funktionieren ?

von matthias (Gast)


Lesenswert?

@ dirk

hast du nicht mal in nem anderen thread nach plänen
von erdi oder emil nachgefragt ?
hast du die noch ?
bzw die mail adresse der beiden ?

grüßles matthias

anbei der auszug
falls ich mich täusche - sorry




Re: Audio Spectrum Analyzer
Autor: Dirk [router.mcd-panasonic.de]
Datum: 16.06.2003 08:40

------------------------------------------------------------------------ 
--------

Hi,

mal eine Frage : Deine VU Levelmeter mit Peakholdfunktion . Sind die
mit
Avr geloest ? Wenn ja magst du diese zur Verfuegungstellen?

Mfg

Dirk

von Dirk (Gast)


Lesenswert?

Hi,

also erstmal kann dein AT90S8515 nicht ohne Quarz laufen . Falls du
z.B. ein Atmega8 haettest koenntest du die internen 1 Mhz nehmen.


Der Timer arbeitet mit einer Prescaler von 8 (Quarzfrequenz/8)
Schau dir mal bitte das Datasheet zu deinem µC an. Speziell
Analogkomperator. Ich schau mir nochmal dein Code heute abend an,
vielleicht kannst du ja nochmal im Bascom Yahoo Forum nachfragen.


Mfg

Dirk



-------------------------------------------
Re: Audio Spectrum Analyzer
Autor: Dirk [router.mcd-panasonic.de]
Datum: 16.06.2003 08:40

Leider habe ich auf die Anfrage keine Antwort bekommen.

von Mike (Gast)


Lesenswert?

Sry dass ich einen alten Thread wieder ausgrabe aber ich hätte eine 
Bitte:

Ich habe Zuhause ein Mischpult und möchte mir dazu oben eine Meterbridge 
draufbauen. Das heißt alle 16 Eingänge und die 6 Ausgänge mit VU's 
versehen. Der LM3xxx IC gefälltm ir nicht so recht, deshalb bin ich 
hierher gestoßen, mit einem Atmel ein VU zu bauen, auch mit Peakhold 
(was mir recht Wichtig wäre.

Habe mir den Mega16 mal angesehen, der hat ja 8 Analoge Inputs (8x ADC). 
Hat jemand eine Software für den Atmel geschrieben, welche die 8 ADCs 
einliest, nach VU wandelt (mit Peakhold) und dann an sagen wir 16 LED/VU 
gemultiplext wieder ausgibt?

Oder hat wer einfach eine Software, welche ein Analoges Signal einliest 
und das als VU mit Peakhold wieder ausgibt. Minimum sehe ich 10LED's 
wegen der Auflösung.
Also was ganz Simples, was man nur noch in den Chip per ISP kopieren 
muss.

Vielen Dank schon mal fürs lesen und eventuell das Posten eines 
Sourcecodes oder HEX Datei ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.