-
Hi Danke!
Nach 2 Bits wird in R17 pinb eingelesen, deshalb wird es auf input umgestellt.
Dann brauch ich die temporäre Variable garnicht? COOL!
Da das Programm auf die hardware geschrieben ist, kann ich den Sinulator nicht verwenden... :( ...
VLG Tobi
-
Hi!
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
Das ist jetzt mein Code, aber der liefert nur Datenmüll......
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... :D
VLG Tobi
-
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.
-
"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.
-
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... :D
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
-
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