Sie sind vermutlich noch nicht im Forum angemeldet - Klicken Sie hier um sich kostenlos anzumelden Impressum 
Sie können sich hier anmelden
Dieses Thema hat 2 Antworten
und wurde 2.638 mal aufgerufen
 Bascom - Unser Einsteigerkurs
diezel Offline



Beiträge: 709

09.04.2013 23:31
[BEK10] Lookup-Tabelle Zitat · antworten

Hallo,

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.


Gruß
Gerhard

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
$regfile = "m8def.dat"                                      'Mikrocontroller ist Atmega 8
$crystal = 8000000 'Arbeitsfrequenz 8 MHz
$hwstack = 40 'Hardware-Stack
$swstack = 32 'Software-Stack
$framesize = 60 'Frame
$baud = 19200 'serielle Übertragungsgeschwindigkeit
 
'*** 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
 
'*** Timer konfigurieren *******************************************************
Config Timer0 = Timer , Prescale = 64 'Timer konfigurieren
On Timer0 Timerroutine 'Timerinterrupt Subroutine zuweisen
Enable Timer0 'Timer aktivieren
Start Timer0 'Timer starten
Timer0 = 205 'Timer vorladen
 
Enable Interrupts 'Interrupt erlauben
 

'*** Hauptschleife *************************************************************
 

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
 
Dta:
Data 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3
Data 4 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 8 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15
Data 17 , 18 , 20 , 22 , 23 , 25 , 28 , 30 , 33 , 35 , 38 , 42 , 45 , 49,
 
 

-------------------------------------------------------------------------------------------
hier mein aktueller TinyKatalog

Dateianlage:
Aufgrund eingeschränkter Benutzerrechte werden nur die Namen der Dateianhänge angezeigt Jetzt anmelden!
bek10.bas.txt
ommes Offline



Beiträge: 1

10.03.2018 15:30
#2 RE: [BEK10] Lookup-Tabelle Zitat · antworten

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.

Viele Grüße Friedhelm

Sven Löffler Offline

Admin


Beiträge: 3.445

10.03.2018 16:40
#3 RE: [BEK10] Lookup-Tabelle Zitat · antworten

Hallo Friedhelm,

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.

 Sprung  

Xobor Forum Software von Xobor
Einfach ein eigenes Forum erstellen