Forum: Mikrocontroller und Digitale Elektronik Audiotisch (Daft Punk)


von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Hallo,

sicherlich kennen einige von euch den sogenannten Daft-Punk Tisch. Nun 
würde ich eben solch einen Tisch gerne nachbauen.

Der Tisch soll aus 5x5 Feldern bestehen und die Abmessungen weiß ich 
jetzt noch nicht ;).

Dazu möchte ich einen ATmega16 per Mikrofon ansteuern und im Code werden 
die einzelnen Muster (~150-200 Stück) aufgerufen und anschließend per 
LEDs angezeigt. Bei jedem weiteren "Ton" wird eben ein Muster 
weitergeschaltet.

Nun habe ich mich für eine etwas aufwendigere Schaltungsvariante zur 
Auswertung des Audiosignals entschieden. Per OP wird das Signal 
verstärkt sowie auch automatisch geregelt.

Bis jetzt sind "normale" LEDs vorgesehen, diese sind aber mit Sicherheit 
zu dunkel um eine homogene Ausleuchtung eines Feldes zu erzeugen.
Müsste dann doch Superflux LEDs verwenden ? Nur dann wäre ja der BC337 
nutzlos und ich müsste auf einen MOSFET umsteigen ?

Das ganze wird per ISP programmiert nur die Verbindung habe ich auf die 
schnelle nicht eingezeichnet.

Schaltung könnte man noch für verschiedene Tonarten erweiteren aber das 
ist erstmal nach hinten gestellt.

Im Anhang mal die Schaltungsidee. Über Kritik, Anregungen sowie 
Verbesserungsvorschläge wäre ich erfreut!

Gute Nacht und Gruß!

von Jobst M. (jobstens-de)


Lesenswert?

Moin!

Was ist mit Pin 28?

C5 würde ich kleiner wählen oder gar ganz weg lassen.

Die Ansteuerung Deiner LEDs ist nicht vorteilhaft.
Am Emitter liegen 0,7V weniger, als an der Basis. Rechne am Emitter mal 
mit 4,2V. Selbst bei roten LEDs mit 1.6V Flussspannung bleiben dann nur 
3mA pro Zweig.

Bei dieser Beschaltung könntest Du auch den Basiswiderstand entfernen. 
Solltest Du sogar.

Ich würde eine Emitterschaltung (Emitter an GND) vorziehen. Dort 
brauchst Du den Basiswiderstand dann allerdings.
Vorteil wäre, daß Du die LEDs dann in Reihe schalten und direkt an 15V 
hängen könntest. Dadurch würde weniger Strom fliessen. Durch den 
Transistor, den Spannungsregler, insgesamt.

Aber vor allem: Den Arbeitswiderstand für die LEDs korrekt ausrechnen!

Ich kann im Schaltbild nicht erkennen, wo der OP seine Versorgung her 
holt.


Gruß

Jobst

von Henk (Gast)


Lesenswert?

wie wäre es mit transistorarrays wie uln2003 oder uln2803?
statt der superflux versuch es lieber mit highpower-leds oder massig 
qualitativen smd-leds

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Hallo,

sodele erstmal Danke für die Antworten. Also das um die Uhrzeit ;)

@ Jobst

Pin 28 hatte ich vergessen... Gleiches gilt auch für die OP
Versorgungsspannung. Habe ich aber nun geändert.

Des Weiteren habe ich C5 am RESET auf 10n verkleinert. Hatte es halt
immer so mit 100n gegen GND.

Die LED Schaltung habe ich nun wie du Vorgeschlagen hast abgeändert
(hattest du doch so gemeint ?) und zwar mal mit 4 LEDs in Reihe und der
Vorwiderstand ist für die LEDs (rot) mit 20mA und 1,6VF gewählt worden.
Habe das ganze in Multisim simuliert und etwas an den Werten
herumgespielt.

@ Henk

Hmm gute Frage zwecks Arrays. Hätte ich dadurch "erheblich" Vorteile ?

Hast du mir einen Tipp in welchem Shop ich gute Highpower LEDs bekommen
würde ? Sind diese denn auch vorselektiert ?

Danke für eure Hilfe!

Gruß

Edit: So nun sollte es der richtige Plan sein... Ok, Versuch Nummer 3 
:).

von Michael A. (Gast)


Lesenswert?

Pascal K. schrieb:
> So nun sollte es der richtige Plan sein... Ok

Die D1 macht nur Sinn, wenn es irgendwo ein passende Sicherung gibt, die 
vor der Diode aufgibt.

von Pascal K. (zerb)


Lesenswert?

Michael A. schrieb:
> Pascal K. schrieb:
>> So nun sollte es der richtige Plan sein... Ok
>
> Die D1 macht nur Sinn, wenn es irgendwo ein passende Sicherung gibt, die
> vor der Diode aufgibt.

Hallo Michael,

dann werde ich mal noch davor eine Sicherung vorsehen.
Wenn ich das dann richtig verstehe, schließt die Diode die 
Versorgungsspannung kurz und dadurch spricht die Sicherung an und 
verhindert den Kurzschluss sowie das die Diode mit Qualmzeichen sich 
meldet ?

Edit: Ist dies eigentlich die "Nummer. 1" Variante ? Hatte jetzt gerade 
auch etwas mit MOSFET-Absicherung gelesen aber da verbraucht man doch 
ne' ordentliche Mindestspannung sowie das die Schaltung auch Strom zieht 
?

Gruß

von Loonix (Gast)


Lesenswert?

.
            |----|
15V---|>|----7805|--
            |----|
              |
GND-----------------

Nachdem es ja wohl egal ist ob Energie am 7805 oder an einer in Reihe 
davor geschalteten Diode als Wärme verloren geht, würde ich den 
Verpolschutz wie oben gezeigt realisieren (von mir nicht gezeichnete 
Bauteile am 7805 bitte trotzdem beibehalten).

PS. max. Strom bei Diodenauswahl beachten

von Loonix (Gast)


Lesenswert?

Jetzt hat mir die Foren-SW die Leerzeichen in der ersten Zeile 
geklaut...

[edit]
Ein Punkt hilft.

-rufus

von MaWin (Gast)


Lesenswert?

Es macht wenig Sinn, erst über R5/C11 eine gefilterte 
Versorgungsspannung zu erzeugen, und dann den Verstärker mit R7 an eine 
ungefilterte zu hängen. R7 kommt an C11. Auch sind 10k für R5/R6 bei 5V 
recht viel, du rezuzierst die Ausgangsspannung deines Mikros um den 
Faktor 10 und musst hinterher nur stärker verstärken. Nimm für die 
üblichen 2k Elektret-Mikros 1k. Auch müssen bei 50K Eingangsimpedanz 
keine 10uF Klötze da dran, nimm 2u2, das reicht ja wohl für die 
Frequenzuntergrenze.
Die weitere "Auswertung" des Audiosignal soll wohl eine 
Lautstärkeregelung sein, ich kennen normale Sch altungen aber mit Q1 als 
JFET und man leitet nicht zur absoluten Masse ab sondern zur virtuellen 
Masse. Auch  sind 1N4004 zur Audiosiganlbearbeitung vollkommen 
ungeeignet, 1N4148 tun's.

Ich glaube du hast hier 2 Schaltungen kombiniert, von denen du keine 
verstanden hast. Schau noch mal nach, wie man Dynamikkompressoren 
richtig baut.

Auch ist die Schaltung mit Q2 und 330 Ohm (wieso 330? Als PullDown tun 
es 4k7 oder auch 10k) sehr merkwürdig, es soll wohl ein 
Schwellwertschalter sein. Prüf mal (in LTSpice) nach, ob die Schaltung 
tut was du dir von ihr erwartest, sie hat einen Effekt, da man das aber 
normalerweise anders baut, nehme ich an: eher einen unerwünschten 
Effekt.

Das R2 zu gross dimensioniert ist, T1 besser ein PNP wäre (oder Masse 
schaltet) und 2 (blaue) LEDs zu viel an 5V sind, wurde schon gesagt. 
Wenn du alle LEDs in Reihe schaltest, brauchst du zwar über 16V, 
brauchst aber nur wenig Strom uz schalten. 74LS07 tun es dann als 
Treiber.

von Pascal K. (zerb)


Lesenswert?

Hallo,

vielen Dank MaWin für deinen Beitrag! Dann werde ich mich mal in 
Dynamikkompressoren einarbeiten. Audiosignalauswertung ist für mich 
Neuland aber bin bereit mir weiteres anzueignen (will ja auch noch was 
lernen).

Wieso blaue LEDs ? Klar das diese eine höhere VF haben aber ich habe das 
ganze erstmal nur für rote realisiert.

Es erwartet mich noch einiges an arbeit aber ich freue mich drauf :).

Grüße

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Also das um die Uhrzeit ;)

Ja, blöd, wenn man vor Schmerzen nicht schlafen kann :-/


MaWin schrieb:
> ich kennen normale Sch altungen aber mit Q1 als
> JFET und man leitet nicht zur absoluten Masse ab sondern zur virtuellen
> Masse.

Dafür tuts C14 - es geht hier ja nicht darum ein HiFi-Signal an den 
Prozessor zu schicken, sondern nur Bass-Takt-Impulse.

Abgesehen von den von MaWin am Mikrofon vorgeschlagenen Änderungen, gebe 
ich der Schaltung eine Chance.
Auch mit der Beschaltung um Q2 herum. Dort wirst Du vermutlich den 
Pullup des ATmega benutzen - da würde ich nicht noch 10K in Reihe 
hängen. 390Ω sind da schon okay, falls man mal den Port des ATmega 
falsch konfiguriert.


Gruß

Jobst

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Na dann hoffe ich das es dir besser geht Jobst. :)

Nun zu den Schaltungen die in den letzten Tagen entstanden sind, da ich 
die letzten Tagen etwas ausprobieren konnte:

1. Variante (Transistor Q2):
Die erste Variante (siehe Bild 1 des Anhangs) hat schon sehr sehr gut 
funktioniert! Die LED9 hat freudig geblinkt :). Diese war zwar noch 
etwas empfindlich bei schnelleren Basslines aber ich war mit dem 
Ergebnis zufrieden. Die Empfindlichkeit könnte man ja später per Pausen 
im Controller festlegen (Ab wann sich der Controller das nächste Muster 
holen soll).

Da aber die Ausgangsspannung des Transistor Q2 viel zu gering war um mit 
diesen paar mV und dem Controller zu arbeiten, überlegete ich mir 
anstelle des Transistors einfach einen Komparator einzusetzen.

Klar ist das der LM358 kein rail-to-rail OP ist aber es würde ja eine 
Ausgangsspannung >2-2,5V reichen um mit diesem arbeiten zu können.

2. Variante:
Nun eben die zweite Variante. Der Spannungsteiler mit Komparator ist so 
dimensioniert das er ab 650mV in die positive Sättigung gehen soll und 
mir anschließend per Programm die LEDs einschalten soll. Sobald diese 
650mV wieder unterschritten werden, sollen die LEDs wieder ausgehen.

Nun eben hier mein Problem. Ich weiß jetzt leider nicht genau woran es 
liegt ob es an der Komparatorbeschaltung liegt oder doch an meinem Code 
?!

Zum Testen wollte ich PC0 einschalten. Und diesen Ausgang per dem Signal 
steuern. Nur irgendwie sind diese LEDs immer an... Egal ob ein Signal da 
ist oder nicht. Nun weiß ich nicht an was das liegen könnte da der 
Komparator arbeitet (was ich eben mit meinem alten HAMEG HM705 :) 
festellen konnte).

Wäre super wenn sich das mal jemand anschauen könnte. Ich bin grad etwas 
ratlos...

Vielen Dank schonmal für eure Hilfe.

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Na dann hoffe ich das es dir besser geht Jobst. :)

Die Hoffnung stirbt zuletzt ... leider nicht :-(


Pascal K. schrieb:
> 1. Variante (Transistor Q2):
> Die erste Variante (siehe Bild 1 des Anhangs) hat schon sehr sehr gut
> funktioniert! Die LED9 hat freudig geblinkt :). Diese war zwar noch
> etwas empfindlich bei schnelleren Basslines aber ich war mit dem
> Ergebnis zufrieden.

Warum bleibst Du dann nicht bei dieser Variante?
Mit dem OP kann das so nämlich nicht richtig funktionieren, dafür mußt 
Du die Schaltung neu dimensionieren.
Der Transistor ist dort genau das richtige Bauteil.

Also: Mit dem Kollektor von Q2 an den Eingang Deines µCs!
So wie es vorher schon mal war ...


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Ohje das hört sich ja nicht toll an aber die Hoffnung stirbt zuletzt :). 
Gute Besserung!

Vielen Dank schonmal Jobst das du auf meine PN reagiert hast!. Echt 
klasse!

Nun zur Schaltung:
Ich würde schon sehr gerne bei der Transistorvariante bleiben (da diese 
ja auch funktioniert hat) nur ist die Ausgangsspannung am Transistor Q2 
Collector (-> 390R -> µC) zu gering und der µC sieht die ca. 600-800mV 
leider nicht als High an. (Kann das leider nicht besser messen).

Dachte ich könnte das per Komparator am besten lösen aber das ich dann 
alles neu dimensionieren müsste wäre nicht mein Ziel.

Wie kann ich das denn am besten lösen damit mein µC das als "High" 
ansieht ?
Mit einem nichtinvertierenden Verstärker oder anders ?

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pullup im µC einschalten?

Wenn das nicht reicht, 1K am Kollektor gegen +5V


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

In meinem kleinen Testprogramm hatte ich die Pullups schon aktiviert, 
scheint aber nicht auszureichen.

Werde es dann mal mit dem 1k am Kollektor ausprobieren. Hatte mir schon 
so etwas gedacht nur war ich mir nicht sicher ob diese "simple" Methode 
funktionieren könnte. Danke!

Melde mich sobald ich es getestet habe

Gruß Pascal

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Mit der einzelnen LED, direkt am Transistor funktioniert es wunderbar, 
sobald ich das ganze per µC realisieren möchte, habe ich meine Probleme.

@ Jobst: Sorry für diese "doofe" Frage aber kannst du mir das mal kurz 
aufzeichnen wie du das mit den 1k meinst ? Ich hatte es so ausprobiert: 
5V -> 1k -> Kollektor und zwischen 1k und Kollektor sind noch die 390R 
zum µC.

Nur dann leuchten die LEDs dauerhaft... ohne die 1k Variante bekomme ich 
zwar Signale an den µC nur viel zu schwach und mit dem 1k habe ich 
dauerhaft ca. 5V anliegen...

Solangsam bin ich am verzweifeln... :(.

Habe auch nochmals das kleine Testprogramm überarbeitet da ich noch 
einige Fehler drin hatte...

Bin grad echt ratlos...

von Jobst M. (jobstens-de)


Lesenswert?

Ich würde sagen, daß Du es so gemacht hast, wie ich meine:

  +5V
   |
  1KΩ
   |
   +--390Ω----> ATmega
   |
 |/
-|   Q2
 |<\
   |
   |
  GND


Sonst mußt Du den 1kΩ vergrößern ...

Trotzdem wundere ich mich ein wenig, denn die LED hat der Transistor ja 
zum leuchten bekommen, ein paar mA schafft er also. Warum also hast Du 
permanent 5V am Eingang?



Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

So habe nun etwas ausprobiert.

@ Jobst: Genau so wie du es gezeichnet hast, hatte ich es aufgebaut.

Mich wundert das ganze auch gewaltig... Nun hat es aber doch 
funktioniert, d.h. mein Testprogramm ist in Ordnung

ABER:
ich habe etwas interessantes herausgefunden weshalb ich immer 5V am 
Eingang hatte. Sobald ich mit meiner Versorgungsspannung (vor dem 
Spannungsregler), höher als 5V (ca. 5.3V) gehe, leuchten die LEDs die 
ganze Zeit. Und ich habe dauerhaft einen HIGH-Pegel an meinem Input!?

Gehe ich mit meiner Versorgungsspannung genau auf die ca. 5V dann sehe 
ich wie die LEDs ganz schwach aufleuchten aber auf den Bass reagieren 
sowie das ich kein dauer HIGH sondern ein Rechteck-Signal habe.

Nun stellt sich aber die Frage, woher kommt dieser Effekt ?
Ich gehe mit keiner weiteren Verbindung etc. vor dem Spannungsregler auf 
irgend ein Anschluss...

Ich habe keine Ahnung an was das liegen könnte ?!

Würde das später schon gerne mit ca. 12V - 15V betreiben.

Gruß Pascal

von Jobst M. (jobstens-de)


Lesenswert?

Vor dem Spannungsregler sollten immer 7.5-8V liegen, sonst kommen hinten 
keine 5V raus.

In Deiner Schaltung ist noch irgendwas faul.

Aktuelles Schaltbild? Foto?

Und den Pullup kannst Du auch abstellen.


Gruß

Jobst

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Hi,

oh ok, dachte eigtl. ein paar mehr V's würde der Spannungsregler 
abkönnen... Dann habe ich ja nochmal glück, das nichts geraucht hat.

Anbei der aktuelle Plan so ist es auch aufgebaut und so war auch die 
einzeln blink LED aufgebaut (halt ohne den µC-Teil)

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> ein paar mehr V's würde der Spannungsregler
> abkönnen

Jobst M. schrieb:
> immer 7.5-8V

Ich meinte mindestens ... :-/


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Ich selbst kenne da als Faustregel mindestens +2 oder +3V mehr als die 
Ausgangsspannung des Reglers. Die "paar" Volt mehr die "nicht genutzt" 
werden, werden ja dann eh in Wärme umgewandelt.

Laut Datenblatt max. 35V aber betreibe es am Ende ja dann mit 12V-15V 
dann hat es genug "puffer" nach oben und nach unten :).

Und hast du schon etwas entdeckt ? gespannt bin

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Wie verhält sich meine SW?


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Ah sorry mein Fehler... Ich setze grad einen ATmega168 ein. Aber ist ja 
eigentlich egal da Pinkompatibel.

Signal liegt zwar am Pin an an nur da rührt sich nichts am Ausgang... 
Keinerlei Pegeländerung. Naja die LEDs leuchten nun jedenfalls 
nichtmehr.

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Für den 168er gibt es auch ein anderes Hexfile ... :-/

Also daaamit ...


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Also mit der Hexfile sieht es schon um einiges besser aus! Danke 
schonmal :)
Was hast du denn geändert ?

Bei 15V Versorgungsspannung erkenne ich noch sehr gut das die LEDs 
reagieren, da war bei mir und 5.3V schon schluss.

Nur leuchten die LEDs noch immer die ganze Zeit. Falls mich meine Augen 
nicht trügen, versucht er die LEDs auszuschalten als anzuschalten.. hm..

Sollte ich evtl. mal die Beschaltung am BC337 abändern ?

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Pascal K. schrieb:
> Also mit der Hexfile sieht es schon um einiges besser aus! Danke
> schonmal :)

Also ist Deine SW nicht einwandfrei.

Pascal K. schrieb:
> Was hast du denn geändert ?

Ich habe dem Kompiler gesagt, daß es ein ATmega168 ist, kein ATmega8.


Pascal K. schrieb:
> Falls mich meine Augen
> nicht trügen, versucht er die LEDs auszuschalten als anzuschalten.

Richtig. War ja nur ein Test ... hier noch einmal invertiert.


Pascal K. schrieb:
> Sollte ich evtl. mal die Beschaltung am BC337 abändern ?

Nein!


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

OMG JOBST! Ich liebe dich! :)

Jetzt leuchten zwar noch die 3 anderen Pins vom Port aber das ist egal 
denn der richtige blinkt endlich!!!! freuuu
Man bin ich nun happy! :)

Könntest du mir evtl. dein C-Programm zukommen lassen (nicht nur als 
.hex) ?

Was genau hatte ich denn nun falsch gemacht ? Das invertieren des Ports 
vergessen ?!

Was schulde ich dir für deine großartige Hilfe ?

Gruß

von Jobst M. (Gast)


Lesenswert?

Danke, danke, sooo aufwendig wars nun auch net ;)
Das Programm kann ich dir gerne per E-Mail senden, du kannst mir ja per 
PM deine Adresse geben (bin nur grad net zuhause, deshalb kanns bis 
Montag dauern)

Gruß,
Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> OMG JOBST! Ich liebe dich! :)

#lach#


> Könntest du mir evtl. dein C-Programm zukommen lassen (nicht nur als
> .hex) ?

Nö. Es gibt keins.
1
.include "m168def.inc"
2
3
.def temp  = r16      ; allgemeines Register
4
5
; **************************************************************************
6
;  IRQ-Vector-Table
7
; **************************************************************************
8
9
.org 0x0000          ; Reset Handler
10
        rjmp    main
11
12
; **************************************************************************
13
;  MAIN - hier gehts los!
14
; **************************************************************************
15
16
main:
17
  ; Ports initialisieren
18
19
    ldi  temp, 0xFF
20
    out  DDRC, temp
21
    ldi  temp, 0x00
22
    out  DDRD, temp
23
24
loop:    in  temp, PIND
25
    com  temp
26
    out  PORTC, temp
27
    JMP  loop

> Was genau hatte ich denn nun falsch gemacht ?

Evtl. für einen ATmega8 kompiliert?


> Was schulde ich dir für deine großartige Hilfe ?

nääääää ...


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Jobst M. schrieb:
> Danke, danke, sooo aufwendig wars nun auch net ;)
> Das Programm kann ich dir gerne per E-Mail senden, du kannst mir ja per
> PM deine Adresse geben (bin nur grad net zuhause, deshalb kanns bis
> Montag dauern)
>
> Gruß,
> Jobst

Wer faket mich denn hier o.O

Jobst nur original registriert ...


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Toller Troll, kann einem unregistrierten auch eine PM senden...

@ The-Original-Jobst :):

Habe nochmals mein "tolles" C-Programm gesichtet. Irgendwie bekomme ich 
das grad einfach nicht hin.

Build started 25.6.2011 at 21:23:48
AVR Memory Usage
----------------
Device: atmega168
... usw

Also es ist definitv für ein ATmega168. Könnte ich da auch etwas evtl. 
durch die FUSE-Bits vermasselt haben ?

Danke aber für dein .asm Quelltext, evtl. finde ich dann im Debug-Modus 
mein Fehler.

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Habe nochmals mein "tolles" C-Programm gesichtet. Irgendwie bekomme ich
> das grad einfach nicht hin.

C ist nicht meine Baustelle, da kann ich Dir nicht weiter helfen.

Pascal K. schrieb:
> Also es ist definitv für ein ATmega168. Könnte ich da auch etwas evtl.
> durch die FUSE-Bits vermasselt haben ?

Hmmm ... nö, so wie es aussieht ehr nicht.


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Jobst M. schrieb:
> C ist nicht meine Baustelle, da kann ich Dir nicht weiter helfen.

Hast mir aber schon sehr geholfen mit deinem kleinen Testprogramm!
Eine Frage nur noch:
1
loop:    in  temp, PIND
2
    com  temp
3
    out  PORTC, temp
4
    JMP  loop

damit wird doch der ganze PORTC geschaltet ? Mich wundert es, das nur 
der erste Pin reagiert und die anderen LEDs (habs erweitert) dauerhaft 
leuchten.

Oder ist das evtl. wie beim PIC bei dem man vorher den Port von analog 
auf digital umschalten muss, da dies ja der ADC-Port ist?

Ich suche mal weiter nach meinem "C"-Fehler ;/

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> damit wird doch der ganze PORTC geschaltet ?

Jopp. Wird einmal komplett kopiert von PortD


Pascal K. schrieb:
> habs erweitert

wie?


Pascal K. schrieb:
> Oder ist das evtl. wie beim PIC bei dem man vorher den Port von analog
> auf digital umschalten muss, da dies ja der ADC-Port ist?

Nein, man muß den ADC aktivieren, um einen ADC-Port davon zu machen.



Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Jobst M. schrieb:
>> habs erweitert
>
> wie?

An PC1, PC2 und PC3 nochmals diese Anzeige. 1k - BC337 - LEDs - 150R - 
5V. Eben wie an PC0.

PC0 - blinkt
PC1, PC2 und PC3 - dauerhaft am leuchten.

Jobst M. schrieb:
> Nein, man muß den ADC aktivieren, um einen ADC-Port davon zu machen.

Ah ok, kenne das nur vom PIC bsp. 16F887 das man hier PORTA "umschalten" 
bzw. bestimmte Register clearen muss bevor man diesen digital verwenden 
kann.

Gruß

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Versuch mal dies.

Bitte die DIV8 Fuse löschen! (für 8MHz Takt)


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Jobst M. schrieb im Beitrag #2240358:
> Versuch mal dies.
>
> Bitte die DIV8 Fuse löschen! (für 8MHz Takt)
>
>
> Gruß
>
> Jobst

DANKE DANKE DANKE....! Kann mich garnicht genug bedanken!!!

Es laufen die einzelnen Portpins sehr toll zur Musik durch! Und durch 
die "Wartezeit" sowie auf den Impuls warten, ist die Schaltung um 
einiges unempfindlicher geworden und nichtmehr ein "nervöses" geblinke!

kusje :)

Nur mich ärgert es total das ich es selbst noch nicht mit C geschafft 
habe ein einfaches Testprogramm zu realisieren sowie nach "einem" Fehler 
suchen der eigtl. kein Fehler war... Oh man. Ich glaube ich gehe nun mal 
ins Bett und morgen nach einer Lösung suchen.


Nochmals vielen vielen Dank an deine tolle Hilfe ohne die wäre ich glaub 
völlig verzweifelt.

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Es laufen die einzelnen Portpins sehr toll zur Musik durch!

Kannst ja mal ein Video machen :-)

Uuuund Du kannst das 'INC muster' ja mal vor das ANDI setzen. ;-)
1
loop:    IN  temp, PIND
2
    INC  muster
3
    ANDI  temp, 1
4
    BRNE  loop    ; Auf Impuls warten (negative Flanke am Eingang)
5
6
    OUT  PORTC, muster  ; neues Muster ausgeben


Gute Nacht

Jobst

von Pascal K. (zerb)


Lesenswert?

Hey Jobst,

ein Video bekommst du auf alle Fälle! (werde ich nachher noch 
aufnehmen). Hatte mal schon ein Video der ersten Version gemacht (diese 
war ja ohne µC mit der LED und R direkt am Kollektor von Q2).

Ist dann auch sicherlich interessant zu sehen das die Empfindlichkeit 
deutlich abgenommen hat durch die "Pausen" sowie die Impulse abwarten.

Jobst M. schrieb:
> Uuuund Du kannst das 'INC muster' ja mal vor das ANDI setzen. ;-)

HUIII ;) Das sieht ja spannend aus!!!!

Gruß Pascal

von Pascal K. (zerb)


Lesenswert?

So, wie versprochen die Videos:
https://rapidshare.com/files/3141293461/Daft_Punk_Tests.zip

Es sind insgesamt 3 Videos (per VLC abspielbar):
DPtransistor: erster Test
DPµCnach: mit Jobst seinem .asm Programm
DPµCdurch: mit INC vor ANDI :)

Gruß Pascal

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> So, wie versprochen die Videos:

Man kommt nur nicht dran ...

Wie groß ist das Ding denn?


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Hi,

du musst nur auf "Kostenloser Download" klicken und dann etwas warten. 
Die .zip File hat ca. 47MB

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> du musst nur auf "Kostenloser Download" klicken und dann etwas warten.

5 Minuten ...

Dann lahmer Download ...

Dann schmiert aufgrund der Last, die diese Seite erzeugt mein Browser ab 
und den nächsten Download darf ich in 30 Minuten wagen...

Und die nennen sich 'The Anti-waiting-company'?

Wie kann sich sowas etablieren? *Kopf schüttelt***


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Also ich verstehe das auch nicht... früher war die Wartezeit ohne 
rs-account bei max. 45sec und die Geschwindigkeit vom Download war ok.

Ich hatte es vorhin auch mal ausprobiert und war echt sauer das man nun 
5 Minuten warten muss... wusste nicht das die es geändert hatten.

Jobst M. schrieb:
> Und die nennen sich 'The Anti-waiting-company'?
>
> Wie kann sich sowas etablieren? *Kopf schüttelt***
Du zahlen + Sie haben Geld = beide freuen sich... naja...

Das mit 30min ist ja bei dir noch "ok" (milde ausgedrückt) ich habe eine 
Standleitung und durch meine feste IP darf ich erst nach 24 Stunden 
wieder etwas von rs ziehen... Lächerlich sowas. Für normales ISDN bzw. 
DSL gibt es ja Tools zwecks "Connect+Disconnect vorgaukelei" dann geht 
das sofort wieder.

Kenne leider sonst keine Möglichkeit wo ich das sonst Hochladen könnte. 
Habe leider kein Webserver...

Warst du denn nun erfolgreich mit dem Download ? :)
Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Warst du denn nun erfolgreich mit dem Download ? :)

Mein Gott, jetzt hat er's ...

Ja, chic :-)


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Jobst M. schrieb:
> Mein Gott, jetzt hat er's ...

Irgendwann klappt es doch :)


Jobst M. schrieb:
> Ja, chic :-)

Ich finde es auch sehr toll! ;) und man sieht ja eindeutig die 
unterschiede zwischen Transistor und µC Version.

Sodele, nachdem ich ja leider nur den ATmega168 rumliegen hatte und der 
mir später zwecks Portpins nicht ausreichen würde, verwende ich einfach 
den ATmega16.

Was mich interessien würde ob ich denn eine art Mustertabelle (in deinem 
tollen Programm ;)) erstellen kann in dem ich eben komplett PORTA PORTB 
PORTC PORTD als 1, 2, 3 und 4 Spalte definieren kann und darunter eben 
binär oder als hex hinterlegt habe welcher Pin, High oder Low sein soll.

(Denke mal nicht da ich .asm als "Schritt für Schritt" Variante kenne 
:/)

Ich habe schon bisschen herumgesucht und hatte sehr oft den Befehl .db 
entdeckt.
Wie gehe ich denn am besten vor ?
Mich interessiert ganz einfach ob ich denn damit dann alle Ports 
beeinflussen kann oder nicht ? Wäre jedenfalls der Gedankengang korrekt 
?

Beispielsweise:

Aufruf erfolgt dann im loop.
xx Muster xx
1
Muster:
2
.db     0b11000000        // 1 Muster
3
.db     0b11111001        // 2 Muster
4
.db     0b10100100        // 3 Muster
5
.db     0b10110000        // 4 Muster
6
.db     0b10011001        // 5 Muster
7
.db     0b10010010        // 6 Muster
8
.db     0b10000010        // 7 Muster
9
.db     0b11111000        // 8 Muster
10
.db     0b10000000        // 9 Muster
11
.db     0b10010000        // 10 Muster

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Sodele, nachdem ich ja leider nur den ATmega168 rumliegen hatte und der
> mir später zwecks Portpins nicht ausreichen würde, verwende ich einfach
> den ATmega16.

Wie viele LEDs willst Du denn ansteuern?
21 schaffst Du mit dem 'kleinen' ohne weiteres.

Pascal K. schrieb:
> Denke mal nicht

Falsch gedacht. Setz das 'INC muster' wieder an die alte Position. Nun 
hast Du einen Zeiger auf Deine Tabelle, den Du nur noch auf 10 begrenzen 
mußt.
Also ein 'Wenn muster>9, dann muster=0'

Die Tabelle sollte dann geschickter Weise nicht auch noch Muster heißen 
...
Sollte mit der Tabelle mit ein paar Befehlen erledigt sein:
1
    INC  muster    ; Nächstes Muster
2
    cpi  muster, 10  ; Mit 10 vergleichen
3
    brsh  1    ; Einen Befehl überspringen solange nicht 10
4
    clr  muster    ; Wenn 10, dann 0
5
6
    clr  temp
7
    ldi  ZL, LOW(Mustertable*2)
8
    ldi  ZH, HIGH(Mustertable*2)
9
    ADD  ZL, muster
10
    ADC  ZH, temp
11
    LPM  temp, Z
12
    OUT  PORTC, temp

Ach ja: Die meisten AVR Assembler erwarten immer eine gerade Anzahl an 
Bytes in Datenfeldern, sonst wird ein Leerbyte angehängt.

Also die Bytes verpaaren - oder alle in eine .db Zeile ...

Dir ist bei Deinen Mustern schon aufgefallen, daß eine LED ständig 
leuchtet, andere dafür nur 1 oder 2 Mal?


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Servus. Ohje schon wieder so spät...arbeite eindeutig zu lange :).

Jobst M. schrieb:
> Wie viele LEDs willst Du denn ansteuern?
> 21 schaffst Du mit dem 'kleinen' ohne weiteres.

Da der Tisch später ein 5x5 großes Feld hat, sprich 25. Bräuchte ich 
eben 25 Pins als Ausgänge. Je nach LED Auswahl (zwecks Ausleuchtung der 
Felder etc) pro Pin 2-4 LEDs.

Jobst M. schrieb:
> Falsch gedacht. Setz das 'INC muster' wieder an die alte Position. Nun
> hast Du einen Zeiger auf Deine Tabelle, den Du nur noch auf 10 begrenzen
> mußt.
> Also ein 'Wenn muster>9, dann muster=0'
>
> Die Tabelle sollte dann geschickter Weise nicht auch noch Muster heißen
> ...
> Sollte mit der Tabelle mit ein paar Befehlen erledigt sein:

Ok, dann habe ich eindeutig falsch gedacht. Ist dann ja theoretisch wie 
ein Uhrzeiger. Beim "Signal" zeigt der Zeiger auf das nächste Muster. 
Beim letzten Muster springt er wieder an den Anfang.

Es müsste doch auch möglich sein mehrere Zeiger mit einem 
"Ausgangspunkt" (in meinem Fall dem Bassignal) zu verknüpfen ?
Wenn ich PORTA - PORTD in 4 Zeigerdiagramme seperate Muster ausgeben 
möchte, sollte es doch möglich sein, mit einer art Unterprogrammaufruf 
alle gleichzeitig abzufragen ? (Irgendwie kann ich das grad nicht 
richtig erklären wie ich das meine). Evtl mit Code unten besser.

Ich müsste mich da eh noch etwas einlesen in diesen Zeigerablauf und ob 
man evtl mit einem Z-Pointer auf mehrere Tabellen schauen kann.

Bitte nicht erschrecken :). Entweder das geht überhaupt nicht oder es 
wäre von Hinten durch den Kopf programmieren :).
1
INC  muster     ; Nächstes Muster
2
cpi  muster, 10 ; Mit 10 vergleichen
3
brsh  1         ; Einen Befehl überspringen solange nicht 10
4
clr  muster     ; Wenn 10, dann 0
5
6
clr  temp
7
(hier in die zweite Table springen oder keinerlei Aufruf und Z-Pointer fragt mehrere Tabellen ab?)
8
ldi  ZL, LOW(MusterCtable*2, MusterAtable*2)
9
ldi  ZH, HIGH(MusterCtable*2, MusterAtable*2))
10
ADD  ZL, muster
11
ADC  ZH, temp
12
LPM  temp, Z
13
OUT  PORTC, temp
14
15
MusterC:
16
.db     0b11000000        // 1 Muster
17
.db     0b11111001        // 2 Muster
18
.db     0b10100100        // 3 Muster
19
.db     0b10110000        // 4 Muster
20
.db     0b10011001        // 5 Muster
21
.db     0b10010010        // 6 Muster
22
.db     0b10000010        // 7 Muster
23
.db     0b11111000        // 8 Muster
24
.db     0b10000000        // 9 Muster
25
.db     0b10010000        // 10 Muster 
26
27
MusterA:
28
.db     0b11000000        // 1 Muster
29
.db     0b11111001        // 2 Muster
30
.db     0b10100100        // 3 Muster
31
.db     0b10110000        // 4 Muster
32
.db     0b10011001        // 5 Muster
33
.db     0b10010010        // 6 Muster
34
.db     0b10000010        // 7 Muster
35
.db     0b11111000        // 8 Muster
36
.db     0b10000000        // 9 Muster
37
.db     0b10010000        // 10 Muster


Jobst M. schrieb:
> Ach ja: Die meisten AVR Assembler erwarten immer eine gerade Anzahl an
> Bytes in Datenfeldern, sonst wird ein Leerbyte angehängt.
>
> Also die Bytes verpaaren - oder alle in eine .db Zeile ...

Ja das hatte ich gelesen ist ja bedingt durch die 16Bit Organisation im 
Flash Speicher. Und dann entweder eine 0 dran oder verpaaren oder .db.

Jobst M. schrieb:
> Dir ist bei Deinen Mustern schon aufgefallen, daß eine LED ständig
> leuchtet, andere dafür nur 1 oder 2 Mal?

xD ja, aber hatte nur mal als Beispiel eine 7-Segment Anzeige genommen.

Gruß!

von Jobst M. (jobstens-de)


Lesenswert?

Was hältst Du davon, die Muster für die verschiedenen Ports 
hintereinander in einer Datenzeile zu halten und dann sowas zu 
machen.(s.u.) Dann lädst Du die Muster-Basis-Adresse in Z nur, wenn 
muster auf 0 gesetzt wird - aber bastel mal selber :-)

LPM  temp, Z+
OUT  PORTC, temp
LPM  temp, Z+
OUT  PORTA, temp


Pascal K. schrieb:
> (hier in die zweite Table springen oder keinerlei Aufruf und Z-Pointer fragt 
mehrere Tabellen ab?)
> ldi  ZL, LOW(MusterCtable*2, MusterAtable*2)

Nö. Musst Du nacheinander machen.



Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Jobst M. schrieb:
> Muster für die verschiedenen Ports
> hintereinander in einer Datenzeile zu halten

Genau so hatte ich es mir eigtl. auch gedacht :).
Dann werde ich mal schauen was ich in den nächsten Stunden und Tagen 
zusammenbekomme! Danke schonmal!

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Genau so hatte ich es mir eigtl. auch gedacht :)

Dies

Pascal K. schrieb:
> MusterC:
> .db     0b11000000        // 1 Muster
> :
> .db     0b10010000        // 10 Muster
>
> MusterA:
> .db     0b11000000        // 1 Muster
> :

sieht aber nicht danach aus ... ;-)

Schauen wir mal ...


Gruß

Jobst

von Pascal K. (zerb)


Lesenswert?

Haha Jobst :D, das da oben sollte es auch garnicht sein. Hatte mir mal 
vor längerem etwas überlegt nur ob das dann so im .asm geht weiß ich 
eben nicht.

Let me try it out! yeah ;)

Habe manchmal wenn ich schreibe noch tausend andere Ideen im Kopf :D

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

Sodele,

nunja bin grad etwas im Streß und habe mir erstmal ein Grundgerüst des 
Codes für den späteren ATmega16 erstellt. Wahrscheinlich schlagst du dir 
(Jobst) die Hände über dem Kopf zusammen wenn du es siehst. Aber mühsam 
ernährt sich das Eichhörnchen und irgendwie werde ich das Kind schon 
schaukeln. :)
Hatte jetzt leider auch noch nicht die Zeit wirklich daran zu basteln 
und zu testen. (Wenn man um 21-22 Uhr von der Arbeit kommt hat das glaub 
niemand).

Des Weiteren habe ich noch etwas Material bestellt. Sprich den ATmega16, 
paar LEDs (normale 5mm rot), Experimentierplatinen, BC337 und 
Lochraster. Möchte dann erstmal eine kleine Matrix aufbauen. Also 25 
LEDs auf einer Lochraster dann kann ich herumprobieren zwecks der 
Ausgabe bzw. Anzeige und somit besser die Muster erstellen.

Anbei mal das Grundgerüst des Codes. Es ging zwar zu Compilieren nur ich 
selbst habe es noch nicht Debugged und es wäre ja schön wenn es so 
einfach wäre :).

Gruß und Gute Nacht!

von Jobst M. (jobstens-de)


Lesenswert?

Moin!
1
   IN temp, PIND0
2
   ANDI temp, 1

PIND0 ?
Überleg mal, was die zweite Zeile tut.


1
  clr  temp
2
  ldi  ZL, LOW(Muster*2)
3
  ldi  ZH, HIGH(Muster*2)
4
  ADD  ZL, Anzeige
5
  ADC  ZH, temp
6
  
7
  OUT  PORTA, temp

Was wird auf Port A ausgegeben?


1
  LPM temp, Z+
2
  OUT PORTB, temp
3
  LPM temp, Z+
4
  OUT PORTC, temp
5
  LPM temp, Z+

Falls Z mal 'entgleisen' sollte oder Du einen Fehler in den Datenreihen 
hast:
1
  ANDI temp, 127
1
  OUT PORTD, temp

Das kannst Du so machen, wenn Du auch den Z-Pointer nur einmal setzt.
Das machst Du aber nicht.


1
; *********PORTA*******PORTB*******PORTC*******PORTD************************  
2
3
  Muster:
4
5
  .db  0b11111111, 0b11111111, 0b11111111, 0b11111110  // 1

Zur Fehlersuche empfiehlt es sich hier, verschiedene Muster einzusetzen.


Gruß & Gute Nacht

Jobst

von Pascal K. (zerb)


Lesenswert?

Guten Abend :)

Jobst M. schrieb:
> Moin!
>    IN temp, PIND0
>    ANDI temp, 1
>
> PIND0 ?
> Überleg mal, was die zweite Zeile tut.

ANDI temp, 1 : Habs mir nochmal angeschaut und wenn ich das nun richtig 
verstehe, verändere ich mit ANDI sozusagen das 1-Bit (PIND0) und lasse 
die anderen unberührt ?

Jobst M. schrieb:
> Was wird auf Port A ausgegeben?
Hatte das gestern noch gemerkt dass das so nicht stimmt, so soll es 
sein:
1
LPM temp, Z+
2
OUT  PORTA, temp
3
LPM temp, Z+
4
OUT PORTB, temp
5
LPM temp, Z+  
6
OUT PORTC, temp
7
LPM temp, Z+
8
OUT PORTD, temp
9
CALL WAIT_100ms    ; warten

Jobst M. schrieb:
> Falls Z mal 'entgleisen' sollte oder Du einen Fehler in den Datenreihen
> hast:  ANDI temp, 127
>   OUT PORTD, temp

Wieso 127 ? Verstehe ich jetzt nicht was man mit 127 angibt ?

Jobst M. schrieb:
> Das kannst Du so machen, wenn Du auch den Z-Pointer nur einmal setzt.
> Das machst Du aber nicht.

Das muss ich noch herausfinden wie man das dann macht :).

Mustertabelle nur mal etwas "einfaches" auf die schnelle. Naja, wie ich 
eben alle Muster zusammenpacke, daran arbeite ich noch (wenn ich mal 
wieder Zeit habe...)

Jedenfalls kam schon meine Hardware für die kleine Testmatrix.

Gruß und Gut's Nächtle Pascal!

von Pascal K. (zerb)


Lesenswert?

> Falls Z mal 'entgleisen' sollte oder Du einen Fehler in den Datenreihen
> hast:  ANDI temp, 127
>   OUT PORTD, temp

Wieso 127 ? Verstehe ich jetzt nicht was man mit 127 angibt ?

Hm... also 127 wären ja 0b0111 1111 also die unteren 7 Bits von PORTD. 
Müsste das aber nicht 254 sein 0b1111 1110, wegen dem Signaleingang an 
PORTD ?

Gruß

von Jobst M. (jobstens-de)


Lesenswert?

Pascal K. schrieb:
> Müsste das aber nicht 254 sein 0b1111 1110, wegen dem Signaleingang an
> PORTD ?

Ja, korrekt - ich hatte es verdreht ...
Aber Du bist ja auch selber drauf gekommen ;-)


Pascal K. schrieb:
> verändere ich mit ANDI sozusagen das 1-Bit (PIND0) und lasse
> die anderen unberührt ?

Nein, Du liest ja von Port D. Da passiert etwas anderes.


Gruß

Jobst

von Pascal K. (zerb)


Angehängte Dateien:

Lesenswert?

So habe nun erstmal den Schaltplan an einen ATmega16 angepasst.

PORTB soll nur für die ISP Schnittstelle dienen, erstmal nur der 
Musiksignaleingang und ein LED-Ausgang (damit ich auf 25 komme). Evtl. 
nutze ich die zwei letzten PORTB freien PINS für später eine Musterwahl 
falls mal die Musik aus ist oder zum umschalten zwischen Musikmodus und 
eben "Durchlaufmodus/Demomodus".

Die ISP Pins werden erstmal nicht doppelt belegt.

PORTA, PORTC und PORTD sind pro PIN (1 LED) für die anderen 24 LEDs.

---

Das teilweise schon "Endprogramm" habe ich nun erstmal abgewandelt für 
PORTB. Hoffe mal das würde soweit stimmen.

Jobst M. schrieb:
> Das kannst Du so machen, wenn Du auch den Z-Pointer nur einmal setzt.
> Das machst Du aber nicht.

Wie das geht, weiß ich noch nicht das wird sicherlich für mich am 
kniffeligsten zwecks dem richtigen Code bzw. Befehle verwenden.

Habe auch mal verschiedene Muster in die Tabelle geschrieben. Natürlich 
muss ich erst noch die kleine Matrix fertig löten, die auch schon fast 
fertig ist.

Jobst M. schrieb:
> IN temp, PIND0
>    ANDI temp, 1

So ich probiers nochmal...

IN temp, PIND -> Daten/Status von "PIND" in's temp laden
ANDI temp, 1  -> Isoliert das 1 Bit im Temp ? :X

Gruß Pascal

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.