dieses Thema paßt gerade recht schön rein. Wir haben ja im Kursteil 9 per PWM eine LED auf- und abgedimmt. Wer ganz genau hinschaut, sieht daß die Helligkeitszunahme der LED nicht linear erscheint. Das liegt daran, daß unser Auge Helligkeitsunterschiede nicht linear empfindet. Wer es genau nachlesen möchte: http://www.mikrocontroller.net/articles/LED-Fading
In dem Artikel ist auch recht schön die Lösung beschrieben. Es wird in Excel eine Tabelle angelegt, in der mit einer Exponentialfunktion neue Werte berechnet werden. Diese Werteliste kann nun in Bascom importiert werden.
Was uns noch fehlt, ist eine Nachschlagefunktion in Bascom. Der Befehl hierzu heißt "Lookup", ein Beispiel:
1 2 3 4
neuer_Wert = Lookup (5, dta)
dta: Data 10 , 20 , 30 , 40 , 50 , 60 , 70
Ich beschreib mal die Befehlssyntax von hinten: - dta: wir müssen Bascom sagen, wo es die Werteliste findet. Dazu muß der Name einer Sprungmarke angegeben werden. Ich hab sie "dta" genannt. - 5: hier sagen wir, welcher Eintrag gesucht werden muß. Wir suchen den fünften in der Liste. - neuer_Wert: hierrein wird die Antwort der Funktion übergeben, in unserem Bsp. die 50
Ich hab das Beispiel aus BEK09 genommen und um die Lookup-Funktion erweitert. Ihr werdet sehen, daß es den Speicherplatz Wert ist. Die LED fadet viel schöner.
'*** Ein/Ausgänge deklarieren ************************************************** Config Portb.0 = Output 'PortB als Ausgang Led1_pin Alias Portb.0 'Ausgang PortB.0 heitßt ab jetzt "Led1"
'*** Variablen definieren ****************************************************** Dim Zaehler As Byte Dim Led1 As Byte 'Auflösung 0 - 49 Dim Timerzaehler As Byte 'Maximalwerte wie LED1 Dim Lookup_wert As Byte
Do 'Beginn Hauptschleife For Zaehler = 0 To 49 'in ca. 1sec aufdimmen Lookup_wert = Lookup(zaehler , Dta) Led1 = Lookup_wert 'hier wird der Schleifenwert der LED zugewiesen Waitms 20 Next Zaehler
Wait 1 '1sec halten
For Zaehler = 49 To 0 Step -1 'in ca. 1sec abdimmen Lookup_wert = Lookup(zaehler , Dta) 'aus Wertetabelle neuen Wert holen Led1 = Lookup_wert 'hier wird der Schleifenwert der LED zugewiesen Waitms 20 Next Zaehler
Wait 1 Loop 'Ende Hauptschleife
End
'*** Subs ********************************************************************** Timerroutine: 'Beginn Subroutine Timer0 = 205 Incr Timerzaehler If Timerzaehler = 50 Then Timerzaehler = 0 'Timerzaehler auf LED-Auflösung begrenzen If Timerzaehler < Led1 Then Led1_pin = 0 Else Led1_pin = 1 'Vergleich Timerzähler mit LED-Wert -> LED Ein- od. Ausschalten Return 'Ende Subroutine
Hallo Diezel, (Gerhard) ich habe mich hier im Forum angemeldet, weil viel über AVR Bascom berichtet wird. Warum endet der Bascom Kurs hier, ich glaub da gäbe es noch viel zu schreiben. Du beschreibst das wirklich gut und verständlich, würde mich freuen wenn du den Kurs weiterführen würdest, auch wenn es schon 5 jahre her ist. Ich bin zur Zeit Bascom am lernen, aber muss sagen, wenn man auf die 70 zugeht, fällt das nicht mehr so leicht. Eine Kleinigkeit ist mir aufgefallen, beim Lookup-Befehl wird bei 0 angefangen zu zählen. In deinem Beispiel würde 60 anstatt 50 eingelesen. Das aber nur am Rande. Meine Schiffsmodelle sind alle größer und passen halt nicht zum Mikro-Bereich, aber die Elektronik ist ja in vielen Themen gleich.
die letzte Aktivität von Gerhard war laut Profil 2015. Also schon einige Tage her. Keiner weiß, was mit ihm ist. Wir vermissen ihn schon länger hier im Forum.