PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche in großer Tabelle....



Import-Script
17.10.2003, 20:47
Tag zusammen, <BR> <BR>als ziehmlicher Programmier-St&uuml;mper komme ich gerade in meinem Projekt an meine Grenzen. <BR>Ich versuche mich an einer digitalen Z&uuml;ndung f&uuml;rs Motorrad. <BR>Grobe Funktion: Ein Timer zählt „Counts“ während einer Motorumdrehung. Die Werte der Timer-Register &#40;also 2 Byte&#41; werden in R0 und R1 umgeladen. <BR>Damit soll dann aus einer 1KB grossen Tabelle der Wert ermittelt werden, der dem Timer-Stand am nächsten kommt. <BR>Mein Problem: Die Such-Funktion bekomme ich nicht so hin, da ich das Datenpointer register &uuml;ber den Accu nur maximal um 255 manipulieren kann und damit nicht meine 1024 Adressen umfassende Tabelle abdecken kann. <BR>Fang ich an &uuml;ber DPH und DPL zu gehen, verliere ich schnell den &uuml;berblick...&#40;so ist das als St&uuml;mper...&#41;. <BR>Hat jemand eine Gute Idee oder kann mir sagen, wie so etwas &uuml;blicherweise gelöst wird? <BR> <BR>Ich freue mich &uuml;ber jeden Tipp! <BR> <BR>Danke, <BR>Stefan

Import-Script
17.10.2003, 21:10
Was f&uuml;r einen Controller verwendest du? <BR>Beim AVR kannst du zB. die X Y und Z Registerpaare f&uuml;r 16bittiges verwenden. <BR> <BR>LDI ZL, LOW&#40;Startadresse&#41; <BR>LDI ZH, HIGH&#40;Startsdresse&#41; <BR> <BR>Wenn du einfach nur inkrementieren/dekrementieren willst, dann geht das mit <BR> <BR>ADIW ZL, &#60;zahl&#62; <BR>SBIW ZL, &#60;zahl&#62; <BR> <BR>Gruss, Malte

Import-Script
17.10.2003, 21:57
hi Malte,hi Stefan, <BR> <BR>es geht natuerlich um den &#39;51er. <BR> <BR>wenn der pointer nur 255 kann was eigentlich normal ist, dann bleibt eigentlich nur die loesung mit mehreren tabellen à 255. mir faellt nichts besseres ein. <BR> <BR>gute tabellenselektion <BR>ed

Import-Script
17.10.2003, 22:15
hi Malte, hi ed, <BR> <BR>aaalso es ist ein 51er, um genau zu sein ein Atmel AT89C4051 &#40;dachte, der wäre gut, weil klein &amp; billig&#41;. Inzwischen träume ich von einem 16bitter.... <BR>Das mit den mehreren Tabellen ging mir gestern auch schon mal durch den Kopf, hatte ich aber gleich wieder verworfen. <BR>Die Tabelle wird von einem VisualBasic Prog. erzeugt und in den ´51 Quelltext eingef&uuml;gt, dass ich letztes jahr zwischen Weihnachten und Neujahr zusammengenagelt habe. VB kann ich noch schlechter als 8051 Assembler :o&#41; <BR>Oder ich lass den Luxus sausen und zersäge die Tabelle mit Excel in 4 St&uuml;cke. <BR> <BR>Vielen Dank auf alle Fälle <BR>&#40;wenn Euch noch was einfällt- immer her damit&#41; <BR> <BR>Gruss, stefan

Import-Script
18.10.2003, 02:22
habs zwar nicht getestet, aber so m&uuml;sste es doch gehen ! <BR> <BR>Gr&uuml;essli <BR>Thedy <BR>. <BR>. <BR>. <BR>MOV DPTR, #Tabelle <BR>MOV A, DPH <BR>ADD A, R0 ; Higher Byte <BR>MOV DPH, A <BR>MOV A, R1 ; Lower Byte <BR>MOVC A, @A&#43;DPTR <BR>. <BR>. <BR>. <BR>. <BR>. <BR> <BR> <BR>Tabelle: <BR> <BR> DB 01H, 03H, 09H, A0H ; ...... <BR> DB 00H, 05H, 00H <BR> DB 00H, 00H, 00H <BR> DB 00H, 00H, 00H <BR> DB 00H, 00H, 00H <BR> DB 00H, 00H, 00H <BR> <BR> <BR>

Import-Script
18.10.2003, 12:51
Ne, ein 16-Bitter muß da noch lange nicht her. <BR> <BR>Thedys Lösung ist genau richtig. <BR> <BR> <BR>Peter <BR>

Import-Script
20.10.2003, 12:41
Hi Thedyg, Peter <BR> <BR>kann man das f&uuml;r Anfänger noch einmal näher erklären? <BR>Mit den DB Datenfäldern und daraus Daten auslesen hatte ich das noch nicht so. <BR>Bitte weit ausholen &#40;wenn&#39;s nichts ausmacht&#41;. <BR> <BR>MfG <BR>Carlos

Import-Script
20.10.2003, 22:11
mit DB kannst du direkt Daten an der ensprechenden Position ins Programm einlinken. Dies brauchst du z.B. f&uuml;r Texte &#40;bei AUsgabe auf LCD-Displays&#41;, Codetabellen oder wie hier eine Wertedatenbank. <BR> <BR>Tabelle: enspricht der Adresse, wo in diesem Beispiel diese Daten beginnen. <BR> <BR>Das heisst, in dieser speziellen Anwendung kann Stefan seine 1024 Zahlen als 1-Byte Werte aus seiner Tabelle ablegen so dass sie dann f&uuml;r den MOVC Befehl zur Verf&uuml;gung stehen. <BR> <BR>Einigermassen klar ? <BR> <BR>Gr&uuml;essli <BR>Thedy <BR>

Import-Script
20.10.2003, 23:09
ich probiers mal, soweit meine Assemblerkenntnisse reichen... <BR> <BR>Das Programm beginnt irgendwo mit ORG XYZ, sagen wir auf Adresse 500 nur mal so. <BR>Tabelle: ist ein Label. Der Assembler berechnet nun die folgenden Mov.. und Add Befehle, also der erste MOV z.B. 3 Byte lang &#40;MOV-Opcode &#43; 2 Byte Operand&#41;, der 2. z.B. 2 Byte&#40;Mov-Opcode &#43; 1 Byte Registerangabe&#41; usw. Also irgendwie kommt der Assembler an die Stelle wo Tabelle: steht und hat errechnet, das sei Adresse 527, also 27 Byte vom ORG entfernt bedingt durch die vorangegangenen Befehle. <BR> <BR>MOV DPTR, #Tabelle <BR> <BR>f&uuml;r Tabelle w&uuml;rde also jetzt 527 als Wert stehen. <BR>Wäre der ORG des Programms 200 w&uuml;rde hier 227 eingesetzt werden. Wie gesagt, der Assembler errechnet das während des Assemblierens. <BR> <BR>MOV A, DPH <BR>ADD A, R0 ; Higher Byte <BR> <BR>DPH ist jetzt DPH &#43; R0; d&uuml;rfte klar sein, einfache Addition. <BR>Jetzt mal angenommen, der 700ste Wert der Tabelle wäre gefragt; 700 sind 02BC &#40;hex&#41; also 02 im HighByte=R0, BC im LowByte=R1 <BR>Akku ist jetzt also DPH &#43; 02 <BR> <BR>MOV DPH, A <BR> <BR>den Wert wieder in DPH zur&uuml;cklegen. <BR> <BR>MOV A, R1 ; Lower Byte <BR> <BR>jetzt die BC in den Akku, also das LowByte <BR> <BR>MOVC A, @A&#43;DPTR <BR> <BR>und jetzt den Inhalt der Speicherzelle, DPTR&#43;DPH&#42;256&#43;Akku in den Akku laden. <BR> <BR>DPTR war 527, DPH&#42;16&#43;Akku gibt 700, haben wir ja vorher dto. zerpfl&uuml;ckt, also den Inhalt der Speicherzelle 1227 in den Akku laden, den 700sten Tabelleneintrag also. <BR> <BR>. <BR>. <BR>. <BR>. <BR> <BR> <BR>Tabelle: <BR> <BR>DB 01H, 03H, 09H, A0H ; ...... <BR>DB 00H, 05H, 00H <BR>DB 00H, 00H, 00H <BR>DB 00H, 00H, 00H <BR>DB 00H, 00H, 00H <BR>DB 00H, 00H, 00H <BR> <BR>und hier steht irgendwo an 700ster Stelle, also nach dem 700sten DB xy ein Wert und dieser wird in den Akku geladen und dann wird mit dem weitergerechnet; irgendwie. <BR>Der @&#40;at&#41; Operator lädt also den Wert der in der Speicherzelle &#34;&#40;at&#41;XYZ&#34; drinsteht, wie das Wort &#34;at&#34; recht treffend aussagt... <BR> <BR>Jetzt kommt Mord und Zedere seitens der 80xxer Gemeinde, weil ein 68000 Fritz sowas versucht hat zu erklären; aber es kehrt auch wieder Ruhe ein, dessen bin ich mir sicher. Prinzipiell bieten alle CPUs derartiges, also einen 16Bit Zeiger Hi und Lo, der auf eine Speicherzelle im gesamten Adressraum zeigt, deren Inhalt man lesen will. <BR>Beim 68000 heisst der Befehl LEA &#40;load effektive Adresse&#41;. <BR>also <BR>LEA Tabelle,A4 <BR>w&uuml;rde A4 mit 527 besetzen, eben dem Tabellenanfang <BR>MOVE 700&#40;A4&#41;,D0 <BR>w&uuml;rde dann den Wert der Speicherzelle 700&#43;527 nach D0 moven. Achtung beim 68xxx oder generell bei den Motorolas ist die Schreibweise Move Wert von nach, im gegensatz zu den 80ern, da heisst es load irgendwas mit Wert, also genau andersrum. <BR>Reine Gewöhnungssache, und das splitten in Hi und Lo wie im obigen Beispiel entfällt weil es ein 32 Bit Rechner ist, also <BR>LEA #20000h, A0 <BR>MOVE #10000&#40;A0&#41;,D0 ist kein Problem, aber da hat Peter und Thedy schon Recht, dazu BRAUCHT´s keinen 32Bitter, das geht auch mit 8 Bittern, dann muss man eben in Hi Lo splitten, daf&uuml;r gibt´s da auch extra einen DPH DatenPointerHi.<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>

Import-Script
21.10.2003, 18:17
Hiho, <BR> <BR>suuper, hier kommt ja doch ´ne Lösung zustande! <BR>Eine Frage jedoch: wenn beim Addieren des DPL mit Accu es zu einem &uuml;berlauf kommt, ja was dann? <BR>&#40;Wie gesagt, St&uuml;mper!&#41; <BR>Brauche ich dann nur das Carry-Bit zum DPH hinzurechen? <BR> <BR>Vielleicht so?: <BR> &#40;Thedys Quelltext, nur DPL zuerst?&#41; <BR> <BR>MOV DPTR, #Tabelle <BR>MOV A, DPL <BR>ADD A, R0 ; lower Byte <BR>MOV DPL, A <BR>jnc MARKE <BR>inc dph <BR>MARKE: <BR>MOV A, R1 ; higher Byte <BR>MOVC A, @A&#43;DPTR <BR> <BR>kann das was werden oder habe ich was &uuml;bersehen? <BR>Gruss, <BR>Stefan <BR>

Import-Script
21.10.2003, 18:17
Hiho, <BR> <BR>suuper, hier kommt ja doch ´ne Lösung zustande! <BR>Eine Frage jedoch: wenn beim Addieren des DPL mit Accu es zu einem &uuml;berlauf kommt, ja was dann? <BR>&#40;Wie gesagt, St&uuml;mper!&#41; <BR>Brauche ich dann nur das Carry-Bit zum DPH hinzurechen? <BR> <BR>Vielleicht so?: <BR> &#40;Thedys Quelltext, nur DPL zuerst?&#41; <BR> <BR>MOV DPTR, #Tabelle <BR>MOV A, DPL <BR>ADD A, R0 ; lower Byte <BR>MOV DPL, A <BR>jnc MARKE <BR>inc dph <BR>MARKE: <BR>MOV A, R1 ; higher Byte <BR>MOVC A, @A&#43;DPTR <BR> <BR>kann das was werden oder habe ich was &uuml;bersehen? <BR>Gruss, <BR>Stefan <BR>

Import-Script
21.10.2003, 19:15
jetzt muss ich mich leider ausklinken, weil ich nicht weiss, ob dieses Register &uuml;berhaupt &uuml;berlaufen kann oder einen Carry akzeptiert. Das ist kein &#34;normales&#34; Register, ich war schon drauf und dran zu fragen, was das soll von wegen &#34;add&#34; zu was unbekanntem dazu; weil initialisiert wurde es ja nirgends. Das hat aber wohl mit der kruschigen Speicheraufteilung zu tun, so von wegen Programm / Daten / intern / extern usw. und das ist wohl irgendwie vorbesetzt oder muss es sein. <BR>Die 68000er hanben nur &#34;Speicher&#34; - in der Regel intern, d.h. mit auf der Platine verbaut oder halt im Chip drin, also letztenendes im Computer drin, und der nimmt sowohl Daten als auch Code gleichermassen auf, weil aus FlipFlops bestehend, die nur High und Low werden, also auf Bitmuster gucken, und nicht noch nachsehen woher diese stammen??? - komische Teile, genau wie die PCs mit IN und Out, letztenendes ist das ein Move to oder from MEMORY; w&uuml;sste nicht, dass ein Latch auf einer I/O Karte was anderes wäre als ein 8Bit&#42;1 Memory... <BR> <BR>Na ja, Hauptsache es hat wem gefallen und ich hab nicht gleich eins auf den Deckel bekommen f&uuml;r meine Ausf&uuml;hrungen. <img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>; ist halt doch irgendwie bei allen Computern ähnlich.

Import-Script
21.10.2003, 23:13
Stefan, <BR> <BR>Du addierst nur das High-Byte und da sollte es keinen Überlauf geben, da nur 64kB Adreßraum. <BR> <BR>Das Low-Byte addiert dann der &#34;MOVC A,@A&#43;DPTR&#34; richtig 16 Bittig. <BR> <BR> <BR>Peter <BR>

Import-Script
23.10.2003, 16:08
HI, <BR>und den Tabellenanfang setzt du in sicherer Entfernung hinter dein eigentliches Programm im Speicherbereich! <BR>Z.B. geht dein Prog bis 018Fh, dann machst du die Tabelle auf 0200h

Import-Script
23.10.2003, 16:33
und das mit &#34;dahinter&#34; nimmt Dir halt der Assembler ab indem du es einfach &#34;physisch&#34; dahinter schreibst, dann kennt er ja alle Befehle vorher. <BR>also: <BR>mov... <BR>mov... <BR>add... <BR>bis alles fertig ist... <BR>und dazu braucht´s keinen sicheren Abstand, der Assembler weiss das aufs Byte genau!!!<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR>TABELLE: <BR>db... <BR>db... <BR>END.

Import-Script
23.10.2003, 17:18
&#34;...sicherer Entfernung...&#34; <BR> <BR>Erinnert mich an meine fr&uuml;here Z80-Zeit. Flash war noch nicht erfunden und ich hatte kein EPROM-Löschgerät zu Hause. <BR> <BR>Da hab ich hinter jeder Funktion ein paar Bytes freigelassen. War sie fehlerhaft, habe ich sie &uuml;bergeNOPt und in den freien Bereich einen Jump zum richtigen Code gebrannt. <BR> <BR>Aber heutzutage ist jeder Abstand &#62;=0 vollkommen ausreichend. <BR> <BR> <BR>Peter <BR>