Forum: Mikrocontroller und Digitale Elektronik LED mit einaem Taster andimmen, mit anderem ausdimmen.


von mohi (Gast)


Lesenswert?

Hallo,

ich möchte mit einem ATmega 16 einer LED und zwei Tastern die LED 
ansimmen bzw ausdimmen.

Ich weiß das es über PWM geht, aber ich hab leider nicht den nötigen 
Plan um das alleine umzusetzen.

Am liebsten hätte ich es so, das wenn ich den ATmega starte die LED eine 
standardhelligkeit hat und wnen ich auf Taster_plus drücke dann wir ed 
heller bis maximale Helligkeit und wenn ich auf Taster_minus drücke die 
Helligkeit abnimmt, bis die LED aus ist.

Also, im gleich folgenden Code funktioniert zwar das Dimmen, nicht so 
wie gewünscht...

Hier der Code:

$regfile = "m16def.dat"
$framesize = 100
$swstack = 100
$hwstack = 100
$crystal = 16000000

Config Portd.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

Config Pinc.1 = Input
Portc.1 = 1
Taster_plus Alias Pinc.1
Config Pinc.2 = Input
Portc.2 = 1
Taster_minus Alias Pinc.2

Do
Debounce Taster_plus , 0 , Led_plus , Sub
Debounce Taster_minus , 0 , Led_minus , Sub
Loop
End

Led_plus:
 Pwm1a = Pwm1a + 50
Return

Led_minus:
 Pwm1a = Pwm1a - 50
Return

von Achim M. (minifloat)


Lesenswert?

Machst du vor die Do...Loop Mainloop eben ein Pwm1a = 32000

Was du auch machen könntest: eine Wertetabelle mit sagen wir mal 100 
Werten,
die eine logarithmische Kennlinie enthält, weil das "für das Auge 
logischer erscheint".

Dann einfach die Eingangswerte der Wertetabelle verändern und die 
Ausgangswerte eben in die PWM-Register schieben.

Was mir so noch an deinem Programm auffällt: Da gibt es keinen 
Unter-/Überlaufschutz bei den Stellprozeduren. Wenn du unter die 0 
kommst, gibts plötzlich wieder "Vollgas".

Vielleicht sowas wie das da:

Led_plus:
 If Pwm1a < 65500 Then
  Pwm1a = Pwm1a + 50
 End If
 Return

Led_minus:
 If Pwm1a > 49 Then
  Pwm1a = Pwm1a - 50
 End If
 Return

mfg mf

PS: Ich kann kein Bascom, komme eher aus der C-Ecke und hab letztes Jahr 
VHDL "gelernt". Von daher syntaktische Fehler bitte verzeihen...

von mohi (Gast)


Lesenswert?

Genau, der Überlauf...
Und ja in der Tat, wenn ich auf TAster_plus drücke, dann wird die LED 
stufenweise dunkler und dann wieder auf volle Helligkeit.

Ok Überlauf scheint das Zauberwort zu sein, aber wie realisiere ich das?

In Pwm1a ist ja immer eine Zahl drinne, zwischen 0 und (nach dem was du 
angebene hast) 65500, richtig?

von mohi (Gast)


Lesenswert?

PWM ist bis 255.

Ok, aber wie programmiere ich den Überlauf?

Hab jetzt erstmal an folgendes gedacht:

Led_plus:
 Pwm1a = Pwm1a - 17
 If Pwm1a < 1 Then
 Pwm1a = 0
 End If
Return

Led_minus:
 Pwm1a = Pwm1a + 17
 If Pwm1a > 255 Then
 Pwm1a = 255
 End If
Return

Aber das funktioniert nicht...

Hat jemand für mich den heißen Tip?

von D. S. (datasheet)


Lesenswert?

Ich kenne bascom gar nicht. Aber ich denke, dass es nicht größer als 255 
geht, da nur 8 bit. Wenn du eh in 10er Schritten vorgehen willst, 
definiere dir eben eine neue variable, die du um 1 inkrementierst bzw. 
Dekrementierst und überprüfst (wenn > 25 dann = 25 und wenn < 1 dann = 
1) und dann setzt du dein pwm register eben auf 10• den Wert.

von mohi (Gast)


Lesenswert?

Ja geht nur bis 255.
Hab mir den Wert von Pwm1a auf ein LCD ausgeben lassen und da konnte ich 
sehen, das es nur bis 255 geht. Wegen 8 Bit...

Also der Folgende Code funktioniert einwandfrei:

----------------------------------
Config Portd.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

Config Pinc.1 = Input
Portc.1 = 1
Taster_plus Alias Pinc.1
Config Pinc.2 = Input
Portc.2 = 1
Taster_minus Alias Pinc.2

Pwm1a = 1

Do
Debounce Taster_plus , 0 , Led_plus , Sub
Debounce Taster_minus , 0 , Led_minus , Sub
Loop
End

Led_plus:
 Pwm1a = Pwm1a - 1
 If Pwm1a < 1 Then
 Pwm1a = 1
 End If
Return

Led_minus:
 Pwm1a = Pwm1a + 1
 If Pwm1a < 1 Then
 Pwm1a = 255
 End If
Return
----------------------------------


So das Problem hier, weil ich "Pwm1a = Pwm1a + 1" geschrieben habe, 
steigt der Wert von Pwm1a bei jedem Tastendruck um eins...
Also muss ich 255 mal auf die Taste drücken um die LED vollständig zu 
dimmen.

Erhöhe ich die Addition sagen wir wie folgt: "Pwm1a = Pwm1a + 25" dann 
wirkt der überlauf aufeinmal nicht mehr!
Die Led wird also dunlker, dunkler und dunkler, dann wieder vollle 
Helligkeit und wieder dunkler, dunkler und dunkler...

Das mir der Variable klingt nicht schlecht, aber du müsstest mir die 
vorgehensweise etwas genauer erklären, ich verstehe es so nicht bzw, ich 
kanns nicht umsetzen...


Vielen Dank aber für deine Hilfe...

von Matthias (Gast)


Lesenswert?

D. S. schrieb:
> Wenn du eh in 10er Schritten vorgehen willst,

Das ist eher unpraktisch, weil z.B. beim Schritt von 10 auf 20 die 
Helligkeit um 100% zunimmt, aber beim Schritt von 240 auf 250 nur um 4%.

Mini Float hat schon Recht

Mini Float schrieb:
> eine logarithmische Kennlinie enthält, weil das "für das Auge
> logischer erscheint".

von mohi (Gast)


Lesenswert?

Ja stimmt...
Dieses Phänomen ist mir auch aufgefallen.
Die Led dimmt nicht gleichmäßig, nicht linear...
Erst dachte ich auch, das bei 1 die Led superdunkel ist und bei 255 
superhell und bei der Hälfte 127 halbhell ist, aber so ist es nicht!

Hmmm, wie funktioniert das mit der Wertetabelle?
Hast du mal einen Beispielcode in Bascom?

von D. S. (datasheet)


Lesenswert?

Musst schon selber googeln. Such mal nach array und bascom, da wird 
schon was kommen.

von mohi (Gast)


Lesenswert?

Ich wollte ja nicht den komplett fertigen Code! Ich wollte nur so eine 
Art Grundgerüst haben, also wie die Struktur ist...

Aber ich werd mal mein Glück mit google und array versuchen.

Danke...

von Gerald *. (pyromane)


Lesenswert?

Im Artikel http://www.mikrocontroller.net/articles/LED-Fading solltest 
du einiges zum Thema Dimmen von LEDs finden.

von Matthias (Gast)


Lesenswert?

mohi schrieb:
> Erst dachte ich auch, das bei 1 die Led superdunkel ist und bei 255
> superhell und bei der Hälfte 127 halbhell ist, aber so ist es nicht!

Nun ja, 127 ist schon halb so hell wie 255. Aber die Stufe davor müßte 
dann 63 (=127/2) sein und nicht 1. Verdoppelungsstufen sind allerdings 
oft schon zu grob, weil das Auge das meist noch als Sprung wahr nimmt.

von mohi (Gast)


Lesenswert?

Gerald *. schrieb:
> Im Artikel http://www.mikrocontroller.net/articles/LED-Fading solltest
> du einiges zum Thema Dimmen von LEDs finden.

Ist leider nicht in Bascom...

Also eigentlich brauche ich kein stufenloses dimmen, obwohl es schöner 
wäre, aber dann wäre es sinnvoller, wenn das dimmen so lange andauert 
wie man die Taste gedrückt hält, onst wäre das zuviel Tastendrückerei.

Ich hab ne Uhr gebastelt mit nem LCD-Display und da würde ich gerne die 
Hintergrundbeleuchtung regulieren...

5 oder 7 Helligkeitsstufen würden eigentlich langen...

Ich würde auch ganz gerne den Code klein halten, weil ich noch nicht so 
fit bin und deswegn ich schnell die Übersicht verlieren könnte...

Eigentlich würde mir ja mein obengeposteten Code nutzen, funktioniert ja 
auch, nur hab ich Probleme mit dem Überlauf.

Wenn ich Pwm1a + 1 schreibe funktioniert der Üebrlauf.
Schreibe ich Pwm1a + 15, dann funktioniert der über lauf nicht...

Problem bei Pwm1a, ich müsste 255 mal auf den Taster drücken um von 0 
bis 255 zu kommen...

Wurscht wäre das allerdings, wenn die Pwm1a immer plus 1 macht, solange 
man den Taster derückt hält. Also das bei gedrücktem Taster der pwm1a 
wert 1, dann 2, dann 3, .... dann 255, Ende.

Na ja muss  mal gucken wie ich das hinkriege! Aber sooo einfach ist das 
alles nicht...

Vielen Dank für eure Tips!

von Karl H. (kbuchegg)


Lesenswert?

mohi schrieb:

> Wenn ich Pwm1a + 1 schreibe funktioniert der Üebrlauf.
> Schreibe ich Pwm1a + 15, dann funktioniert der über lauf nicht...

Original:
Led_minus:
 Pwm1a = Pwm1a + 1
 If Pwm1a < 1 Then
 Pwm1a = 255
 End If

Do meintest wohl

   if Pwm1a > 255 then

und in die andere Richtung, beim kleiner werden, musst du aufpassen.
pwm1a kann nicht negativ werden, weil es unsigned (also ohne Vorzeichen) 
ist.
In diesem Fall gilt dann
  0 minus 1 ergibt 255

D.h. den Überlauf erkennst du daran, dass das Ergebnis größer als die 
Ausgangszahl geworden ist. Bestes Beispiel aus deiner Umgebung ist eine 
Uhr. Steht der Sekundenzeiger auf 5 und rückst du ihn um 10 Sekunden 
zurück, dann steht er danach auf 55.

einfacher ist es allerdings, wenn du so vorgehst
Wann wird denn ein Unterlauf entstehen?
Genau dann, wenn die Ausgangszahl kleiner ist, als die Zahl die du 
abziehst.

Rechnest du  8 - 5  dann wird es keinen Unterlauf geben, denn 8 ist 
größer als 5. Kommt es aber zur Rechnung 4 - 17, dann wird es einen 
Unterlauf geben, denn 4 ist kleiner als 17.

  if Pwm1a < 15 then
    Pwm1a = 0
  else
    Pwm1a = Pwm1a - 15
  endif

in die andere Richtung (beim größer werden) macht man dann genau das 
gleiche, nur eben für den positiven Fall. Als Übung für den 
Programmierer hier nicht ausgeführt.


> Na ja muss  mal gucken wie ich das hinkriege! Aber sooo einfach
> ist das alles nicht...

Programmieren ist nun mal etwas mehr als "Och da schreib ich einfach 
irgendwas hin, und dann klappt das auch". Sonst könnte das ja jeder. 
Willkommen im Club.

von mohi (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Programmieren ist nun mal etwas mehr als "Och da schreib ich einfach
> irgendwas hin, und dann klappt das auch". Sonst könnte das ja jeder.
> Willkommen im Club.

Der war gut :-)
Ja da haste recht programmieren ist halt nicht eben mal so einen Eintrag 
ins Tagebuch ;-)


Also in meinem Fall ist das so, das wenn Pwm1a 255 ist, die LED dunkel 
ist und wenn pwm1a 1 ist, dann volle Helligkeit.
Deswegen muss ich umgekehrt denken und deswegen funktioniert der 
Überlauf so wie hier korrekt:

#  Led_plus:
#   Pwm1a = Pwm1a - 1
#   If Pwm1a < 1 Then
#   Pwm1a = 1
#   End If
#  Return
#
#  Led_minus:
#   Pwm1a = Pwm1a + 1
#   If Pwm1a < 1 Then
#   Pwm1a = 255
#   End If
#  Return

Folgender code funktioniert einwandfrei, bis auf die wilder Drückerei 
auf den Tastern...

#  $regfile = "m16def.dat"
#  $framesize = 100
#  $swstack = 100
#  $hwstack = 100
#  $crystal = 16000000
#
#  Lcd_db4 Alias Porta.2
#  Lcd_db5 Alias Porta.3
#  Lcd_db6 Alias Porta.4
#  Lcd_db7 Alias Porta.5
#  Lcd_e Alias Porta.1
#  Lcd_rs Alias Porta.0
#
#  Config Lcd = 16 * 2
#  Config Lcdmode = Port
#  Config Lcdbus = 4
#  Config Lcdpin = Pin , Db4 = Lcd_db4 , Db5 = Lcd_db5 , Db6 = Lcd_db6 , 
Db7 = Lcd_db7 , E = Lcd_e , Rs = Lcd_rs
#  Initlcd
#  Display On
#  Waitms 400
#  Cursor Off
#  Cls
#
#  Config Portd.5 = Output
#  Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 
1
#
#  Config Pinc.1 = Input
#  Portc.1 = 1
#  Taster_plus Alias Pinc.1
#  Config Pinc.2 = Input
#  Portc.2 = 1
#  Taster_minus Alias Pinc.2
#
#  Pwm1a = 1
#
#  Do
#  Debounce Taster_plus , 0 , Led_plus , Sub
#  Debounce Taster_minus , 0 , Led_minus , Sub
#
#     Locate 1 , 1
#     Lcd Pwm1a
#     Lcd "     "
#     Locate 2 , 1
#     Lcd Compare1a
#     Lcd "     "
#
#  Loop
#  End
#
#  Led_plus:
#   Pwm1a = Pwm1a - 1
#   If Pwm1a < 1 Then
#   Pwm1a = 1
#   End If
#  Return
#
#  Led_minus:
#   Pwm1a = Pwm1a + 1
#   If Pwm1a < 1 Then
#   Pwm1a = 255
#   End If
#  Return

Ich muss mir deine Erklärung nochmal etwas genauer durchlesen. Meld 
mioch dann nochmal...

von mohi (Gast)


Lesenswert?

Ohh man...
Ich glaube, Hintergrundbeleuchtung mit PWM kann ich vergessen...

Kann es sein, das man nicht "Config DCF77" und "Config Timer1" 
gleichzeitig nutzen kann??

Hab eben den Code (den ich oben gepostet habe) in mein LCD-Uhr-Code 
eingebunden, die Uhr hat verückt gespielt, also die Uhr hat zwar 
funktioniert, aber viel zu schnell, auf einmal wurde aus dem 
Sekundentakt eine Hunderstelsekundentakt, oder so...

Also ich glaube mit Hardware-PWM siht das ganz ziemlich schlecht aus...

Ist Software-PWM ne brauchbare alternative?
Muss man dafür viel Code schreiben?



Schade echt... Da war ich soo dich dran und jetzt aufeinmal meilenweit 
davon entfernt... :-(

von Gerhard K. (mikros)


Lesenswert?

mohi schrieb:
> Schade echt... Da war ich soo dich dran und jetzt aufeinmal meilenweit
> davon entfernt... :-(

That's life!

Lesen bildet. Studier mal die Bascom Hilfe und Dir geht vielleicht ein 
Licht
auf.

Gewisses Untalent bringst Du ja mit:
http://www.avr-praxis.de/forum/showthread.php?2238-Probleme-mit-Bascom-Wecker-mit-LCD-Display-mit-einem-ATmega8/page12

MfG

von mohi (Gast)


Lesenswert?

Gerhard K. schrieb:
> Gewisses Untalent bringst Du ja mit:
> http://www.avr-praxis.de/forum/showthread.php?2238...

Ja genau und jetzt kannst du auch bestimmt wieder mal gut schlafen...

Statt nach anderen Posts von mir zu suchen, wäre ein brauchbarer Hinweiß 
besser! Denk mal drüber nach ;-)

von Gerhard K. (mikros)


Lesenswert?

mohi schrieb:
> Ja genau und jetzt kannst du auch bestimmt wieder mal gut schlafen...

Danke, habe sehr gut geschlafen.

mohi schrieb:
> Statt nach anderen Posts von mir zu suchen

Ich suche nicht, ich finde.

mohi schrieb:
> wäre ein brauchbarer Hinweiß
> besser!

Habe ich doch getan.

MfG

von Thomas D. (thomasderbastler)


Lesenswert?

Ich habe sowas auch schon mal gemacht aber so "etwa" :


Led_plus:
 Incr Pwm1a
 If Pwm1a < 255
 Pwm1a = 1
 End If
Return

Led_minus:
 Decr Pwm1a
 If Pwm1a < 1 Then
 Pwm1a = 255
 End If
Return

von mohi (Gast)


Lesenswert?

Gerhard K. schrieb:
> mohi schrieb:
>> Statt nach anderen Posts von mir zu suchen
>
> Ich suche nicht, ich finde.

Wer finden will, muss erst suchen, aber macht ja nix, du Naseweis ;-)
Spaß :-)


> mohi schrieb:
>> wäre ein brauchbarer Hinweiß besser!
>
> Habe ich doch getan.

Eben nicht, du hast nix brauchbares geliefert, im Gegensatz zu den 
anderen die hier gentwortet haben!

Also bitte, entweder hilf mir oder beschäftige dich mit was anderem als 
alte Posts von mir zu suchen, eehm, sorry, ich meinte finden ;-)


Wie dem auch sei, also das mit der Datentabelle fand ich nicht schlecht 
die Idee.
Nur wie gesagt, ich weis nicht wie ich das umzusetzen kann..

Außerdem würd mich mal interessieren, welchen/wieviele Timer die Config 
Dcf77 nutzt.

Ich hoffe ich liege nicht völlig falsch mit meiner Vermutung!?
In meinem Code steht ja:
# Config Dcf77 = Pinc.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 
1 # , Gosub = Sectic

Um PWM zu nutzen, brauch ja ja auch einen Timer, es sei den ich nutze 
SoftPWM...

Es wurden ja hier mehrere Möglichkeiten genannt.
Ich müsste mich mal auf eine festlegen und mich dann da ordentlich 
durchlesen.

Aber welche Möglichkeit wäre denn die einfachste?

Frohen Ostersonntag euch..

von Oliver J. (skriptkiddy)


Lesenswert?

Gerhard K. schrieb:
> Studier mal die Bascom Hilfe und Dir geht vielleicht ein
> Licht
> auf.

mohi schrieb:
> Eben nicht, du hast nix brauchbares geliefert, im Gegensatz zu den
> anderen die hier gentwortet haben!

Der Hinweis zur Doku passt doch. Also RTFM. Oder sollen wir das für dich 
tun?

Gruß Oliver

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

mohi schrieb:
> Außerdem würd mich mal interessieren, welchen/wieviele Timer die Config
> Dcf77 nutzt.

Schau doch mal in die BASCOM-Hilfe: Timer 1, steht ganz eindeutig drin.


mohi schrieb:
> Wie dem auch sei, also das mit der Datentabelle fand ich nicht schlecht
> die Idee.
> Nur wie gesagt, ich weis nicht wie ich das umzusetzen kann..

BASCOM-Hilfe sagt: DATA-Befehl, READ-Befehl und RESTORE-Befehl und/oder 
Arrays.

Beispiel-Quälcode:
1
Dim Array(256) As Byte
2
Dim Tempword As Word
3
4
Restore Tabelle
5
For Tempbyte = 1 To 256
6
  Read Array(Tempword)
7
Next Tempbyte
8
9
Tabelle:
10
Data 123, 75, 37, 204, 3, 48
11
Data 27, 43, 245, 123, 7, 98
12
...


mohi schrieb:
> Um PWM zu nutzen, brauch ja ja auch einen Timer, es sei den ich nutze
> SoftPWM...

Dann nimm doch z.B. Timer 0. Der ATMega16 hat doch 3 Timer.


mohi schrieb:
> Aber welche Möglichkeit wäre denn die einfachste?

Timer 0 für PWM, Timer 1 für DCF77, Array und Data-Zeilen für die 
Wertetabelle.


Gruß
Jonathan

von mohi (Gast)


Lesenswert?

Oliver J. schrieb:
> Gerhard K. schrieb:
>> Studier mal die Bascom Hilfe und Dir geht vielleicht ein
>> Licht
>> auf.
>
> mohi schrieb:
>> Eben nicht, du hast nix brauchbares geliefert, im Gegensatz zu den
>> anderen die hier gentwortet haben!
>
> Der Hinweis zur Doku passt doch. Also RTFM. Oder sollen wir das für dich
> tun?
>
> Gruß Oliver

Ich verstehe jetzt gar nicht, warum du dich da einmischst?
Hast nicht einen einzigen Post geschrieben, aber hauptsache mal 
meckern...
Määähh määähh :-) Spaß ;-)

Auch für dich, wenn du was postest, dann bitte was sinnvolles!! Nimm dir 
mal ein Beispiel an andere!

Und was "RTFM" und "Programmmieren" betrifft, ist es genau, wie wenn man 
Fliegen lernen will, da sagt der Aubilder auch nicht "read the f_cking 
manual", sondern "Hör mal zu..."! (gelesen werden muss natürlich auch!)

Sowas kann man nicht an einer Fernuni lernen, denk mal drüber nach ;-)

Ok kommen wir wieder auf was sinnvolleres zurück.




Danke für deine Tipps, Jonathan!

Ich kam erst mal nicht auf den Timer0, weil Bascom mir bei Timer0 immer 
eine Fehlermeldung ausgegeben hat.
Also:
"Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 
1"
funktioniert ab wenn ich Timer0 oder Timer2 eingebe, dann sagt Bascom:

Error 86: Invalid Parameter; Unkwon config parameter

Was funktioniert ist, wenn ich nur folgenden schreibe:
"Config Timer0 = Pwm , Prescale = 1"

Aber da hat Pwm1a auf einmal einen Wert bis zu 65363..
Und die LED bleibt auch aus, also dimmen geht nicht mehr.


Mit Array und Data-Zeilen muss ich mich erst reinlesen, bevor ich da 
halbwegs losglegen kann...

Meld mich nochmal...


Vielen Dank und viele Grüße

mohi

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

BASCOM scheint Timer 0 nicht für PWM konfigurieren zu können - also 
musst Du das per Hand machen. Dazu siehst Du ins Datenblatt vom ATMega16 
unter Timer 0, Register Description und suchst dir die passenden 
Konfigurationsbits zusammen. Da würdest Du dann auf "TCCR0 = &B00100001" 
kommen, dann ist dein Timer passend konfiguriert. Und nein, Timer 1 
bedienst und konfigurierst Du ganz anders als Timer 0 - Du kannst Code 
für Timer 0 nicht einfach für Timer 1 benutzen, so wie Du es mit deiner 
BASCOM Config-Zeile tun wolltest. Z.B. ist Timer 0 nur ein 8-Bit-Timer 
und hat auch nur einen PWM-Ausgang. Diesen bedienst Du dann mit "OCR0 = 
Wert".

Nunja, les doch einfach mal die Hilfedatei und vorallem das Datenblatt - 
RTFM ;)


Gruß
Jonathan

P.S.: Das mit dem "RTFM" ist nicht ernst gemeint - das mit Hilfe und 
Datenblatt aber schon.

von mohi (Gast)


Lesenswert?

Wirst es mir nicht glauben, ich hab mir das Datenblatt von dem ATmega16 
von Seite 71 bis 134 ausgedruckt, da gehts nur um Timer...

Hammmer, wieviel das ist!!!
Gott sei dank sind viele Bilder zwischen 71 und 134 :-)

Und da ist noch nicht mal Bascom dabei, wie ich das dann umsetzen kann, 
muss ich mir auch noch geben...

Dies zum Thema RTFM ;-)

Schade, das es das Datasheet nicht auf deutsch gibt...


Sag mal, wie ist den das wenn Softclock in Bascom aktiv ist über "Config 
Dcf77", da kann ich doch in der Hauptschleife kein If/Then für PWM 
reinschreiben, weil da die sectic wirkt, gell?
Ich muss das glaube ich über eine Routine irgendwie managen...



Und PWM über Timer0 ist auch ne krasse Sache, ich finde kaum etwas im 
Net darüber...
Meistens nur bei einem ATtiny aber diese sind etwas anders aufgebaut als 
ein ATmega...

Bei Attiny kann man z.B. schreiben Timer:
Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1

bei Atmega geht nur:
Config Timer0 = Pwm , Prescale = 1



Ich komm mit TCCR noch nicht ganz klar..

Du meinst ich soll das so schreiben:
Config Timer0 = Pwm , Prescale = 1
Tccr0 = &B00100001

?

Aber was ist das pendant zu compare1a?

von spess53 (Gast)


Lesenswert?

Hi

>Du meinst ich soll das so schreiben:
>Config Timer0 = Pwm , Prescale = 1
>Tccr0 = &B00100001

Lass doch einfach das config-Gedödel weg und programmiere den Timer über 
die Register.

MfG Spess

von mohi (Gast)


Lesenswert?

Wie geht den das?
Kannst du mir ein Beispiel machen?

Nur grob, nichts genaues..

Also du meinst, ich soll PWM nicht über Config Timer0 machen, sondern 
einen ganz anderen weg, oder wie?

Sorry echt für meine Fragen!

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

Mit "Config-Gerödel weglassen und über Register machen" meint Spess 
genau das, was ich Dir schon vorgeschlagen habe.
1
TCCR0 = &B00100001 'Das hier anstatt der Config-Zeile
2
OCR0 = 123 'Das ist dein PWM-Wert - wie Compare1a

Ist es Dir jetzt klarer?

Im Datenblatt brauchst Du dir auch eigentlich nur die Register 
Description genau anzusehen, da steht alles drin, was man braucht um den 
Timer zum Laufen zu bringen.

von mohi (Gast)


Lesenswert?

Achsooo, warte, das bedeutet "config Timer0" ist dasselbe wie "TCCR0 = 
&B00100001", ja?

Und du meinst "Register Description" auf Seite 83 von 
www.atmel.com/Images/doc2466.pdf ?

von mohi (Gast)


Lesenswert?

Also so "TCCR0 = &B00100001" gehts nicht, aber dafür so "Tccr0 = 
&B01101010" ;-)


Hier mal der ganze Code:

$regfile = "m16def.dat"
$crystal = 16000000
$framesize = 100
$swstack = 100
$hwstack = 100

Tccr0 = &B01101010
Ocr0 = 100

Config Portb.3 = Output
Portb.3 = 1

Do
Loop
End

von mohi (Gast)


Lesenswert?

Ich hab son LCD mit nem HD44780-Controller drauf.
Pin15 ist +VE und Pin16 ist Ground.

An den beiden Pins hatte ich auch einen kleinen Elko mit 4,7µF.

Pin15 war an Plus und Pin 16 an einen Widerstand dann an Minus (und halt 
der Elko).

So jetzt hab ich Pin15 an PortB.3 gesteckt und die 
Hintergrundbeleuchtung ging aus.
Erst als ich den Elko entfernt habe, ging die LED-Hintergrundbeleuchtung 
an.

Kann ich keinen mehr (bipol +-) Elko nutzen, wenn der Pluspol der 
LCD-LED-Hintergrundbeleuchtung an dem Port des ATmegas hängt?

von mohi (Gast)


Lesenswert?

OK, ich hab nun endlich alles hinbekommen.

Dimmen geht...
Überlauf-Abfangen geht...
Alles geht :-)

Und das mit dem Elko:
Also die LCD-Hintergrundbeleuchtung lässt sich auch ohne Elko wunderbar 
auf und abdimmen, es gibt keine Störungen oder flackern oder so...

Hab etwas herum experimentiert, also der Wert vom Elko ist viel zu hoch.

Wenn ich den Elko an die LCD-Hintergrundbeleuchtung anschließe, dann 
leuchtet die LCD-Hintergrundbeleuchtung erst so ab OCR0 80 (PWM-Wert)...


Dieser Thread hat mir sehr viel geholfen, muss ich wirklich sagen!
Hat zwar gedauert, aber ich bindann doch ans Ziel angekommen :-)

Konnte tatsächlich durch den Post von Karl Heinz Buchegger den Überlauf 
abfangen...
Vielen Dank, ehrlich!!

Und Timer0 registermäßig konfigurieren für PWM hab ich erst hier durch 
Jonathan Strobl kennen gelernt.
Auch hier vielen Dank!!

Danke euch allen.

Allerbeste Grüße

Mohi

von Jonathan S. (joni-st) Benutzerseite


Lesenswert?

mohi schrieb:
> Also die LCD-Hintergrundbeleuchtung lässt sich auch ohne Elko wunderbar
> auf und abdimmen, es gibt keine Störungen oder flackern oder so...

Der Elko schließt den AVR-Port (wechselstrommäßig) kurz - der könnte 
deinen AVR schrotten, also lass' ihn weg. PWM macht man mit LEDs 
generell ohne Glättungskondensator.


mohi schrieb:
> Und Timer0 registermäßig konfigurieren für PWM hab ich erst hier durch
> Jonathan Strobl kennen gelernt.
> Auch hier vielen Dank!!

Kein Problem :)


Gruß
Jonathan

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.