Hi Leute, wie ihr auch bin ich ein interessierter Bastler. Vor geraumer Zeit habe ich angefangen mich in Sachen Bascom und Mikrocontrollern zu probieren. Die Erfolge blieben nicht aus und so haben Sachen wie ein einfaches Lauflicht mit 3 LED oder eine PWM, mithilfe eines Atmega8, schnell funktioniert. Nun sollte es aber etwas interessanter werden: Wieder geht es um eine Art Lauflicht (nur das es diesmal nicht von alleine läuft) mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun wiederum 3 LED. Schaltet man die Schaltung ein, ist der erste Kanal "an". Bei diesem leuchtet aber wiederum erst die 1., dann die 2., 3. LED und dann alle. Wird nun ein Taster gedrückt, so ist der 2. Kanal "an" und die ganze Prozedur mit den drei LED geht von vorne los. Bei erneutem drücken des Tasters dann für den 3. Kanal, nochmaliges drücken soll wieder zum 1. Kanal führen. Alle LED sollen sich dabei noch über ein Potenziometer in der Helligkeit regeln lassen (Auswertung über ein ADC und Wiedergabe über die PWM). Das erstmal zur Theorie. Mir ist dabei klar das für jeden Kanal eine Variable steht. Entsprechend dieser Variablen müssen jeweils die Lauflichter für die 3 LED programmiert werden, diese dürfen jedoch nur einmal ablaufen, da dann alle 3 LED leuchten sollen. Und genau hier liegt mein Problem: Wie kann ich dem Mikrocontroller sagen das dieses Lauflicht nur einmal ablaufen soll, dann alle 3 LED leuchten sollen und er auf den nächsten Tastendruck wartet, bei welchem das Ganze für den nächsten Kanal abläuft. Bei der Regelung der Helligkeit habe ich im Moment leider noch überhaupt keine Idee, da der Atmega8 nur 3 Pins hat über welche ein PWM Signal ausgegeben werden kann, ich aber theoretisch 9 davon bräuchte. Ich bedanke mich schon im Voraus für eure Hilfe. MfG
:
Verschoben durch Moderator
Hallo Nils, als Gedankenstoß werfe ich mal PWM per Software ins Rennen. MfG von der Spree Frank
Andere µC haben deutlich mehr PWM Ausgänge. Renesas, NXP, ST z.B. kann der STM32 je nach Typ locker 30 PWM Kanäle. Damit kann man schon mal einiges machen.
Markus M. schrieb: > Andere µC haben deutlich mehr PWM Ausgänge. > Renesas, NXP, ST > > z.B. kann der STM32 je nach Typ locker 30 PWM Kanäle. Damit kann man > schon mal einiges machen. Come on - ein Lauflicht ergo 6 Bit PWM. Da wirst du doch keinen 32 bitter für 10€ empfehlen. Das geht mit einem 8 bit uC bis pinende. Ich würde aber vermutlich eher in Richtung WS2812 oder APA101 LEDs mit integrierter Logik gehen. Dabei lernt man noch richtig was und ist nicht gleich von 500 Seiten Datenblatt, 1800 Seiten Refence Manual und 2000 Seiten Programming Manual für eine 32 Bit ARM erschlagen.
>mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun >wiederum 3 LED. Das sind dann also 9 LED? Soll jede einzelne in der Helligkeit steuerbar sein oder jeweils 3 zusammen?
Es sollen sich alle 9 LED insgesamt über ein Poti in der Helligkeit regeln lassen. Lassen sich die Controller die ihr vorgeschlagen habt per Bascom programmieren? MfG
Es wurden ja nicht nur Controller vorgeschlagen. Ein STM32 Controller kannst du nicht in BASCOM programmieren. Die anderen Vorschläge wie WS2812 und APA101 sind LED's die direkt Logik eingebaut haben und mit einem definiertem Protokoll gesteuert werden können, dafür brauchst du wiederum einen Mikrocontroller. Verwende doch einfach deinen ATMega weiter und beschäftige dich damit wie du eine Software PWM realisieren kannst. Später noch einen Poti anklemmen, diesen per ADC auslesen und damit die Software PWM beeinflussen ist dann auch kein Problem mehr. Ansonsten kann ich dir nur empfehlen darüber nachzudenken auf C um zu steigen. Das eröffnet dir meiner Meinung nach eine viel größere Welt von Möglichkeiten. Das ist zumindest meine Erfahrung. Habe nämlich selber mit ATMega, Attiny und Bascom angefangen und bin mittlerweile nur noch bei C und STM32 Controllern, auch wenn man die Leistung von denen in vielen Fällen nicht benötigt.
Nils R. schrieb: > Mir ist dabei klar das für jeden Kanal eine Variable steht. Nö. Klar ist ehekr daß dein System 9 Zustände hat (und einen 10. wenn alles aus sein kann, davon hast du aber bisher nichts geschrieben). Nils R. schrieb: > da der Atmega8 nur 3 Pins hat über welche ein PWM Signal ausgegeben werden kann Man braucht für so etwas anspruchsloses wie LED dimmen keine Hardware-PWM, das kann man mit Software machen. Nils R. schrieb: > Wie kann ich dem Mikrocontroller sagen das dieses > Lauflicht nur einmal ablaufen soll, dann alle 3 LED leuchten sollen und > er auf den nächsten Tastendruck wartet, bei welchem das Ganze für den > nächsten Kanal abläuft State machine ist das Schlüsselwort. Nils. R. schrieb: > Lassen sich die Controller die ihr vorgeschlagen habt per Bascom > programmieren? Es ist eigentlich völlig wurscht welchen Controller, für 9 LEDs sind alle tauglich die zumindest 1 Eingangspin für den Taster und 9 Ausgangspins haben (oder 6 wenn man multiplext).
:
Bearbeitet durch User
>Es ist eigentlich völlig wurscht welchen Controller, für 9 LEDs sind >alle tauglich die zumindest 1 Eingangspin für den Taster und 9 >Ausgangspins haben (oder 6 wenn man multiplext). Du hast den ADC für das Poti vergessen. Aus der Beschreibung, wie die Einstellung der Helligkeiten funktionieren soll, bin ich aber nicht ganz schlau geworde.
Die Helligkeit aller 9 LED wird über ein einziges Potenziometer geregelt (welches einen Spannungsteiler bildet und am ADC hängt), sprich also alle haben immer dieselbe Helligkeit. In Sachen State Machine werde ich mich mal etwas belesen. Wie lässt sich dann aber die PWM in das Ganze "implementieren"? MfG
Markus S. schrieb: > Ansonsten kann ich dir nur empfehlen darüber nachzudenken auf C um zu > steigen. Das eröffnet dir meiner Meinung nach eine viel größere Welt von > Möglichkeiten. Das ist zumindest meine Erfahrung. Habe nämlich selber > mit ATMega, Attiny und Bascom angefangen und bin mittlerweile nur noch > bei C und STM32 Controllern, auch wenn man die Leistung von denen in > vielen Fällen nicht benötigt. Absolute Zustimmung, habe das auch so gemacht! Ich würde für kleine Projekte bei Atmel AVR bleiben, aber das Atmel Studio zu verwenden macht einfach deutlich mehr Spaß und in C hat alles seine Logik, was in Basic nur bedingt der Fall ist. Kann ich nur wärmstens empfehlen.
Stimme euch da ja ebenfalls zu, benutze das Atmel Studio schon seit einiger Zeit zum Flashen. Hab bisher nur noch leider keine Zeit gefunden mich mit C zu befassen. Aus dem Grund möchte ich dieses Projekt noch mit Bascom abschließen. MfG
Nils R. schrieb: > Bei der Regelung der Helligkeit habe ich im > Moment leider noch überhaupt keine Idee, da der Atmega8 nur 3 Pins hat > über welche ein PWM Signal ausgegeben werden kann, ich aber theoretisch > 9 davon bräuchte. Wenn immer nur eine Dreiergruppe gleichzeitig PWM braucht, würde ich die LEDs als Matrix schalten. Drei beliebige Ausgangspins wählen aus, welche Gruppe gerade leuchten darf, und die drei PWM-Pins bestimmen die Helligkeit. Aufpassen muß man nur mit dem Strom, denn die Auswahlpins müssen den dreifachen LED-Strom vertragen können; da wären dann ggf. noch Transistoren nötig.
Wie würdest du dabei die PWM in die LED Matrix mit einbringen, dabei müsste man die PWM ja ständig an und abschalten an den 3 ausgewählten Pins? Oder habe ich hier was missverstanden? MfG
Hallo, hier ein Beispiel für Software-PWM. Beitrag "Software_PWM - Verständnisproblem am Beispiel Moodlight - Erlärbär gewünscht" Mit freundlichem Gruß
>Wieder geht es um eine Art Lauflicht (nur das es diesmal nicht von >alleine läuft) mit 3 Kanälen. Jedoch hat jeder dieser Kanäle nun >wiederum 3 LED. Schaltet man die Schaltung ein, ist der erste Kanal >"an". Bei diesem leuchtet aber wiederum erst die 1., dann die 2., 3. LED >und dann alle. Wird nun ein Taster gedrückt, so ist der 2. Kanal "an" >und die ganze Prozedur mit den drei LED geht von vorne los. Ich verstehe das so: T=1s LED1 LED2 LED3 Kanal 1 X Kanal 2 Kanal 3 T=2s LED1 LED2 LED3 Kanal 1 X Kanal 2 Kanal 3 T=3s LED1 LED2 LED3 Kanal 1 X Kanal 2 Kanal 3 T=4s LED1 LED2 LED3 Kanal 1 X X X Kanal 2 Kanal 3
Wenn du mit T=1s bis T=4s ausdrücken willst das ich quasi 4 Schritte bei jedem Kanal im Lauflicht habe, nehmlich: die Erste, dann die Zweite, die Dritte und dann alle LED in diesem Kanal, ist das so richtig. MfG
GHD schrieb: > ein Lauflicht ergo 6 Bit PWM. 6 Bit PWM würde ich nicht nehmen, das ist, in den unteren Helligkeitsstufen zu grob, plane mindestens mit 8 Bit oder mehr. Da Du ja die Helligkeit für alle LEDs gemeinsam einstellen willst, ist das mit der Software-PWM nicht schwierig, es wird halt nicht nur ein Portpin gesteuert, sondern 9, überlagert von der Information, welche LED überhaupt leuchten soll. Multiplexing, oder Ähnliches würde ich bei 9 LEDs nicht machen, das ist unnötiger Aufwand. Ein 8-Bit AVR schafft das locker, ich habe hier einen ATmega644, getaktet mit 10 MHz, laufen, der erzeugt 25 PWM-Signale per Software, mit 10 Bit und einer PWM-Frequenz von 2400 Hz, und das mit unterschiedlichen Helligkeits-Werten für die Kanäle. Mit freundlichen Grüßen - Martin
Hi Die Anfrage war doch, wie das Problem mit einem ATmega erschlagen werden kann. Von Bascom habe ich keinen Plan, aber immerhin. Du hast eine Variabel Gruppe (int, 0-255 reicht 'gerade so') Du hast eine Variabel Maske (int, 0-255, dito) Gruppe wird von 1-3, zurück auf 1 und so weiter gezählt. Damit bestromst Du jeweils einen Transistor, Der Dir jeweils eine 3er-Gruppe LEDs mit +5V versorgt. Die Gruppe Maske zählst Du -1 (Binär 001) -2 (Binär 010) -4 (Binär 100) -7 (Binär 111) und legst diesen Wert direkt auf das Port, wo die 'Minusse' der LEDs (also die drei 1er, die drei 2er, die drei 3er) angeschlossen werden bzw. wieder ein Transistor angesteuert wird, Der Diesen 'Spalten' den Minus zuschaltet. Nach der 7 wartest Du auf den Tastendruck, zählst Gruppe+1, bei 4 -> Gruppe=1 und beginnst wieder bei 0 (also zählst wieder 1,2,4,7) Parallel dazu lässt Du einen Timer als Counter von 0-255 hochzählen, also inclusive Überlauf, daß Dieser wieder bei 0 anfängt. Dein ADC liest Du als 8-bit ein. Wenn Dein ADC-Wert größer als der Counter-Wert ist, schaltest Du eine der Seiten auf Eingang -> LED aus. Springt der Counter wieder auf 0 zurück, schaltest Du diese Seite wieder auf Ausgang. Sollte funktionieren, wenn's bestimmt auch schönere Lösungen gibt So, Essen fertig MfG
Nils. R. schrieb: > Wie würdest du dabei die PWM in die LED Matrix mit einbringen, dabei > müsste man die PWM ja ständig an und abschalten an den 3 ausgewählten > Pins? Oder habe ich hier was missverstanden? Matrix beschreibt nur die Schaltung; die muß man nicht unbedingt multiplexen. Vielleicht habe ich den geplanten Ablauf falsch verstanden. Ich stelle mir das so vor: Tastendruck: Auswahlpin für Kanal 1 geht aktiv, die anderen sind aus. PWM-Pins spielen ihr Lauflicht, bis alle drei LEDs an sind. Nächster Tastendruck: Auswahlpin für Kanal 2 geht aktiv, Kanal 1 wieder aus. Dann sind natürlich auch die ersten drei LEDs wieder aus (da bin ich mir jetzt unsicher, ob das so richtig ist). Die PWMs spielen jetzt wieder das Lauflicht ab, bis alle drei LEDs (die von Kanal 2 natürlich) an sind. Nächster Tastendruck: dasselbe für Kanal 3.
Ok, fest steht also das es eine "softwaremäßige" PWM wird. Und das ich das Lauflicht mithilfe des State machine - Befehls realisiere. Das Signal ob die LED dann an oder aus ist wird ja dann vom PWM Signal überlagert, aber wie funktioniert dies, da die LED ja auch ganz aus sein soll? MfG Nils
Marc schrieb: > Du hast den ADC für das Poti vergessen. Stimmt. Nils. R. schrieb: > dabei müsste man die PWM ja ständig an und abschalten Ja und ? Nils. R. schrieb: > Wie würdest du dabei die PWM in die LED Matrix mit einbringen http://rn-wissen.de/wiki/index.php?title=Bascom_und_PWM So ungefähr, ist aber mein erstes BASCOM Programm, wird noch falsch sein
1 | $regfile = "m8def.dat" |
2 | $crystal = 8000000 |
3 | Config PortB.0 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+ |
4 | Config PortB.1 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+ |
5 | Config PortB.2 = Output ' --R--*--|<|--+ *--|<|--+ *--|<|--+ |
6 | Config PortB.3 = Output ' -------------+ | | |
7 | Config PortB.4 = Output ' -----------------------+ | |
8 | Config PortB.5 = Output ' ---------------------------------+ |
9 | Config PortB.6 = Input ' Taster nach VCC, Widerstand nach GND |
10 | Config PortC.0 = Input ' Poti zwischen VCC und GND |
11 | CONFIG ADC = SINGLE, PRESCALER = AUTO, REFERENCE = AVCC |
12 | dim gedrueckt as bit |
13 | dim taster as bit |
14 | dim pwm as byte |
15 | dim intensity as byte |
16 | dim row_led(3) as byte |
17 | dim leds_pin(3) as byte |
18 | row_led(1)=6 |
19 | row_led(2)=5 |
20 | row_led(3)=3 |
21 | leds_pin(1)=8 |
22 | leds_pin(2)=24 |
23 | leds_pin(3)=56 |
24 | portb = 0 |
25 | pwm = 0 |
26 | row = 1 |
27 | leds = 1 |
28 | taster = PortC.0 |
29 | Do |
30 | IF pwm = 255 THEN ' PWM erzeugen |
31 | IF row < 3 THEN row = row + 1 ' weiterschalten der LEDs |
32 | pwm = 0 |
33 | ELSE |
34 | pwm = pwm + 1; |
35 | END IF |
36 | if pwm < intensity then ' Helligkeit je nach PWM |
37 | PortB = row_led(row) + leds_pin(leds) |
38 | else |
39 | PortB = 0 |
40 | end if |
41 | intensity = GETADC(0) \ 4 ' Intensitätywert holen |
42 | gedrueckt = PortB.6 |
43 | IF gedrueckt <> taster THEN ' eigene Entprellung weil schneller als DEBOUNCE |
44 | IF gedrueckt THEN |
45 | leds = leds + 1 |
46 | IF leds > 3 THEN leds = 1 |
47 | row = 1 |
48 | END IF |
49 | taster = gedrueckt |
50 | END IF |
51 | Loop |
52 | End |
Hi Die Definitionen der Reihen und Spalten sehen nicht korrekt aus. Die Kathoden sind ja auf den Ports PB0-PB2, wären somit 1,2,4 Die Anoden liegen auf PB3-5, wären 8,16,32 Oder verstehe ich das Listing völlig falsch? row_led(1)=6 4 2 row_led(2)=5 4 1 row_led(3)=3 2 1 leds_pin(1)=8 8 leds_pin(2)=24 16 8 leds_pin(3)=56 32 16 8 Aah, Die LEDs summieren sich hier, laufen also voll. Dachte, zuerst läuft eine LED durch und darauf werden alle angeschaltet. Wenn Du bei den Spalten negiert arbeiten willst, also alle Bits High nur das Bit Low, wo's leuchten soll - dann sind Deine Dioden falsch rum. Für weitere Analysen bin ich schon zu lang im Bett ... eigentlich seit ~2 Stunden ... kann fast schon hören, wie der Wecker bereits Luft holt :) MfG
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.