sorry, grad nicht viel Zeit...
erstmal ein Bild (das ist aber erstmal nur die Idee - Dein Speicher ist ja in Wirklichkeit eindimensional strukturiert. Initial zeigt Dein "Such-Zeiger" auf den root-Knoten. Wenn ein Zeichen empfangen wurde, vergleichst Du dieses mit den Kind-Knoten (des aktuell indizierten Knotens). Findest Du kein solches Kind, setzt Du ein "Ignore-Flag" für den Rest diese Telegrammes, findest Du ein passendes Kind, setzt Du den "Such-Zeiger" auf die dessen Adresse. Ein Sonderfall liegt bei gesetztem Ignore-Flag vor - da wird einfach nichts weiter gemacht. Ein anderer, wenn das neue Zeichen ein gültiger CRC war. Dafür sollte die Empfangs-ISR ein "CRC-OK-Flag" setzen. In dem Fall wird nicht weiter gesucht, sondern der entsprechende NEC-Code gesendet (da kommen noch einige Feinheiten).
erstmal das Bild:
Im Prinzip durchläuft man den Baum als Suchbaum im "level order" - allerdings mit etwas weniger Gehopse...
Jeder (von den Gelben) Knoten (inklusive Wurzel) kennt die Zahl seiner Kinder, deren jeweilige Werte, und die Adresse im Speicher (wo der entsprechende Teilbaum weitergeht). Die Wurzel beginnt also in Adresse 0x00 im Eeprom, dort ist dann abgelegt:
Code:
0x03 ;Anzahl der Kinder=3
0x50 ;erstes Kind
{lb_0x50} ;Adresse davon
0x3F ;zweites Kind
{lb_0x3F} ;Adresse davon
0x00 ;drittes Kind
{lb_0x00} ;Adresse davon
...
lb_0x50: ;Label für root->50
0x01 ;Anzahl der Kinder von root->50 (hier 1)
...
in der untersten (gelben) Ebene ist das dann anders - hier wird die Gültigkeit ja durch den CRC festgestellt - ein eigentliches Kind gibt es nicht. Dort steht eigentlich die Adresse des NEC-Codes. Nunja ... die Adresse ist ein Byte - der NEC-Code ist ein Byte... dann kan man ja auch gleich dort den NEC-Code hinsetzen. Also zB:
Code:
...
;Label
lb_0x50_0x04_0x68_0x32:
0x02 ;Anzahl der Kinder von root->50->04->68->32 (=2)
0x11 ;erstes Kind
NECByte ;entsprechendes Byte
0x10 ;zweites Kind
NECByte ;entsprechendes (anderes) Byte
...
Nach einem verarbeiteten empfangenem Zeichen zeigt der "Such-Zeiger" je dahin, wo eigentlich die Adresse des gefundenen Knotens steht, also hier im Falle der "11" auf die Zelle, in der das entsprechende NECByte steht.
Wurde also ein Zeichen empfange (Neues Zeichen im Puffer), und ist dann das "CRC-OK-Flag" gesetzt, ist kein weiterer Vergleich nötig. es muß dann einfach das Byte aus dem Eeprom geladen werden, auf das derzeit der "Such-Zeiger" zeigt. Dieses Byte ist dann an "sendnec" zu übergeben.
Das Zurücksetzen des "Such-Zeigers" erfolgt beim Timerüberlauf (="Neues-Telegramm-Detektion"), dort ist auch das "Ignore_Flag" zu löschen, und der Bytezähler der Empfangs-ISR zu reinitialisieren... alles neu halt...
Ist jetzt aber alles erstmal nur so zusammengeschrieben -> da muß sicher noch etwas mehr Hirnschmalz rein...
Edit:
Unter ASM gilt:
mit der Direktive ".ESEG" landet der folgende "Code" im Eeprom
wenn dann ein ".org 0x00" folgt, landet der folgende "Code" dann in Eeprom-Register 0x00?
Mit ".db Bytekonstante" kann ich jetzt alle Bytes eintragen (also einzeln bzw durch Kommata getrennt auch mehrere).
Kann man da auch label verwenden? Oder muß man das dann selbst zu Fuß ausrechnen?
(hmm...mal das Studio starten...)
P.S.: Das konzept ist von der Speicherbelegung her noch optimierbar, was Knoten mit nur einem Kind betrifft - allerdings erhöht das den Aufwand im "Such-Algorythmus"...