Bau eines Ambilight für Fernseher am PC

Unterbodenbeleuchtung, Pimp my room, usw.

Moderator: T.Hoffmann

Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Fr, 05.02.10, 20:44

Nachdem letztens meine tolle warmweiße Ringleuchtstoffröhre von Pollin nach über einem Jahr effektvoll blinkend den Geist aufgegeben hat, und mir die Hintergrundbeleuchtung ziemlich fehlt, suchte ich nach einem Ersatz. Und ich habe ihn gefunden:

Ein einfach gehaltenes Ambilight soll es werden. Dazu hab ich mich erstmal ein bisschen über die Anschlüsse VGA DVI und RGB schlau gelesen und bin zu einer ziemlich einfachen Lösung gekommen:
Am VGA stehen 3 Pegel zur Verfügung. Einer für rot, einer für grün und einer für blau. Alle 3 nehmen Werte zwischen 0V - 0,7V an. Je höher der Anteil der jeweiligen Farbe im Bild ist, desto höher ist auch die ausgegebene Spannung. Soweit hab ich das schon an meinem Notebook-VGA Anschluss gemessen.
Am PC muss ein DVI auf VGA Adapter herhalten, da ich nur zwei DVIs an der Grafikkarte habe. Aber da die 3 Spannungspegel laut Pinbelegung am DVI-Stecker genauso zur Verfügung stehen, sollte das gehen. Nur muss ich es erstmal schaffen, beide DVIs am PC zum laufen zu bringen. Verschiedene Brücken am Stecker, um einen Monitor zu simulieren haben mich noch nicht weitergebracht. Wahrscheinlich wird es einen Systemneustart brauchen, aber den gibts erst morgenfrüh, da das ca. 10min in Anspruch nimmt :) .

Meine Idee ist jetzt folgende:
Die 0-0,7V werden in drei Analogeingänge eines Atmega8 eingespeist. Per Programm sollen daraus 3 PWM-Ausgänge werden. Und zwar 0% bei 0V und 100% bei 0,7V - logisch :wink: .
Mittels 3 FETs und ein paar bunten LEDs ists dann auch schon fast vollbracht. Es wird eine einzige Farbe generiert, welche sich aus dem Verhältnis aller 3 Grundfarben auf dem Fernsehbild ergibt. Also keine getrennten Seiten, wie man es z.B. vom Ambilight aus der Werbung kennt.

Mein Defizit ist jetzt das Programm...hab mich mit 3 Analogeingängen gleichzeitig und PWM dazu noch nicht auseinandergesetzt.
Trotzdem hab ich erstmal angefangen, dann aber relativ früh wieder aufgegeben, weil ich gemerkt hab, dass das so nichts brauchbares wird.
Den Fetzen häng ich spaßeshalber mal mit an :wink: und würde mich freuen, wenn mir jemand weiterhelfen könnte.
Dateianhänge
ambilight.zip
(559 Bytes) 264-mal heruntergeladen
Benutzeravatar
unoptanium
Mega-User
Mega-User
Beiträge: 475
Registriert: Di, 07.10.08, 19:00
Wohnort: Berlin

Fr, 05.02.10, 21:45

Nabend.

Also leider kenn ich mich mit programmieren nicht aus, konnt mich noch nicht
dazu durchringen, mal son Set zu kaufen zum probieren...

Aber: Was wäre denn einfach mit 0...0,7V 0...333% ?
Nicht die elegante Lösung, aber würde das gehen?


Gruß, unoptanium
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Fr, 05.02.10, 21:49

unoptanium hat geschrieben:
Aber: Was wäre denn einfach mit 0...0,7V 0...333% ?
Nicht die elegante Lösung, aber würde das gehen?
Ich kann nicht mehr, als ein dauerhaftes 1-Signal am µC ausgeben. Und immer an = 100%. Man könnte zwar eine höhere Helligkeit erreichen, indem man den LED-Strom erhöht, aber das ist hier nicht möglich, da die LEDs auch im Dauerbetrieb leuchten können, und dann würden sie stark überlastet.
Ein kontrollierter Überstrom, um Helligkeitsverlust auszugleichen, ist bei Multiplexing möglich, wo die LEDs nie dauerhaft eingeschaltet sein können.
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

Fr, 05.02.10, 22:01

mit dem Programm könnwa helfen :mrgreen: da fehlt ja so einiges

Code: Alles auswählen

$regfile = "m8def.dat"
$crystal = 1000000

Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = 8 , Compare Pwm = Clear Up , Prescale = 1

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

Dim R As Word , G As Word , B As Word

Do

R = Getadc(0) * 0.911604525                               ' PORTC.0
Tccr1a = R

G = Getadc(1) * 0.911604525                                 ' PORTC.1
Tccr1b = G

B = Getadc(2) * 0.911604525                                 ' PORTC.2
Tccr2 = B

Loop
so in etwa wäre das Programm, ich hoffe ich hab die Umrechnung richtig im Kopf gemacht.
noch mal laut vor rechnen: Reference = Internal = 2,56 V
der max. am ADC 0,7 V also 1023 / 2,56 * 0,7 = 279,73
dann um auf den grünen zweig zu kommen 255 / 279,73 = 0,911604525

MfG
Jay
Zuletzt geändert von Jay am Mo, 08.02.10, 17:12, insgesamt 2-mal geändert.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Fr, 05.02.10, 22:30

Jaa, das sieht doch gut aus und ich kanns sogar nachvollziehen. Wenig Code mit viel Wirkung. Herzlichen Dank!
Ausgänge wären dann die Timerausgänge PB1/2/3 wenn ich das Pinout richtig gedeutet hab?

Morgen früh gehts dann weiter...
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

Fr, 05.02.10, 23:23

ich habe das probeweise nochmal alles gesteckt und auf ein ATmega32 geflasht. und irgendwie spinnt der noch
kann das jemand auf dem ATmega8 ausprobieren.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 06.02.10, 08:36

Ich kann ja Heute erstmal die Platine ätzen und löten. Dann kann ich selbst gleich gucken ob es funktioniert und es muss sich keiner extra die Mühe machen :wink:
Benutzeravatar
alexStyles
Auserwählter
Auserwählter
Beiträge: 2333
Registriert: So, 20.08.06, 16:51
Wohnort: Düsseldorf
Kontaktdaten:

Sa, 06.02.10, 08:46

Ich würds ja mal eben zusammen stecken etc.
Aber mein Board und ATmega8 sind iwie...nich hier(20km weit weg)

Bin aber auch interessiert an deinem Vorhaben.
Soweit ich weiss funktioniert dass unter Umständen nicht so einfach wie deine Vorstellung ist.
Hatte da 2008 glaube ich mal einen ausführlichen Beitrag über solche Ambilights für TV,LCD oder PC LCD in der Elektor.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 06.02.10, 12:52

Wenn man es 'schön' machen will, also ähnlich wie das Philips (Farbe entsprechend den Bildrändern, Unterstützung von unterschiedlichen Bildformaten/Fernsehnormen/Videosignalen) dann wird es wirklich schwierig. Siehe auch den langen Thread hier: viewtopic.php?f=31&t=3763
Die 'Simple' Lösung wie von Beatbuzzer vorgesehen sollte aber nicht so schwierig zu realisieren sein. Ob diese Lösung völlig ohne Sync vernünftig funktioniert/aussieht, bin ich aber nicht sicher (die 0-0.7V sind ja viel schneller getaktet als der AD-Wandler sie 'lesen' kann - was dann der AD Wandler draus macht ist die Frage).

Bzgl. Programm...
Floating Point hat IMHO auf kleinen µCs (also Takt < 100MHz, Speicher < 1MB) nichts verloren. Braucht viel zu viel Speicher und zu lange zum Rechnen.
Ich würde es so machen:

Code: Alles auswählen

... 'siehe code von Jay
Do

R = Getadc(0) * 7                               ' PORTC.0
Shift R , Right , 3                              ' entspricht R*7/8 oder R * 0.875
Tccr1a = R                                      ' ist zwar dann nur 0..245 aber die letzten 5% sieht man sowieso nicht, außerdem 
                                                  ' ist die interne Referenz nicht soo genau und es schafft ein wenig 'Luft' nach oben
 
G = Getadc(1) * 7                                 ' PORTC.1
Shift G , Right , 3  
Tccr1b = G

B = Getadc(2) * 7                                 ' PORTC.2
Shift B , Right , 3  
Tccr2 = B

Loop
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 06.02.10, 13:43

Also ich hab jetzt den Kopf von Jay und den Hauptteil von Borax zusammengesetzt. Sieht so aus:

Code: Alles auswählen

'Ambilight

$regfile = "m8def.dat"
$crystal = 1000000

Config Timer0 = Pwm , Pwn = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwn = 8 , Compare Pwm = Clear Up , Prescale = 1

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

Dim R As Word , G As Word , B As Word


Do

    R = Getadc(0) * 7                               ' PORTC.0
    Shift R , Right , 3                              ' entspricht R*7/8 oder R * 0.875
    Tccr1a = R                                      ' ist zwar dann nur 0..245 aber die letzten 5% sieht man sowieso nicht, außerdem
                                                      ' ist die interne Referenz nicht soo genau und es schafft ein wenig 'Luft' nach oben

    G = Getadc(1) * 7                                 ' PORTC.1
    Shift G , Right , 3
    Tccr1b = G

    B = Getadc(2) * 7                                 ' PORTC.2
    Shift B , Right , 3
    Tccr2 = B

Loop
Allerdings kommt beim Versuch das ganze zu compilieren folgende Fehlermeldung:
Error: 86 Line: 6 Invalid parameter for CONFIG parameter or value [PWN=8]
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

Sa, 06.02.10, 14:21

ich habe jetzt den Code auf dem ATmega32 zum laufen gebracht, meine Rechnung war wohl doch nicht so gut

Code: Alles auswählen

$regfile = "m8def.dat"
$crystal = 1000000    ' Standard Quarz ?

Config Pinb.1 = Output  
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinc.0 = Input
Config Pinc.1 = Input
Config Pinc.2 = Input

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

Config Timer1 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1

Adcsr.7 = 1
Admux.7 = 1
Admux.6 = 1
Admux.5 = 1

Dim R As Word , Rs As Integer , Ra As Integer
Dim G As Word , Gs As Integer , Ga As Integer
Dim B As Word , Bs As Integer , Ba As Integer
Ra = 0

Start Adc

Do

  R = Getadc(0)
  Rs = R / 256
  Compare1b = Rs

  G = Getadc(1)
  Gs = G / 256
  Compare1a = Gs

  B = Getadc(2)
  Bs = B / 256
  Ocr2 = Bs

Loop
End
joa einfach wird auch diese Version nicht man muss wahrscheinlich auch etwas davor basteln, irgendwas in diese richtung
Bild
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Sa, 06.02.10, 18:09

Code: Alles auswählen

  B = Getadc(2)
  Bs = B / 256
  Ocr2 = Bs
Versteh ich nicht... Getadc(...) hat einen Wertebereich von 0..1023; entsprechend bei Ref=internal 0..2.5V. Es kommen aber ja nur 0..0.7V an, also am ADC ein Wertebereich von 0..285. Wenn Du das so runterteilst (/256) kommt ein Wertebereich von 0..1 raus??? Ich fand die erste Rechnung verständlich, auch wenn man natürlich Floating Point (genauso wie Division) möglichst vermeidet.

Signal integrieren ist eine gute Idee. Aber halt nicht mehr so simple...
turi
Mega-User
Mega-User
Beiträge: 302
Registriert: Do, 13.11.08, 21:52
Wohnort: 04...
Kontaktdaten:

Sa, 06.02.10, 19:44

Auch wenn am VGA-Port analoge Signale anliegen, so liegen diese doch in einer hohen Frequenz an, oder täusche ich mich da? Da Bild muss ja schließlich aufgebaut werden. Insofern ist für mich fraglich, was die Auswertung des Signals zu einem beliebigen Zeitpunkt bringen soll, da ja gerade irgend ein Bildteil aufgebaut wird. Meiner Meinung nach kann das so nicht funktionieren ...
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 06.02.10, 20:00

VGA kann je nach Auflösung bis zu 100MHz erreichen. In wiefern das noch ein Problem wird, muss man sehen.
Aber, dass es prinzipiell so funktioniert, wie ich dachte, weiß ich 100%ig, da ich das schon mit Multimeter gemessen hab:

viel rot im Bild -> rote Leitung führt entsprechend hohe Spannung nahe 0,7V
wenig rot im Bild -> Spannung an der rot-Leitung entsprechend gering

So verhält es sich mit den anderen beiden Leitungen auch. Zu diesen 3en existiert noch eine weitere Leitung namens "sync".
Mit der zusammen entsteht erst das Bild.

Nicht vergessen, ich habe nur vor, ein 1-Kanal-Ambilight zu bauen...jegliche Infos, wo gerade welche Farbe ist, sind unnötig :wink:
und es wird auch so gut wie kein Geld investiert, da ich benötigte Teile eh rumfliegen hab. LEDs kaufe ich erst ein, wenn die Schaltung in der Praxis zufriedenstellend arbeitet.

Allerdings hab ich noch keines der bis jetzt vorgeschlagenen Programme zum Laufen bekommen. Das erste von Jay ließ sich nicht compilieren, wegen Fehler in der Timerkonfiguration, den ich nicht gelöst bekomme.
Den Teil von Borax konnte ich wegen dem Fehler in Jays Programmkopf noch nicht testen.
Das zweite von Jay ließ sich zwar compilieren, aber es macht merkwürdige Dinge. 2 LEDs leuchten immer, die dritte leuchtet schwach, wenn man Spannung an die Analogeingänge legt.
Wie verhext...aber ich werde erst einmal ne anständige Platine machen, der fliegende Testaufbau kann bestimmt auch eine Menge Störungen verursachen.
Benutzeravatar
Jay
Hyper-User
Hyper-User
Beiträge: 1096
Registriert: Mo, 08.05.06, 07:54
Wohnort: Österreich

Sa, 06.02.10, 20:31

ich habe hier was interessantes gefunden.

ich denke es ist ähnlich was der liebe Mirfaelltkeinerein schon gebaut hat.
turi
Mega-User
Mega-User
Beiträge: 302
Registriert: Do, 13.11.08, 21:52
Wohnort: 04...
Kontaktdaten:

Sa, 06.02.10, 21:19

Klar wird das funktionieren, wenn man die Messung der Spannung mit dem Bild synchronisiert. Das Multimeter ist doch träge und gibt so scheinbar den richtigen Wert aus. Ich denke, man muss die Spannung über ein gesamtes Bild ermitteln und dann irgendwie mitteln, um den richtigen Wert zu erhalten. Aber sucht doch mal im Web. Das haben schon einige gebaut, teilweise sogar mit Auswertung des Bildes.
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mo, 08.02.10, 10:42

Ok Dann kriegst Du jetzt von mir ein vollständiges Programm...
Das ist kein Problem. Was Turi angemerkt hat, habe ich ja oben auch schon mal angedeutet:
bin ich aber nicht sicher (die 0-0.7V sind ja viel schneller getaktet als der AD-Wandler sie 'lesen' kann - was dann der AD Wandler draus macht ist die Frage)
Aber wir können es ja noch ein wenig verbessern...
In dem angefügten Code wird die PWM-Definition ähnlich wie beim rgb_moodulator von Neni vorgegeben (Phase correct PWM).
Die Werte vom ADC werden in einer Schleife 28 mal gelesen (dadurch sollte sich eine halbwegs brauchbare Mittelung ergeben) und anschließend durch 32 geteilt (natürlich per Bit-Shift). Dadurch wird der Wertebereich von 0..280 auf 0..245 gebracht was mit den Vorgaben für die PWM-Werte 0..255 zusammenpasst.
Probier mal... (Achtung: Takt auf 8MHz!)
Dateianhänge
rgb_moodulator_Ambilight.zip
(1.7 KiB) 263-mal heruntergeladen
Benutzeravatar
TomTTiger
Ultra-User
Ultra-User
Beiträge: 547
Registriert: Mo, 23.06.08, 11:54
Wohnort: Weyerbusch / RP

Mo, 08.02.10, 12:49

Error: 86 Line: 6 Invalid parameter for CONFIG parameter or value [PWN=8]
Klaro :D
Das muss korrekt heißen :
PWM=8 nicht PWN=8

Passiert im Eifer des Gefechts mal 8) Vor lauter Wald sieht man die Bäume nicht mehr ...

Was ich mal machen würde als Test, um zu sehen, obs funktioniert :
Leg doch mal nen 10pF Kondensator zwischen R & GND und miss nochmal die Spannung nach...
Der Kondi glättet die Wechselspannung des DVI Ausgangs, vielleicht ergibt das andere DC-Spannungswerte am ADC-Eingang, mit denen der "langsame" AVR was anfangen kann.

Grüße
Tom
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Mo, 08.02.10, 16:47

So, Platine hab ich jetzt auch endlich mal gemacht. Nur Lochraster, weil eh kaum was drauf ist und es sich deshalb nicht wirklich gelohnt hätte zu ätzen. Und ich hab ausnahmsweise sogar mal alle Kondensatoren eingelötet und alle GNDs und VCCs aufgelegt :mrgreen: .
Sonst, wenn ich den ADC nicht gebraucht hatte, blieb die rechte Seite gerne mal komplett unbeschaltet
08022010708.jpg
@TomTTiger: Tjaja, auf die Idee bin ich auch schon gekommen, der Fehlercode blieb allerdings der gleiche, nur stand dann dort [PWM=8] :P
Naja jetzt hab ich ja den Komplett-Neuentwurf von Borax.

@Borax: Vielen Dank schon mal dafür. Werd das gleich mal brennen und ausprobieren.

EDIT: >>Misserfolg zu verzeichnen<<
Dein Programm funktioniert super Borax. Hab zuerst mit Poti und Messgerät im "Duty"-Modus etwas rumprobiert und es läuft wunderbar. Der VGA-Anschluss macht dem µC aber wohl ziemlich zu schaffen: Wildes flackern der LEDs und auch die mittlere Helligkeit der einzelnen LEDs kann man nicht wirklich der Farbe des LCDs zuordnen...Ich werde also tatsächlich nicht um eine aufwendigere Schaltung drumrum kommen...
@turi: Jetzt bin ich überzeugt :P
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Mi, 10.02.10, 10:46

Du könntest noch versuchen, noch stärker zu mitteln. Im momentanen Code wird ja 28 mal gemessen, aufaddiert und der PWM-Wert aktualisiert. Das ergibt ca. 50 Aktualisierungen pro Sekunde. Wenn Du anstatt Word Variablen den Type Long verwendest und z.B. 450 mal aufaddierst, durch 512 teilst (shift ... right , 9), dann ergibt das nur noch 2-3 Aktualisierungen pro Sekunde, und einen Mittelwert über je 450 Werte pro Farbe. Vielleicht wird es dadurch besser. Man könnte ggf. sogar über 2-3 Sekunden mitteln...
Schaffst Du das alleine, oder brauchst Du 'fertigen' Code?
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Mi, 10.02.10, 18:40

Okay, jetzt wirds seltsam:
Zuerst mal, ja mit der Änderung komme ich klar. Wenn das Grundgerüst erst mal steht, verändern klappt ganz gut :wink:

Aber nun folgendes:
Ich habe den Aufbau nochmal fernab vom VGA-Anschluss betrieben. Programm war die unveränderte Version, so wie du sie hochgeladen hattest.
Wenn ich nun die Analogeingänge auf Masse lege, sollten die LEDs ja komplett verlöschen (0V = 0%).
Rot geht runter auf etwa 17%, wenn ich alle Analogeingänge auf Masse lege.
Grün und Blau gehen dann HOCH auf etwa 82% :?:
Messe extra mit Multimeter, weil man beim Blick in die grellen 3mm Test-LEDs nichts wirkliches sagen kann. Die blenden auch bei 17% noch...

Dann hab ich nochmal ein Poti angeschlossen, und das Problem dann ziemlich gut erkannt. Um 160mV ist die blaue LED aus, und dimmt dann bis 700mV hoch. Unter 160mV ist sie mit nahe 100% an und dimmt bis 0mV kaum runter (jedenfalls lange nicht ganz aus).
Die rote dimmt von 160mV bis 700mV in die falsche Richtung (wird dunkler). Unter 160mV ist sie etwa konstant mit 17% an.
Das finde ich jetzt schon ziemlich verwunderlich...
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Do, 11.02.10, 09:28

Versteh ich auch nicht. Wenn ich es schaffe, dann teste ich das am WE mal selbst. Vielleicht hängt es irgendwie mit der Type-Umwandlung zusammen... Sicherheitshalber könnte man die Werte auf 1 Byte begrenzen.
Also:
Adcvalue = Getadc(0) And 255
dito für die anderen und ebenso:
Red_pwm1 = Adcvalue1 And 255
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Do, 11.02.10, 18:22

Borax hat geschrieben: Adcvalue = Getadc(0) And 255
dito für die anderen und ebenso:
Red_pwm1 = Adcvalue1 And 255
Habe ich mal verändert und für rot kurz getestet.
Der Punkt der Wende verschiebt sich von vorher 160mV auf etwa 45mV, allerdings sinkt die Einschaltdauer am Ausgang immer noch mit steigender Spannung (LED wird dunkler).Wenn ich mal probehalber über 700mV hinausdrehe, dann beträgt die ED ab etwa 800mV wieder 100% und sinkt wieder bei weiter steigender Spannung (habe nur bis 1V getestet).

Ich bin mir zwar nicht sicher, aber geht die Variable "Word" nicht nur bis 2000? Und wenn man dann 28mal die Werte addiert, kommt man ja auch bei einem maximalen Wert von GETADC von kanpp 280 bei max. 0,7V und 2,56V Referenz schnell auf weit über 2000, sodass es zu einem Overflow kommt und das ganze deshalb von neuem beginnt.
Aber auch bei Änderung der Variablen auf "Long" und Erweiterung der Messung auf 0 bis 449, also 450 Zyklen trat ja ein vergleichbares Phänomen auf, und nicht zu vergessen das Dimmen in die falsche Richtung, was ja dadurch eigentlich nicht passieren kann...

EDIT: Bin schlauer...Word gehen doch bis 65535 :mrgreen:
Borax
Star-Admin
Star-Admin
Beiträge: 12243
Registriert: Mo, 10.09.07, 16:28

Do, 11.02.10, 23:56

Wenn ich mal probehalber über 700mV hinausdrehe, dann beträgt die ED ab etwa 800mV wieder 100% und sinkt wieder bei weiter steigender Spannung (habe nur bis 1V getestet).
Naja, das ist klar. Der Wertebereich geht ja auch von 0..1023 , wir verwenden halt nur die unteren 8 Bit.
das Dimmen in die falsche Richtung
Ist (isb. bei rot) sehr seltsam. Wenn es bei blau gewesen wäre, hätte es auch sein können, dass ich die inverted/not inverted Bits bei der PWM Definition des Timers (Timer2) verwechselt habe. Aber rot+grün hängen ja am gleichen Timer (Timer1). Die können sich eigentlich nicht unterschiedlich verhalten.
Benutzeravatar
Beatbuzzer
Auserwählter
Auserwählter
Beiträge: 3177
Registriert: Fr, 17.08.07, 11:02
Wohnort: Alfeld / Niedersachsen
Kontaktdaten:

Sa, 27.02.10, 10:19

So ich hab jetzt noch mal von null an das Programm neu geschrieben:

Code: Alles auswählen

$regfile = "m8def.dat"
$crystal = 8000000

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

Config Timer1 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1

Dim Red As Byte
Dim Green As Byte
Dim Blue As Byte

Dim Rep As Byte

Dim Wertred As Word
Dim Wertgreen As Word
Dim Wertblue As Word

Do
Wertred = 0
Wertgreen = 0
Wertblue = 0

For Rep = 0 To 27
Red = Getadc(0)
Wertred = Wertred + Red

Green = Getadc(1)
Wertgreen = Wertgreen + Green

Blue = Getadc(2)
Wertblue = Wertblue + Blue
Next Rep

Shift Wertred , Right , 5
Ocr2 = Wertred

Shift Wertgreen , Right , 5
Ocr1al = Wertgreen

Shift Wertblue , Right , 5
Ocr1bl = Wertblue
Loop
Der rote Kanal funktioniert dabei genau so wie er soll. Auch am VGA-Ausgang funktioniert er überraschend gut. Allerdings liegt noch ein leichtes flackern über dem eigentlichen PWM-Signal, aber das würde mich vorerst nicht mal weiter stören.

Das eigentliche Problem sind grün und blau. Da tut sich noch gar nichts, außer dass sie immer mit voller Helligkeit leuchten. Auch wenn ich die Analogeingänge auf Masse lege. Anscheinend ein Fehler im Programm...
Wäre nett, wenn mir da jemand auf die Sprünge helfen kann, denn so langsam kommen wir einem brauchbaren Ergebnis nahe. :wink:
Antworten