mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Led Cluster ansteuern


Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

Habe folgendes Problem mit einem Led-Cluster.
Spannung ist 10 Volt und 60 mA Strom. (15 Leds , rot)
Wie schalte ich diese Spannung/Strom mit dem ATmega8 ?
Habe schon mit einem Transistor und Optokoppler versucht aber ich
bekomme nicht die volle helligkeit hin, weil nicht genug Strom durch
den Cluster fließt.
Gibt es spezielle Treiber dazu ?

Für Eure Hilfe bin ich Euch sehr dankbar.

Gruß Roman

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Optokoppler ist nicht erforderlich.
Ansonsten kann man nur raten, was du da fabriziert hast. Stell mal
rein, was du genau gemacht hast.

Autor: Jens D. (jens) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>10 Volt und 60 mA
>>15 LEDs

hmmh kann auch nicht ganz funktionieren je nach dem welche LEDs
wenn man von den "standart" LEDs aus geht brauchen diese ca. 20mA das
stueck bei 2 .. 3V

wen du nun jede LED einzelnd ansteuern willst kommst du aug ferade mal
3 stück mehr nicht

hast du allerdings eine Matrix anzeige

   1 2 3 4 5
A  # # # # #
B  # # # # #
C  # # # # #

könnte es klappen mit deinen 60mA

aber wie schon gesagt eine genaue Beschreibung fehlt

Gruss Jens

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>>10 Volt und 60 mA
>>>15 LEDs
>
> hmmh kann auch nicht ganz funktionieren je nach dem welche LEDs
> wenn man von den "standart" LEDs aus geht brauchen diese ca. 20mA
> das stueck bei 2 .. 3V

z.B. 5 Stück in Reihe, dreimal parallel, gibt 10V, 60mA.

Autor: Roman (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Dannke erstmal für die schnellen Antworten !

Der Cluster ist eine fertige "Lampe" mit 3x5 also 15 Superhellen
Leds.
(Bei Reichelt gekauft 4,50 €).
Habe ein Bild davon angehängt.
Also keine Matrix oder ähnlichem.
Die Lampe hat zwei Kontakte sonst nichts.
Habe auch eine Skizze gemacht wie ich das angeschlossen habe.
Laut Datenblatt ist der Optokoppler für ein Strom von 100 mA
ausgelegt.
Müsste also ausreichen.
Und trotzdem messe ich nur ca. 25 mA.
Kann ich mir nicht erklären.
Oder ist das normal das ich weniger Strom messe als es wirklich ist?

Autor: stift (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich gehe mal davon aus, daß der Cluster als Stromregelung nur
Vorwiderstände besitzt. Solche Cluster reagieren dann empfindlich auf
Abweichungen der Eingangsspannung. Meß mal den Spannungsabfall über den
"Schalttransistor". Ist dieser geeignet die Last zu treiben?

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ob der Transistor geeignet ist weiss ich nicht.
Wie kann ich das prüfen ?
Die bezeichnung ist BC 337-40
Ich messe dort 3 Volt.

Roman

Autor: stift (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus dem Datenblatt. RFM. Sorry.

Wenn die 3 V die UCE des Transistors sind, hast du an dem Cluster nur
noch 9 V liegen. Hätte ich aus dem Stromverbrauch auch so geschätzt.

Autor: Ralf N. (runni) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

der BC337-40 ist stark genug, leider weis ich nicht ob der AT-MEGA
interne pull-ups hat. Da der BC337-40 sowiso etwas mehr Basisstrom
verträgt nimm doch einen 1K Widerstand als pull-up.
Die Schaltung sollten dann wie folgt aussehen:
BC337: Emitter an Masse(GND) Basis direkt am Ausgangs des AT-MEGA,
zusätzlich ein 1K Widerstand von der Basis auf +5V (pull-up), Die Anode
(+) des LED-Clusters auf 12V+ und die Kathode(-) auf den Kollektor des
BC337, das wars!. Auf die Art kannst du Lasten bis 500mA Strom
schalten.

Gruß, Ralf N.

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank Ralf !

Werd ich gleich ausprobieren.

Gruß Roman

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss ich den Pin dann als eingang stellen weil es leuchtet auch wenn die
verbindung zum Controller unterbrochen ist.
Aber es leuchtet gut habe jetzt mit einem ca.50 Ohm Widerstand meine 60
mA. Klasse.

Gruß Roman

Autor: Ralf N. (runni) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

natürlich leuchtet es wenn der Controller nicht dran ist, da ja der
Transistor über den Widerstand durchgesteuert wird.
Das Prinzip ist folgendes:
Der Controller liefert nur einen geringen Strom bei high am Ausgang,
deshalb hilft man mit einem pull-up nach der den Strom zum steuern des
Transistors liefert. Andersrum kann aber der Conroller einiges an Strom
gegen Masse schalten, bedeutet sobald man eine 0 ausgibt ist es für den
Controller kein Problem 5mA Strom gegen Masse kurzzuschließen so das an
der Basis vom Transistor 0 Volt anliegen und er speert.
Also gib einfach mal eine 0 am Portpin aus und schon wird auch dein LED
Cluster ausgehen, oder brücke mal Masse auf die Basis des T. dann
passiert das gleiche.

Gruß, Ralf N.

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ,

Vielen Dank für die Erklärung Ralf, habe einiges dabei gelernt.
Jetzt steht der Aufgabe einen Sonnenaufgang für Aquarium Fische nichts
mehr im wege.

Danke auch an die anderen.

Gruß Roman

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Basis direkt an den Port kommt, was ist dann bei H-Pegel am
Port???

Der ATMega hat nämlich Gegentaktausgänge.

...

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was ist ein Gegentaktausgang ?
Geht der Port dan nicht kaputt ohne Wiederstand?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das meinte ich damit...

...

Autor: Roman (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so wie das oben beschrieben angeschlossen messe ich 0,95 Volt.
Ich habe das ohne pull-up Wiederstand angeschlossen also:
von Port zum Wiederstand 1k Ohm dann weiter zum Basis am Transistor.
Das funktioniert gut.

Autor: Ralf N. (runni) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

wenn das so ist das der AT-MEGA Transistor-Brücken am Ausgang hat dann
muss natürlich der Basisstrom begrenzt werden, und der pull-up
entfällt. Ich hatte bis jetzt noch nicht mit AT-MEGA zu tun aber die
anderen MCUs hatten immer interne pull-ups und einfache
Transistorausgänge.
Gibt es denn einen Treiberbaustein mit Brücken-Ausgang, benötige ich
für einen R2R D/A Wandler.

Gruß, Ralf N.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HCT245

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe auch vor, ein led cluster über nen µController zu steuern.
Das Cluster hat 10 mal 3 LEDS in reihe mit Vorwiderstand für 12 V und
einmal eine LED einzelnd mit 12V VoWid.
Habe nun das Problem, dass diese einzelne LED immer an ist, da der
Transistor nicht richtig "zu" macht. auch ohne µController an der
basis fließt andauernd ein strom. Was kann ich tun?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hö? Spannung an der Basis wegenehmen, dann kann auch kein Strom mehr
fließen.

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tja, das tut es leider aber... es liegt eine spannung von ca 7 ~ 8 V an,
wenn man schaltet, dann natürlich 12V. aber diese 7 volt reichen, um die
eine einzelne led zum leuchten zu bringen. für den rest reicht es nicht
aus, die sind dann halt wie gewünscht dunkel.
habe einen BC 875 glaub ich, jedenfalls npn
weiß echt nicht weiter... leider zieht das cluster zu viel strom, um es
mal an den anderen transistoren zu testen, die ich hier rumliegen habe.
der 875er soll 2A können. die leds ziehen ~300 mA
was ist, wenn ich die basis nicht nur auf null setze, sondern
zusätzlich auf -5v oder so? veringert sich der strom dann vielleicht

Autor: hans dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es mit einem "normalen" Basis-Vorwiderstand?
Dann hat men einen Spannungsabfall vom uC Pin über die Basis des
Transistors auf das Bezugspotenzial (Masse oder UB).
Dieser Spannungsabfall ergibt einen Basis-Strom und dieser ist die
Grundlage für das "Schalten" (Eigentlich nur Stromverstärkung) des
Transistors.

Die Pins eines AVRs können 5 mA leisten (eigentlich noch mehr, aber der
Gesamte chip darf eine maximale Stromstärke nicht überschreiten -> siehe
Datenblatt "Electrical Characteristics"

Nun kann der Vorwiederstand entsprechend dimensioniert werden. probier
mal 5k)

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also: AVR-pin -- Widerstand (ca 5k) -- Basis ? und leds, bzw masse an
collector und emitter ? das hatte ich schon. der strom geht nicht ganz
aus. aber wird stärker, wenn AVR-pin auf high ist.

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn der Portin 4.6V liefert, die Basis aber nur 0.8 Volt braucht,
kannst Du einen Spannungsteiler statt eines Vorwiderstandes nehmen. So
hast du einen Widerstand von der Basis nach Masse, der die Basis dann
auch "leerräumt".

Portpin--470Ohm--+->Basis
                 |
               2,2KOhm
                 |
                 -(Masse)

Was mir beim "zeichnen" gerade auffällt. Der AVR hat doch, wie
erwähnt Gegentaktausgänge. Dieser sollte ja wohl stark genug sein, die
funktion des 2.2KOhm Widerstand zu erfüllen. Deine Schaltung ist sicher
irgentwie falsch. Was hast Du doch gleich für einen Transistor
verwendet? BC845? Sieh mal nochmal nach, bitte und stell mal die
Schaltng rein.

Wir wern ja wohl die Lampen auskriegen_

AxelR.

Autor: hans dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich hat der AVR Gegentakt-Ausgänge...
Jetzt mal eine ganz dumme Frage: Ist der Pin auch als Ausgang
geschaltet? Ich hatte mal in der Firmware von einem Programmer einen
Bug, indem die Richtung des Pins nicht richtig geschaltet wurde. Das
Quasi-Software-RS232 ging aber trotzdem (manchmal). Wenn der Pin auf
Eingang steht, dann wird nur immer der Pull-Up ein- und ausgeschaltet
und die 30k reichen dann aber trotzdem aus um einen transistor zu
"schalten". Nur beim ausschalten (Basis-Tristate) wirkt dann der Cbe
Kondi und die beiden np-Übergänge; Dadurch "sperrt" der Transistor
nicht 100%.
Du kannst das Testen, indem du von beiden Betriebs-Potenzialen direkt
auf den Pin misst. Wenn dann zweimal der selbe wert kommt, dann ist
alles in ordnung ansonsten ist der pin high-z.

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe alles so, wie im avr-tutorial (beispiel mit den leds)... habe ein
eigenes "blinkmuster" programmiert, was mit leds direkt am port auch
klappt. jetzt wollte ich halt das cluster dran machen, aber da 300 mA
ein wenig zuviel für den uC sein dürften G halt nen transistor
dazwischen.
habe ncohmal geguckt, ist der den BC875.
nehme gleich mal nen anderen und teste es mit einem kleineren
verbraucher

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...zuviel für den uC sein dürften G halt nen transistor
dazwischen.
...

Eben. Ich will Dir sicher nicht zu nahe treten, aber GENAU das hätte
mich Intressiert. Wie hast Du denn den Transistor dazwischen?
Hast Du vielleicht BasisEmitterKollektor verwechselt? Weil 12V-5V sind
ca.7Volt. Wenn da mal nichts verdreht ist. Ich mein ja nur

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigentlich nein (laut datenblatt und standard transistor belegung
halt...) schalten tut er ja auch. und ohne uC (schalter als ersatz)
macht er ja das selbe (hab auch nen 2. getestet, liegt also nicht an
defekt oder so)

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab nun mal einen belastbareren aus nem alten radio ausgebaut und siehe
da... ES KLAPPT! die beiden 875er müssen wohl mal einen mitbekommen
haben oder so. der eine war zwar neu aber beim rumprobieren... naja ;P
vielen dank auf jeden fall für die schnellen antworten! habe jetzt:

     AVR-Pin -- Widerstand 4,7k -- Basis
und: Collector -- Masse sowie: Emitter -- Leds (-) und dann LEDs(+)
nach plus 12V

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und genau so dürfte es nicht gehen...

Richtig wäre:

Port - Widerstand - Basis
GND (Minus) - Emitter
Kollektor - LED (Katode)
LED (Anode) - +12V (falls LED-Cluster internen Widerstand hat)

...

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sag ich doch verkehrt rum.
Wenn man Transistoren im Inversbetrieb betreibt, was sicherlich geht,
passiert genau dieser effekt. die Basis-Emitterstrecke bricht durch bei
ca. -6V, bleiben entsprechend viele Volts in den Lampen (ich erkläre das
hier ganz einfach)
Daher sollte meine Frage vorhins auch nicht böse zu verstehen gewesen
sein...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja stimmt, hab mich gerade verschrieben, bzw verguckt oder falsch
gedacht, da ich den transistor von oben gesehen habe und nicht wie
abgebildet von unten...

Port - Widerstand - Basis
GND (Minus) - Emitter
Kollektor - LED (Katode)
LED (Anode) - +12V (falls LED-Cluster internen Widerstand hat) <= jo,
ist da.

so ist es auch jetzt. und ende! endlich geht der kram! :o hat ja lang
genug gedauert...
PUNKT.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nunja, diese "Lektion" ist eigentlich lange vor den Mikrocontrollern
an der Reihe...

...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
düp die duuu... hab bis vor 5 tagen immer nur
"grob-elektronische-mechanische" schaltungen wie sachen mir relais
oder vielleicht mal ner flip-flop schaltung als wechselblinker gebaut.
ab und zu auch mal ein bausatz von conrad oder so. und nun hab ich
innerhalb von 2 tagen gelernt, wie man mit der hand platinenlayouts für
mega8er und displays entwirft, den code schreibt und anpasst usw und so
fort... also bitte, was will man da erwarten G immerhin leben meine
uC noch :D

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja klar. Sagt ja niemand was - prima!

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, bin jetzt nach einiger zeit mit meinem projekt fertig geworden und
lüfte nun das geheimnis...

http://www.kitesurfer1404.eu.tc/lights/edge

bitte nicht über den quelltext des µC lachen... war ja mein erstes
projekt mit nem controller ;)

vielen dank noch mal für die hilfe hier im forum! tolle seite! weiter
so! hab hier alles über µC gelernt, was ich brauchte.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Video und Quelltext habe ich mir nicht angesehen...

Ansonsten gut gemacht für ein Erstlingsprojekt.
Mit Streifenplatinen und dem Bohrer für Trennstellen hatte ich auch
schon hantiert.

Schau dir mal den ULN2003 und ULN2803 an. Wenn du mehrere Transistoren
brauchst, dann bieten sich diese Treiber ICs an.

Deiner Webseite konnte ich aber nicht entnehmen, welchen Zweck dieses
Teil erfüllen soll. Ist es eine Art "Lichtorgel"? Oder einfach nur
"bunte Lampe" mit Programmsteuerung?

Frohen Rest vom Fest...
...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oh, das ganze ist ein blaulichtbalken von nem US-policecar. da ich nur
den träger und die bunten gehäuseteile hatte und das innenleben nur
schwer und teuer zu beschaffen ist in deutschland musste ich den balken
halt persönlich ausbauen ;)
jetzt kommt schon die ein oder andere anfrage aus den staaten, wie man
das so baut und so weiter... vor allem die geringen kosten (~10 euro
pro  steuerplatine) haben alle fasziniert. und die möglichkeit eigene
"blitz/blinkmuster" zu programmieren.
solltest die bei gelegenheit mal das video anschauen
grüße

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok... Auf USA-Polizei bin ich jetzt nicht gekommen, Knoten im Kopf...
Würde glatt auf meinen Trabbi passen (wenn ich einige Jahrzehnte jünger
wäre)...

Das wird wohl nicht das letzte Programm für diesen Mega8 gewesen sein.
Da lassen sich ja allerhand Spielereien mit machen. Baust du noch eine
Sirene rein?

Frohen Rest vom Fest...
...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jetzt hast du mich auf eine idee gebracht...
leider ist kein platz mehr im gehäuse für nen lautsprecher, AAAAABER
ich hab noch nen zweiten balken, da ist so ein 6 kilo druckkammer
lautsprecher drin. der kann 100W vertragen. leider fehlt mir das
passende steuergerät. das wäre mal eine idee. leider habe ich da keine
vorstellung, wie ich beginnen sollte... würde wieder nen mega8 nehmen,
weil ich damit ja jetzt schon positive erfahrung gemacht habe. naja,
einzige frage: wie bekomme ich das ding dazu, ein sirenengeräusch
abzugeben? eine einfach sinus/rechtecksspannung ist ja langweilig.
sollte wenn dann ja auch ein wenig realistisch klingen. denke dabei an
den typischen amerikanischen heul sound. vieleicht noch verschiedene
sirenentöne. schnell und langsam oder diesen "hupen-sound" wie beim
feuertruck. vielleicht hat hier ja jemand ne idee, wie man
a) so was programmiert
und b) welche teile man noch braucht, damit nachher genug power bei
rüber kommt. (müssen nicht gleich die vollen 100 watt sein, da das ding
in meinem zimmer steht lol )

weiterhin ein frohes fest!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ich würde es erstmal mit dem Compare-Interrupt des Timer1 probieren.
Dann in der Mainloop (von einem Timer synchronisiert) die
Intervallwerte hoch&runterzählen. Ob du nun die OC-Pins nutzt (toggeln)
oder in der ISR einen Pin deiner Wahl toggelst, bleibt dir überlassen.
Wenn du darauf achtest, dass im Aus-Zustand immer sicher ausgeschaltet
wird, dann kannst du den Lautsprecher mit einem FET direkt anschließen.
Das Programm passt mit Sicherheit noch mit in den vorhandenen Mega8
rein.

Frohen Rest vom Fest...
...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie würde so was als sourcecode aussehen? habe ja noch nie so was
gemacht und meine ASM kenntnisse gehen nicht über das asm-tutorial
hinaus.
wenn dann wird das ein eigenens projekt, heißt uns steht der controller
voll zur verfügung. will nun den FET mit dem lautsprecher an einen pin
hängen. alt oszillator wird der interne 1MHz gewählt. wie würde nun
konkret ein ansteigender ton und danach fallender ton programmiert
werden? also bsp. 1 sek ansteigend, danach 1 sek fallend, vielleuicht
von 300 Hz bis 2000 Hz oder so.
vielleicht mach ich lieber mal ein neues thema auf... mit led-cluster
hat das ja nur noch wenig zu tun....

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na der Mega8 ist doch mit deinen LEDs nicht ausgelastet, oder?
Und ein paar Pins (1 Ausgang und für jeden Modus einen Taster/Schalter)
sind doch auch noch frei, oder?

Nunja, ich kann kein C, ich halte ASM für einfacher. Aber auch in C
kann man mit der Hardware (Interrupts) arbeiten. Und ein Programm ganz
ohne Interrupts kann ich mir eigentlich garnicht vorstellen.

Das geht schon mit dem Einlesen und Entprellen von Tastern bzw.
Schaltern los. Das macht man in einem Timer-Interrupt alle 4...20ms.
Der Interrupt ist damit ja noch nicht ausgereizt, man kann in dieser
ISR noch etliche andere Aufgaben erledigen (z.B. Software-Timer für
weitere langsame Steuerungen). Ein solcher Timer-Int kann auch die
Mainloop "takten". Der MC geht dann nach getaner Arbeit in den
Schlafmode und wird vom nächsten Int geweckt.

Wartezeiten realisiert man dann nicht durch Warten (Zeitschleife)
sondern durch "Unterlassen" (Überspringen, falls Zeit noch nicht
abgelaufen und dafür was anderes tun). Man holt sich zum Warten nur
eine Kopie vom aktuellen Software-Timer, addiert die Wartezeit und
überspringt die Routine so lange, wie Software-Timer und
"Zeitstempel" nicht übereinstimmen. Somit blockiert eine laufende
Wartezeit nicht die anderen Anwendungen, die quasi gleichzeitig
laufen.

Um nun einen einfachen Rechteck-Sound mit änderbarer Frequenz zu
erzeugen, nimmt man am besten von Timer1 einen der Compare-Interrupts.
Man rechnet sich gemäß verwendetem Vorteiler den minimalen
Intervallwert (maximale Frequenz) und maximalen Intervallwert (minimale
Frequenz) aus (beides sind dann unsigned-16-Bit-Zahlen). Die Mainloop
kann nun (vom Entprell-Timer synchronisiert) einen Wert zwischen den
Extremwerten hinundher gleiten lassen. In der Compare-ISR wird dann das
Compare-Register des Timers ausgelesen, das Intervall dazu addiert und
die Summe ins Compare-Register zurück geschrieben. Dann wird noch der
Portpin getoggelt und die ISR schnellstens verlassen. Beim Ausschalten
des Sounds (Deaktivieren des Comp-Interrupts) ist der Portpin
zusätzlich auf 0 zu setzen, damit kein Ruhestrom über den Lautsprecher
fließt.

Das Synchronisieren der Mainloop erreicht man mit einem Flag in einem
Register (Boolean-Variable). Da meist noch andere Programmteile
("Jobs") synchronisiert werden müssen, legt man für jeden Zweck ein
solches Flag an. Muss nun von einem Programmteil (z.B. ISR) ein Job
aufgerufen werden, so wird nicht etwa das zugehörige Unterprogramm
aufgerufen (dauert viel zu lange, ISRs müssen extrem kurz bleiben),
sondern nur das zugehörige "Jobflag" gesetzt.
In der Mainloop werden dann nacheinander alle Jobflags geprüft und bei
gesetztem Flag wird das zugehörige Unterprogramm aufgerufen, was den
Job erledigt und das Jobflag wieder löscht. Sind alle Jobs erledigt,
geht der MC bis zum nächsten Int in den Sleep-Mode. Diese Art der
Programmierung ist einfach, übersichtlich und erweiterbar. Sie spart
gegenüber der Warteschleifenprogrammierung gewaltig Rechenzeit ein, so
dass ganz nebenbei noch weitere Programmteile laufen können. Ich
programmiere auf diese Art in ASM, das geht aber auch in C, BASIC und
anderen Sprachen. Man muss es nur wollen und auf vorgefertigte
WAIT-Funktionen verzichten.

Schau dir mal in der Codesammlung Peter Danneggers Tastenentprellung
an, das ist einer der ersten Schritte in diese Richtung...

Frohen Rest vom Weihnachtsfest...
...

Autor: kitesurfer1404 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank schon mal.
habe ein neues thema "polizeisirene mit mega 8" aufgemacht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.