Werbung
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hi!
Das ist jetzt mein Code, aber der liefert nur Datenmüll......Code:Function Readbus() 'Den Wert vom Bus lesen Ddrb = &B00000000 'Alles Eingänge Ddrc = &B11111100 'Umschaltung, dass es keine Crashes gibt. $asm in R17, pinc CBR R16, 0b00000001 SBRC R17, 1 SBR R16, 0b00000001 CBR R16, 0b00000010 SBRC R17,0 SBR R16, 0b00000010 in R17, pinb ;<-- HIER wird auf Pinb umgeschaltet! CBR R16, 0b00000100 SBRC R17, 5 SBR R16, 0b00000100 CBR R16, 0b00001000 SBRC R17, 4 SBR R16, 0b00001000 CBR R16, 0b00010000 SBRC R17, 3 SBR R16, 0b00010000 CBR R16, 0b00100000 SBRC R17, 2 SBR R16, 0b00100000 CBR R16, 0b01000000 SBRC R17, 1 SBR R16, 0b01000000 CBR R16, 0b10000000 SBRC R17, 0 SBR R16, 0b10000000 Loadadr Readbus , X st X, r16 $end Asm End Function
Was geht da schief?!
Die Bits in der Maske werden schon so gezählt, gell:
0b76543210
und NICHT
0b01234567
,gell??
Naja, das würde bei meinem Monsterprogramm nochmal 0,8 Sec einspahrung bringen, wenn man das in ASM codet...![]()
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hallo Tobi,
das mit dem PinB einlesen habe ich übersehen.
Die Bit-Zählweise ist so wie Du beschrieben hast &B76543210
Wenn ich das richtig sehe werden in dem Ablauf alle Bits des r16 gelöscht.
Das kannst zu Beginn mit clr r16 machen und Du brauchst nicht 8 mal cbr r16,x.
Überprüf mal ob Du wirklich folgende Umsetzung von den Pins in das r16 vorgesehen hast?
pinc.1 -> r16.0
pinc.0 -> r16.1
pinb.5 -> r16.2
pinb.4 -> r16.3
pinb.3 -> r16.4
pinb.2 -> r16.5
pinb.1 -> r16.6
pinb.0 -> r16.7
Ich hab mal irgendwo gelesen (kann Dir aber jetzt nicht sagen wo das war), dass man nicht sofort nach einer Änderung an einem Port von dort Werte einlesen kann. Wird auf ein Port geschrieben, in Deinem Fall auf das DDRB und DDRC so kommt die Änderung mit Beginn des nächsten CPU-Takts (=ASM-Befehl) zum Tragen. Wird von einem Pin eingelesen, wird der Zustand vom Ende des vorhergehenden CPU-Takt ausgewertet. Es könnte also sein, dass Du auf ein
Ddrc = &B11111100
nicht sofort im nächsten Befehl mit
in r17, PinC
fortsetzen kannst.
Mit
ddrc = &B11111100
ddrb = &B00000000
clr r16
in r17, pinc
bekommst Du zwischen dem C-Port setzen und Einlesen schon mal 3 CPU-Takte.
Ich hoffe ich konnte Dir weiterhelfen.
Viele Grüße
Josef
-------------------------------------------------------------------------------------
DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel
"ldi r16,&b00000000"
werden die bytes nicht so geschrieben in bascom: &b00001111
denkt dran: &b..........
mfg pebisoft
Hallo Tobi,
Du musst &B00000001 anstatt 0B00000001 verwenden.
0B....... wird immer zu 0 übersetzt.
cbr r16,0b00000001 wird daher zu
cbr r16,&B00000000 und damit nirgends das Bit gelöscht.
Viele Grüße
Josef
-------------------------------------------------------------------------------------
DOS-File System für BASCOM-AVR auf http://members.aon.at/voegel
ihr müsst ruhiger werden und nicht so hudeln.
den text gaaaaaanz.... laaaaangsam... durchlesen.
wenn ihr mal in winavr-c proggen tut, müsst ihr noch besser aufpassen.
mfg pebisoft
HI!
ASO!
Ich dachte, weil das ASM ist muss man die ASM-Schreibweise verwenden...![]()
Dann haben wir den Übeltäter ja auch schon. Werd ich gleich mal testen.
CLR R16... das ist sehr praktisch! Das ist ja dann noch schneller! *freu*
@pebi: Mit dem Unterschied, dass die Maske in C warscheinlich richtig gewesen wäre...
Ich teste...
VLG Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Hi!
Also! ES FUNKTIONIERT!
Die Busfunktionen (pebisoft, wenn du willst bekommst du sie, sind viel schneller als die alten!!)
Mein 1243 Zeilen langer Code (wer hat jetzt auch geschrieben, man würde in nen MEGA32 nichts hineinbringen?? Und ich verwende einen M8...) läuft mit der ASM-Routine 1,4 Sekunden schneller!!!
VLG
Tobi
http://www.tobias-schlegel.de
"An AVR can solve (almost) every problem" - ts
Lesezeichen