PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zu LOOKUPSTR()



molleonair
19.02.2006, 20:23
Hallo ..

gibt es eine möglichkeit die lookupstr funktion mit eeprom daten zu nutzen ?

Gruß Daniel

PicNick
20.02.2006, 06:25
Lookup /down() ist speziell für Flash gemacht.
Im SRAM und ERAM gibt's ja eigentlich keine (Bascom) Möglichkeit, solche String-Ketten zu erzeugen.
Aber es gibt einige Varianten, so ein Problem zu lösen.
Was konkret soll's denn werden ?

molleonair
20.02.2006, 17:29
also ich wollte um flash zu sparen ,menue punkte im eeprom speichern
mit der $eeprom und data anweisung kann ich ja string ketten als .eep
in den eeprom schreiben
um dann die entsprechenden untermenuepunkte zu suchen hät ich dann lookupstr genutzt

also in etwa
data "u00 ",hauptmenu1","u01","hauptmenue2","u02","hauptmenu3","u03"
data "u01 ", "untermenue1.1","untermenue1.2"
data "u02 ","untermenue2.1","u17","untermenue3.1","u18"
dabei ist zb u01 in der ersten zeile die sprungadresse wo er von dort aus hin soll da adiere ich n leerzeichen und suche nach nem string der dann
also "u01 " ist und bin dann im entsprechenden untermenue
dieUxx am anfang ist also die startadresse für eine menueebene die zahl dahinter der zeiger zu nächsten unterebene

ich hoffe du verstehst was ich meine gruß daniel

PicNick
20.02.2006, 18:11
Der Lookupstr() hantelt sich über die String-terminatoren (&H00) von einem String zum nächsten und zählt dabei mit. Dabei geht's von 0 weg (index für den ersten string)
Du mußt wohl mit "READEEPROM var, adresse" arbeiten und dir so eine Lookupstr() funktion selber machen.
Frage: Normalerweise hat man ja wenig SRAM, noch weniger ERAM aber massig FLash. Bist du sicher, du willst die strings im ERAM ablegen ?

molleonair
20.02.2006, 18:17
naja ich hab nen tiny und ne menge code da ist jeder platz zu nutzen

hrei
20.02.2006, 18:45
Hallo,

da gebe ich Robert völlig recht. Zu solchen Kunstgriffen greife ich nur bei extrem großen Projekten mit viel, viel Text auf 40x4 Displays. Dann verwende ich aber auch nicht das interne EEprom des AVR, sondern ein externes 64k I2C-EEprom, das gesondert mit den Texten beschrieben wird. Dabei überlege ich mir vorher eine für das Projekt geeignete "Formatierung" des EEprom und rufe die Texte dann mit einer Sub ab, der nur ein Pointer auf den gewünschten Text/Bildschirminhalt übergeben wird.

Wenn ich das richtig verstanden habe, möchtest Du vor allem ein Menue haben, das den jeweiligen Menuepunkt anzeigt und auf Knofdruck in die entsprechende Routine verzweigt. Dafür füge ich mal ein Beispiel ein, das mit 3 Tastern auskommt und sich natürlich beliebig modifizieren lässt:



'Gerüst für Atmega 8 mit Menue - HR - AUGUST 2005

$regfile = "m8def.dat"
$crystal = 7372800
$baud = 9600


Enable Interrupts 'Interrupts erlauben

Config Adc = Single , Prescaler = Auto

Config Pinc.0 = Input 'Für analog_key
Keyboard Alias Pinc.0 'Aliasname

Config Pinb.0 = 1 'Ausgang
Beep Alias Pinb.0

Declare Function Analog_key() As Byte

Dim Taste As Byte
Dim Menue_current As Byte
'-------------------------------------------------------------------------------

Sound Beep , 400 , 450 'Bin wach -)
Cursor Off
Lcd " Menue Test"
Wait 3
'-------------------------------------------------------------------------------

Cls
Menue:
Menue_current = 1

Menue_1:

Taste = Analog_key()
Waitms 100

If Taste = 32 Then
Menue_current = Menue_current + 1
End If

If Taste = 33 Then
Menue_current = Menue_current - 1
End If

If Menue_current > 6 Then Menue_current = 1
If Menue_current < 1 Then Menue_current = 6

If Taste = 10 Then Goto Execute
'-------------------------------------------------------------------------------
Select Case Menue_current 'aktuelle Auswahl anzeigen

Case 1
Locate 1 , 1
Lcd " Fall 1 "
Case 2
Locate 1 , 1
Lcd " Fall 2 "
Case 3
Locate 1 , 1
Lcd " Fall 3 "
Case 4
Locate 1 , 1
Lcd " Fall 4 "
Case 5
Locate 1 , 1
Lcd " Fall 5 "
Case 6
Locate 1 , 1
Lcd " Fall 6 "

End Select
Taste = 255
Goto Menue_1
'-------------------------------------------------------------------------------

Execute: 'aktuellen Menuepunkt ausführen


Select Case Menue_current
Case 1
Cls
'Call 1
Cls
Case 2
Cls
'Call 2
Cls
Case 3
Cls
'Call 3
Cls
Case 4
Cls
'Call 4
Cls
Case 5
Cls
'Call 5
Cls
Case 6
Cls
'Call 6
Cls
End Select

Goto Menue_1
'-------------------------------------------------------------------------------

End 'Hauptprogrammschleife Ende

'------------------------------------------------------------------------------
'Diese Unterfunktion fragt die Tastatur am analogen Port ab.
'Die Werte müssten ggf. natürlich angepasst werden und entsprechen hier
'meinem Schaltungsvorschlag.

Function Analog_key() As Byte
Local Ws As Word
Analog_key = 255
Start Adc
Ws = Getadc(0)
If Ws < 900 Then
Select Case Ws
Case 0 To 100
Analog_key = 32 'Entspricht UP
Case 400 To 600
Analog_key = 33 'Entspricht DOWN
Case 650 To 750
Analog_key = 10 'Entspricht ENTER
End Select
Sound Beep , 400 , 450 'Quittungspiepser
End If
Waitms 100
End Function
'-------------------------------------------------------------------------------
'
'
'.... Hier folgen die durch das Menue aufgerufenen Subroutinen bzw. Funktionen


Grüße
Henrik

hrei
20.02.2006, 18:48
naja ich hab nen tiny und ne menge code da ist jeder platz zu nutzen

Ach so, sag das doch gleich. Die Tinys sind aber (bis auf den Tiny45 mit Einschränkungen) so gut wie überhaupt nicht für solche Scherze geeignet.

Henrik

molleonair
20.02.2006, 19:46
hallo henrik solch einen code hab ich schon getestet und für viel zu uneffizient befunden

ich hab ein 4 zeilen display und wenn ich das menue durchblätter
zB die menuepunkte

Hauptmenue
Setup
--Tests--
Akkuspannung

Hauptmenue
Tests
--Akkuspannung--
Senoren

Hauptmenue
Akkuspannung
--Sensoren--
EIN/AUS
...

das ist 4 zeilen menue nach unten geblättert
wenn ich in einen eintrag nach rechts blätter komm ich ins entsprechende untermenue (wie bei den alten nokia handys)

dann muß ich für jeden eintrag den vorhergehenden und folgenden und das obermenue dazu anzeigen das heißt ich geb für jeden menuepunkt
4 zeilen strings im code ein die ich ausgebe obwohl ich nur jeden string einmal festlegen muß

ich wollte halt ein weg finden mit wenig code ein komplexes menue zu erzeugen

dazu erschien mir die srungmarkensache erfolgversprechend

ich werde jetzt versuchen mit readeeprom zu lesen und in den sprungmarken die entsprechende eepromadresse zu hinterlassen

PicNick
20.02.2006, 20:28
Du kannst etwas sparen, indem du die Strings in teile teilst und sozusagen durch token ansprichst. Bascom hat die nette Eigenschaft, identische String nur einmal anzulegen, also wenn du das wort "menue" extra hast, kommt es nur einmal im Flash vor.
LCD "Haupt"; "menue"
LCD "Unter"; "menue"
speichert er "menue" nur einmal

Was du dir bei Strings im ERAM ersparst, pulverst du in den Code für den Privat-Lookup.
Ein Kampf ist es aber nunmal
ein kleines Gulasch wird nicht größer (sagt man bei uns)

molleonair
20.02.2006, 21:06
naja da kannst du schon recht haben...

ich hoffe halt eine menuestruktur zu entwickeln die dann beliebig ausbaubar
ist ,einfach halt noch n menueeintrag am ende der datazeile anzuhängen und das wars .
wäre vieleicht für andere auch interesant,da einfach zubearbeiten mit wenig getippe ,am besten ne menue.lib bauen *lol
aber da bin ich mit meinen anfängerwissen noch weit entfernt
mal schauen was bei rumkommt aber danke für den tip mit dem stringteilen

hrei
21.02.2006, 20:20
naja da kannst du schon recht haben...

ich hoffe halt eine menuestruktur zu entwickeln die dann beliebig ausbaubar
ist ,einfach halt noch n menueeintrag am ende der datazeile anzuhängen und das wars .

Nun lerne doch erst mal ein paar Grundlagen, bevor Du die Allgemeinheit beglückst O:) .

Glaube mir, Du versuchst etwas komplett aussichtsloses mit einem Tiny (welcher denn überhaupt?).

Bei den üblichen Tinys hast Du zwischen 64 und 128 Byte EEprom. Maximal sparst Du also 128 Byte im Flash.

Bei folgendem Code verbrätst Du aber schon 126 Byte durch die Sub und einen einmaligen Aufruf derselben für das Einesen eines Strings aus dem EEprom. Dabei ist die notwendige Pointermimik etc. noch überhaupt nicht berücksichtigt. Statt einzusparen verschwendest Du also Flash.


Dim Display_string As String * 16
Dim Chr_byte As Byte
Dim I As Byte

Gosub Getstring

Getstring:
Display_string = ""
For I = 0 To 16
Readeeprom Chr_byte , I
Display_string = Display_string + Chr(chr_byte)
Next I
Return

End

So etwas lohnt sich nur, wie oben bereits geschrieben, bei viel, viel Text und entsprechend großem EEprom und selbstverständlich bei einem der Aufgabe angemessen 'großen' Prozessor. Ein Tiny gehört nicht dazu :-(.

Henrik

molleonair
21.02.2006, 21:57
naja das mit dem tiny hab ich verworfen

habs menü jetzt doch im flash rom mit data zeilen
ist aber noch nicht ganz fertig
wird wohl so eine art universalmenu
Einträge können in den Datazeilen beliebig dazugeschrieben werden
und neue untermenus kreiert werden
es muß bloß für jede menueebene am anfang der data zeile eine herkunftsnummer eingetragen werden dann mit das proggi weiß wies zurück geht

meld mich wenn ich fertig bin