PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : brauche dringend hilfe aplausometer



Carlos31
12.12.2008, 18:30
Hallo, ich hoffe ihr können mich helfen
Ich hab ein ein aplausometer gebaut für die weihnachtsfeier von meine firma und die is morgen :-( , es handelt sich um ein led bargraph mit 48 spalten und 10 reihen leds , 3 led spalten sind eine stufe also 30 leds , benutze ein atmega 32 und benutze 2 ports (portd c und d ) , also hab ich ins gesamt 16 stufen. zum messen der lautstärke benutze ich ein elekret mikrophon , dazu hab ich ein verstärker gebaut am adc 0, zum einstellen der empfindlichkeit verwende ich ein poti am adc 1
Mein problem ist das ich erst heute fertig geworden bin mit dem bau , wegen lieferverzug von den leds , hab ein program geschrieben aber es ist nicht so wie ich es will :-(.
ich möchte das die leds ruhiger werden , und das der maximal wert länger angezeigt wird , ich hatte schon der tip bekommen das ich es mit ein kondensator versuchen soll oder mit ein wait in mein program mit beiden verlöschen die leds zu schnell , hatt jemand vieleicht eine idee wie ich das machen kann ? oder bin ich falsch vom einsatz her das ich das messen kann mit ein lautsprecher ?

da ist mein code


$regfile = "m32def.dat"
$crystal = 16000000

$hwstack = 32
$swstack = 10
$framesize = 40

Config Portc = Output
Config Portd = Output



Config Adc = Single , Prescaler = Auto , Reference = Internal
Dim Micro As Word
Dim Poti As Word
Dim Miceing As Word
Dim Zeit As Word
Dim A As Word
Dim B As Word
Dim C As Word
Dim D As Word
Dim E As Word
Dim F As Word
Dim G As Word
Dim H As Word
Dim I As Word
Dim J As Word
Dim K As Word
Dim L As Word
Dim M As Word
Dim N As Word
Dim O As Word
Dim P As Word












Start Adc





Do

Waitms 20
Poti = Getadc(1) - 130

Micro = Getadc(0) * 4

A = Poti + 700
B = Poti + 750
C = Poti + 850
D = Poti + 950
E = Poti + 1050
F = Poti + 1200
G = Poti + 1400
H = Poti + 1600
I = Poti + 1800
J = Poti + 2000
K = Poti + 2200
L = Poti + 2400
M = Poti + 2600
N = Poti + 2800
O = Poti + 3000
P = Poti + 3200


If Micro > A Then
Portc.1 = 0

Else

Portc.1 = 1

End If
If Micro > B Then
Portc.0 = 0

Else

Portc.0 = 1
End If
If Micro > C Then
Portc.3 = 0

Else

Portc.3 = 1
End If
If Micro > D Then
Portc.2 = 0

Else
Portc.2 = 1
End If
If Micro > E Then
Portc.5 = 0
Else

Portc.5 = 1
End If

If Micro > F Then
Portc.4 = 0

Else

Portc.4 = 1
End If
If Micro > G Then
Portc.7 = 0

Else
Portc.7 = 1
End If
If Micro > H Then
Portc.6 = 0

Else
Portc.6 = 1
End If
If Micro > I Then
Portd.1 = 0


Else

Portd.1 = 1
End If
If Micro > J Then
Portd.0 = 0


Else

Portd.0 = 1
End If
If Micro > K Then
Portd.3 = 0


Else

Portd.3 = 1
End If
If Micro > L Then
Portd.2 = 0

Else
Portd.2 = 1
End If
If Micro > M Then
Portd.5 = 0


Else

Portd.5 = 1
End If

If Micro > N Then
Portd.4 = 0


Else

Portd.4 = 1
End If
If Micro > O Then
Portd.7 = 0

Else
Portd.7 = 1
End If
If Micro > P Then
Portd.6 = 0

Else
Portd.6 = 1
End If


Loop

oberallgeier
12.12.2008, 19:33
Hi Carlos31,


... aplausometer ... für die weihnachtsfeier von ... und die is morgen ...Ich fürchte, nun hast Du ja wirklich ein Problem, leider. Nachdem Du hier schon mehrfach zu diesem Thema gefragt hast
mit dem applausometer fings an (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=410606&highlight=#410606)
die Probleme mit der Verschaltung der LED´s (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=411620&highlight=#411620)
und möglicherweise noch ein Softwareproblem (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=412074&highlight=#412074)
fürchte ich, dass der verbleibende Zeitraum für die Inbetriebnahme nicht mehr reicht. Mit dem Code kann ich Dir leider nicht helfen, da ich nur C kann - und das schlecht.

Trotz alledem - viel Glück und Erfolg

Carlos31
12.12.2008, 19:44
ja da hast du recht leider :-(
hab diese vorwiederstände alle schon brav reingelötet 480 genau gesagt :-) , nur mit mein program hänge ich im moment , und find niergends im internet ein ähnliches beispiel in bascom , und ob es mit ein mikrofon am adc so was realisieren kann , mit music klappt es wunderbar , aber aplausse sind was anders .
danke trotzdem

robocat
12.12.2008, 19:50
hallo,
ich kann kein bascom und versuche nur zu helfen, weil es sich ja scheinbar um einen notfall handelt ;)

zum einen, aber das wird dein problem nicht lösen, würde ich mehrere ADC werte aufsummieren und durch die anzahl der wandlungen teilen. also quasi den mittelwert bilden.

dann hast du einen wert für "micro" den du mit einer (neu einzufügenden) variable "max" vergleichst. ist micro > max wird max = micro. andernfalls wird nichts getan. max wird auf dem display dargestellt und voila hast du eine anzeige, die den "lautesten applaus" lange anzeigt. sogar zu lange, denn max kann ja nicht mehr kleiner werden. also müsste man max "langsam" wieder klein werden lassen (alle sekunde oder so), evtl mit einem max=max/2 (auf die art geht der applaus schneller wieder richtung 0 als mit einem max=max-1).

vielleicht hilfts ja. gruesse von der katz

Carlos31
12.12.2008, 22:49
hallo
Ich hab mein ein 2 tes program vielleicht wird es hier einfacher , ich muss nur die led anzeige ruhiger werden lassen , das die leds rauf und runter langsamer und das sie nicht plötzlich erscheinen ich hoffe das jemand eine lösung weisst , ich bin verzweifelt am probieren :-).


$regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 32
$swstack = 10
$framesize = 40
$sim
Config Portc = Output
Config Portd = Output

Dim A As Word
Dim Led_pos As Word
Dim Bereich As Word
Dim Bar_muster As Word
Dim Mic As Word
Dim Poti As Word
Dim Maximal As Single
Const Schritt = 16

Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc
Do

Bar_muster = Lookup(led_pos , Bar_form)

Portc.1 = Bar_muster.15
Portc.0 = Bar_muster.14
Portc.3 = Bar_muster.13
Portc.2 = Bar_muster.12
Portc.5 = Bar_muster.11
Portc.4 = Bar_muster.10
Portc.7 = Bar_muster.9
Portc.6 = Bar_muster.8
Portd.1 = Bar_muster.7
Portd.0 = Bar_muster.6
Portd.3 = Bar_muster.5
Portd.2 = Bar_muster.4
Portd.5 = Bar_muster.3
Portd.4 = Bar_muster.2
Portd.7 = Bar_muster.1
Portd.6 = Bar_muster.0


A = Getadc(0)
Poti = Getadc(1)
If Poti > 620 Then
Poti = 620
Else
Poti = Getadc(1)
End If
Maximal = Poti + 204

Mic = A - 140
Bereich = Maximal / Schritt
Led_pos = Mic / Bereich




Loop
Return


Bar_form:
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 &B1000000000000000%
Data &B0000000000000000%

robocat
12.12.2008, 23:29
aber da hast du doch gar nichts von meinen vorschlägen umgesetzt. warum fragst du denn dann um hilfe?

Carlos31
12.12.2008, 23:39
hallo robocat
es tut mir leid du hast schon recht , aber ich bin leider nicht so erfahren in bascom (bin anfänger), und deine idee ist gut aber kann ich sie leider nicht umstzen da mir die kenntnise fehlen wie ich die adc werte speichern kann , und danach es dividieren zu der anzahl der messungen weiss ich nicht wie aber danke trotzdem ,

Carlos31
13.12.2008, 09:01
hätte ich nie gedacht das es so schwer sein kann ein aplausometer zu machen , hat sonst keiner eine idee wie ich es in bascom anstelle , sagen wir mal 10 adc messungen zu machen und danach es dur 10 zu dividieren um ein mittelwert zu erreichen ? , und zum zweiten das die leds langsamer reagieren danke in voraus ; bin am verzweifeln :-)
P.S hab gestern die halbe nacht im internet danach gesucht wie ich das lösen kann :-(

Dirk
13.12.2008, 11:05
Mittelwert z.B.:

A = 0
For I = 1 To 10
A = A + Adc(0)
Waitms 5
Next I
A = A / 10

Gruß Dirk

Carlos31
13.12.2008, 11:22
Dankeschön
hab es schon in mein program implementiert , danach hab ich gesucht :-),
die spitzen sind endlich weg , das einzige was mir fehlt ist das die leds langsamer abfallen , bzw ruhiger werden , ich werde heute ein video machen von dem ding und es hier reinstellen :-) hoffentlich muss ich mich nicht schämen :-) . ihr alle waren eine riesen hilfe



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

Config Portc = Output
Config Portd = Output
Dim I As Byte
Dim A As Word
Dim Led_pos As Word
Dim Bereich As Word
Dim Bar_muster As Word
Dim Mic As Word
Dim Poti As Word
Dim Maximal As Word
Const Schritt = 16

Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc







Do


Bar_muster = Lookup(led_pos , Bar_form)






Portc.1 = Bar_muster.15
Portc.0 = Bar_muster.14
Portc.3 = Bar_muster.13
Portc.2 = Bar_muster.12
Portc.5 = Bar_muster.11
Portc.4 = Bar_muster.10
Portc.7 = Bar_muster.9
Portc.6 = Bar_muster.8
Portd.1 = Bar_muster.7
Portd.0 = Bar_muster.6
Portd.3 = Bar_muster.5
Portd.2 = Bar_muster.4
Portd.5 = Bar_muster.3
Portd.4 = Bar_muster.2
Portd.7 = Bar_muster.1
Portd.6 = Bar_muster.0






Poti = Getadc(1)
A = 0
For I = 1 To 10
A = A + Getadc(0)
Waitms 5
Next I
A = A / 15




If Poti > 620 Then
Poti = 620
Else
Poti = Getadc(1)
End If
Maximal = Poti + 204

Mic = A - 140
Bereich = Maximal / Schritt
Led_pos = Mic / Bereich



Loop

Return


Bar_form:
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 &B1000000000000000%
Data &B0000000000000000%

Dirk
13.12.2008, 11:33
Hallo Carlos31,

wenn du 10x den Adc abfragst, solltest du zur Mittelwertbildung auch durch 10 teilen: A = A / 10 (und nicht A = A / 15).

Langsamer wird deine LED-Anzeige in 1. Linie, wenn du die Do-Loop-Schleife langsamer machst, also dort ein Waitms einfügst. Wie hoch das ist, must du probieren (z.B. Waitms 200).

Gruß Dirk

Carlos31
13.12.2008, 11:39
ja das stimmt ich hatte das kopiert bevor ich das korregiert hatte , hab ein paar versuche gemacht und vergessen es zu ändern danke , :-)

Carlos31
13.12.2008, 11:45
Hallo Dirk

ja langsamer wird es auch wenn ich ein wait in der loop schleife hänge das problem ist nur das dieser wait zeit die leds auch dunkel bleiben , z.b leuchten 4 leds , für waitms xx, danach verlöschen auch um waitms xx , ich hätte es gerne so das die leds konstant an bleiben und verschiedene stufen zeigen so lang ein geräusch da ist.
schöne grüsse aus österreich :-)

Dirk
13.12.2008, 12:05
Hallo Carlos31,

hätte es gerne so das die leds konstant an bleiben und verschiedene stufen zeigen so lang ein geräusch da ist.
Das ist einerseits der Unterschied zwischen einer Aussteuerungsanzeige (z.B. an Verstärkern) und einer Maximalwertanzeige (wie deinem Applausometer).
Bei der Aussteurungsanzeige folgen die Balken zeitnah der Lautstärke, evtl. gibt es noch einen zeitverzögerten Maximalwert.
Bei der Maximalwertanzeige hätte man z.B. am Gerät einen "Resetknopf", den man drückt. Dann klatschen die Leute und die LED-Anzeige steigt immer höher. Am Ende bleibt ein Maximalwert stehen, den man dann durch das nächste Drücken des Knopfs zurücksetzt.

Andererseits müßten in deinem Programm auch die LEDs an bleiben, wenn man ein Waitms einfügt. Das wird aber davon abhängen, WO du das Waitms einfügst. Wenn es hinter der Anzeige (also vor dem neuen Einlesen des Adc) eingefügt wird, müßte die Anzeige stehen bleiben.

Gruß Dirk

Carlos31
13.12.2008, 12:53
hallo dirk , hab der wait 200 vor getadc geschrieben undampc ein dauerton abgespielt die leds fangen an zu blinken , ungefähr in 200 ms bereich weiss nicht was ich falsch mach

Carlos31
13.12.2008, 13:06
ohne denn waitms 200 blinkt es auch aber mit eine schnellerer frequenz wahrscheinlich kommt es von den 5 ms beim speichern vom adc wert bin am alles rumprobieren :-)

Carlos31
13.12.2008, 13:22
wie wärs wenn ich schreibe
if led_pos_alt <= led_pos then
decr led pos
und
if led_pos_alt >= led_pos then
incr led pos
oder so was damit die leds stufenweise rauf oder runtergehen , und nicht alle gleichzeitig aus , leider weiss ich nicht wie ich das anstellen soll bin voll am überlegen und komme nicht weiter :-(
gruss carlos

Carlos31
13.12.2008, 13:28
wie wärs wenn ich schreibe
if led_pos_alt <= led_pos then
decr led pos
und
if led_pos_alt >= led_pos then
incr led pos
oder so was damit die leds stufenweise rauf oder runtergehen , und nicht alle gleichzeitig aus , leider weiss ich nicht wie ich das anstellen soll bin voll am überlegen und komme nicht weiter :-(
gruss carlos

Sauerbruch
13.12.2008, 13:54
Hast Du denn das verstärkte Mikrophon-Signal gleichgerichtet und v.a. mit einem Kondensator geglättet? Wenn nicht, bewegt sich die Spannung ja schätzungsweise viele hundert Mal pro Sekunde zwischen maximum und 0 Volt hin und her - und wenn der ADC im "falschen" Moment misst, bekommst Du halt irgend einen Wert, aber nict die Spitzenspannung.

Ist nur so ´ne Idee - habe den Thread nur aus dem Augenwinkel beobachtet ;-)

Carlos31
13.12.2008, 14:01
hallo , ich benutze ein mic verstärker das nur mit ein transistor funktioniert , und gehe direct zum adc hier ist die schaltung http://www.reconnsworld.com/forum/read.php?9,10 ich hoffe das ich richtig bin :-) .

Sauerbruch
13.12.2008, 14:42
..okay - dann haben wir das Problem!


Richte das Signal mal gleich (Diode) und glätte es mit ´nem RC-Glied (z.B. 1µF und 100kOhm, Zeitkonstante 0,1 Sekunden) - dann hast Du auch saubre ADC-Werte!

Carlos31
13.12.2008, 14:48
meinst du es so ?
Verstärker ausgang ---diode----------- ADC
!
!
C =
!!
R !!
!
masse-----------------------------
danke

Sauerbruch
13.12.2008, 15:20
Ich weiß nicht ob Du das so gemeint hast wie es hier dargestellt ist - hier werden "überflüssige" Leerzeichen im Text offenbar eliminiert...

Vom Amp-Ausgang über eine Diode (in Durchlassrichtung gepolt) und den 100k-Widerstand in den ADC-Eingang, der Kondensator kommt zwischen die Verbindung Widerstand/ADC-Eingang und Masse.

Herkulase
13.12.2008, 16:06
Binn zwar eher unbewandert in E-tech aber evtl so?




10 k
IN ___ OUT
-->|------ -|___|- ----o-------o---o----
D1 | |
| |
| |
| .-.
--- | | 10 k
1 uF --- | |
| '-'
| |
| |
| |
GND GND




So folgt das Ausgangssignal dem Spitzenwert eingangssignals mit einer gewissen Verzögerung, durch die Rs einstellbar. der parallele R stellt den Eingangs-R des ADC dar, weiss grad nicht wie groß der ist, aber ohne den geht sie Simulation nicht...

Sauerbruch
13.12.2008, 16:26
...genau so. Der Eingangswiderstand des AD-Converters ist irre hoch, ich glaube im 100 MOhm-Bereich. In der Praxis kann man ihn glaube ich vernachlässigen.

Beim Sinnieren über Pegel-Anzeigen kam mir noch ´ne Variante in den Sinn. Wenn man es so macht




Ein----->!--------------------------ADC
! !
! !
---- ! !
100nF ---- ! ! 100K
! !
! !
GND GND


würde sich der Kondesator z.B. bei einem kurzem (Baß)-Impuls sofort aufladen, und erst langsam entladen. Ich glaube, dass das der Kinetik von üblichen VU-Metern ganz nahe kommt...


BTW: Carlos, bist Du schon auf Eurer Weihnachtsfeier? =P~

Carlos31
14.12.2008, 10:32
Guten Morgen
Die weihnachtsfeier ist vorbei , und muss sagen sauerbruch hatt voll ins schwarze getrofen , ich hatte das ganze auf ein steckbrett ausprobiert ,gestern und die blinkerei war weg , bin noch um 18.00 zu weihnachtsfeier hab der diode und rc schaltung reingelötet hinter die bühne voll in dunkel mit mein händy als taschenlampe :-).
Ich muss mich bei euch alle bedanken für eure hilfe , der aplausometer war der hammer , von der empfindlichkeit , hätte ich es vielleich ein bischen weniger geben sollen , hatte 2 mal ausgeschlagen , aber auch weil die leutte die leds anschauen wollten :-),

Schöne grüsse aus österreich
Carlos

Sauerbruch
14.12.2008, 21:42
...danke für die Blumen!


voll in dunkel mit mein händy als taschenlampe .


Das nenn´ ich Einsatz =D>

Viel Freude bei den nächsten Bascom-Projekten!

Daniel

oberallgeier
14.12.2008, 21:48
Hallo Carlos31,

herzlichen Glückwunsch, da fällt mir ein Stein vom Herzen. Der Fachmann hat halt wieder gezeigt, wozu er fähig ist - das bisschen Stress, das Du dabei hattest und all der Aufwand interessiert doch kaum jemand und spielt auch jetzt keine Rolle mehr. Dumm wärs nur gewesen, wenn das Vorhaben nicht geklappt hätte. Glückwunsch ! ! !