PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer 0 Mega 16



MasterMX
27.12.2009, 15:00
Hi Leute,

Ich hab ein kleines Problem mit meinem Mega16, ich versuche die 4 Hardware PWM Kanäle zu Benutzen um damit LEDs anzusteuern (RGB *weiß).
Leider bekomme ich den OCR0 noch nicht zum laufen...




$regfile = "m16def.dat"
'$crystal = 12000000
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 1a
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 1
Config Timer0 = Pwm , Pwm = On , Compare Pwm = Clear Down , Prescale = 1
Config Timer2 = Pwm , Pwm = On , Compare Pwm = Clear Up , Prescale = 1

Start Adc
Enable Interrupts
Enable Timer2
Enable Timer0


Dim W As Word
Dim R As Word
Dim G As Word
Dim B As Word

Do
R = Getadc(3) / 4
G = Getadc(2) / 4
B = Getadc(1) / 4
W = Getadc(0) / 4
Cls
Locate 1 , 1 : Lcd G
Cursor Off

Compare1a = R
Compare1b = G
Ocr0 = W
Ocr2 = B

Loop


End


Desweiteren zeigt mein Display (161 A von Displaytech) nur 8 statt 16 Zeichen an.

Das Signal vom ADC mit Potis funktioniert Bei allen Kanälen, das habe ich mir auf dem Display anzeigen lassen.

Viele Grü0e Jakob Kalwar

021aet04
27.12.2009, 22:30
Leider kann ich dir bei Bascom nicht helfen, aber warum nimmst du weiße Leds? Wenn du die 3 Farben mischt kommt weiß heraus. Das funktioniert bei Fernsehern und Monitoren gleich.

MfG Hannes

MasterMX
27.12.2009, 22:56
Hi,

Ich will zusätzlich noch weiße Leds einbauen, die ich bei Tag anmachen kann damit es Hell genug ist, und das weiß von RGB ist auch nicht immer gleich weiß, wenn nur eine LED heller ist als die anderen beiden passt das nicht mehr so gut.

Grüße Jakob

Sauerbruch
29.12.2009, 18:32
Leider bekomme ich den OCR0 noch nicht zum laufen...

Geht´s denn mit den Timern 1 und 2?
Und hast Du schon mal versucht, hinter die LCD-Zeilen ein "Initlcd" zu schreiben?

Daniel

MasterMX
31.12.2009, 12:03
Hi,

Also Timer 1 und 2 laufen problemlos.
Das mit dem LCD fist eine Idee, aber irgendwie hab ih fetsgestellt das es manchmal angeht und dann wieder aus
also es blink quasi in langsamen abständen... naja das mit dem LCD ist eher weniger das Problem, der Timer ist mir wichtiger.

Grüße Jakob

Sauerbruch
31.12.2009, 15:37
Das ist ja alles merkwürdig...

Ich habe zwar keinen Mega16 zur Hand, habe das aber mal mit ´nem Mega8 nachgekocht.

Meinem (!) Display wird es definitiv zuviel, wenn es bei jedem Schleifendurchlauf einen Schreibbefehl bekommt, es flackert auch ziemlich. Displays mit einer so hohen Frequenz zu aktualisieren ist auch gar nicht nötig. Lass´ doch mal eine Variable hochzählen, und nur bei jeder 1000. oder 2000. Schleife den LCD-Befehl ausführen. Bei mir hat das die Anzeige erheblich stabilisiert.

Die PWM-Geschichte müsste man systematisch einkreisen. Ich würde mal folgendes machen:

1. Überprüfe mal, ob der Wert "W" ordentlich übernommen wird, indem Du Dir direkt das Register OCR0 anzeigen lässt (LCD OCR0).

2. Lass Dir mal das TCCR0-Register "zeigen", das die Eigenschaften des Timers festlegt (LCD TCCR0). Bei Deinen Einstellungen (Prescaler=1, PWM, Compare = Clear down) müsste das Register den Wert 113 enthalten (binär 01110001).

Vielleicht deckt das ja den Fehler schon auf.

Grüße,

Daniel

mare_crisium
31.12.2009, 18:29
MasterMX,

könnte es sein, dass das Verhalten mit der Priorität des Interrupts zu tun hat (siehe Seite 14 des Datenblatts (Pkt. 6.7 Reset and Interrupt Handling) ? Die höchste Priorität hat der RESET-, die niedrigste der SPM_READY-Interrupt. Die Interrupts des Counter/Timer0 haben demnach die niedrigste Priorität aller Timer-Interrupts. Kann sein, das er in Deinem Programm gegenüber den anderen immer den Kürzeren zieht ;-).

mare_crisium

Sauerbruch
31.12.2009, 20:37
Grundsätzlich ein guter Hinweis, Hardware-PWM läuft aber komplett ohne Interrupts! Das ist ja das geniale daran :-)

MasterMX
31.12.2009, 21:55
Hey Sauerbruch,

Danke für den tollen post, das werde ich alles mal probieren.

Schön das mir jemand so eine nette Antwort schreibt.

Grüße Jakob K.

Michael
31.12.2009, 22:08
Hallo MasterMX,


Desweiteren zeigt mein Display (161 A von Displaytech) nur 8 statt 16 Zeichen an.
das ist ein 2x8 Display, schreib einfach in Zeile 2 weiter ;)

Gruß, Michael

MasterMX
01.01.2010, 12:52
Hallo,

2x8 kann ich aber nicht bei Config LCD reinschreiben...

Grüße Jakob

MasterMX
04.01.2010, 13:22
Hi,

Das mit dem LCD hat funktioniert.

Hab Config LCD = 16x1a gelassen und dann locate 2,1 ab der 9. Zeile benutzt, das geht so wunderbar.

Der Timer geht leider immernoch nicht

LCD OCR0 gibt richtige ergibnisse aus

und

LCD TCCR0 gibt bei claer down 97 aus und bei clear up 113

also auch richtig.

Ich weiß nichtmehr weiter ?

Wenn ich portb.3 wo OCR0 ist auf high setzte geht die led auch an, also kann es an der Schaltung nicht liegen.

Grüße Jakob

Sauerbruch
04.01.2010, 14:23
Das ist ja wirklich ´ne harte Nuß...

Ich habe gerade nochmal im Datenblatt gestöbert und bin über den Absatz gestolpert, dass man die entsprechenden Pins explizit als Ausgang konfigurieren muss. Versuch´s doch mal mit

DDRB.3 = 1

Das wäre dann erstmal die letzte Idee die ich habe...

MasterMX
04.01.2010, 15:48
Hallo

FETTES DANKE an alle.

Das problem wurde mi DDRB.3 = 1 gelöst.

Jetzt geh ich proggen und freu mir n Keks :)

Grüße Jakob