-
Hi,
ich habe noch was.
Wie setzte ich das um.
Das geht doch mit
in R16, PIND ; lies den Eingang von Port D
oder?
Aber wie geht das dann das .gl_bit gesetzt wird und die anderen Port's nicht überschrieben werden?
Code:
Gl_inp Alias Pina 'LCD data input
Gl_tris Alias Ddra 'LCD data redirection
Dim Gl_bit As Byte
Dim Gl_rstflag As Byte
Dim Gl_pix As Byte
Gl_tris = &B00000000 'Port input
Gl_read = Gl_inp 'laden
Gl_tris = &B11111111 'port output
If Gl_rstflag = 0 Then
Set Gl_read.gl_bit
Else
Reset Gl_read.gl_bit
End If
Gl_pix = Gl_read
end
-
da gl_bit eine BitNUMMER von 0 - 7 ist, du aber für das setzen eine BitMASKE brauchst, musst du letztere erstmal durch links-shiften eines 1-ers (gl_bit mal) konstruieren. dann kannst du mit OR setzen.
oder Maske invertieren und mit AND löschen
ein Beispiel für das konvertieren findest du bei
http://www.rn-wissen.de/index.php/Ba...e-Code#PULSEIN
-
Code:
$asm
.equ Gl_tris_asm = Ddra
$end Asm
lds R20,{Gl_bit}
!cbi Gl_tris_asm, 3 '; löscht das Bit 3 in DDRA
Das geht so.
Aber ich kann jetzt nicht die 3 durch die R20 ersetzen.
-
Code:
LDS r24 , {Gl_bit}
L_0x00F6:
LDI r25,0x01 ' 1-er laden
AND r24,r24 ' gl_bit = 0 ?
BREQ L_0x0104 ' dann fertig
CLC ' clear carry
L_0x00FE:
ROL r25 ' rot left
DEC r24 ' bit-nr - 1
BRNE L_0x00FE ' fertig ?
L_0x0104:
'-------------------------------------------------------------------------
LDS r23, {gl_read }
OR r23, r24 ' bit setzen
'-------------------------------------------------------------------------
COM r24 ' invertieren
AND r23, r24 ' bit löschen
'-------------------------------------------------------------------------
STS { Gl_pix } , r23
-
Hi,
danke.
Ich habe es mal eingebaut, aber es geht nicht.
Code:
'-----------------------------
$asm
LDS r24, {Gl_bit}
L_0x00f6:
LDI r25,0x01 ' 1-er laden
!AND r24,r24 ' gl_bit = 0 ?
BREQ L_0x0104 ' dann fertig
CLC ' clear carry
L_0x00fe:
ROL r25 ' rot left
DEC r24 ' bit-nr - 1
BRNE L_0x00FE ' fertig ?
L_0x0104:
LDS r23, {gl_read}
COM r24 ' invertieren
$end Asm
If Gl_rstflag = 1 Then
!OR r23, r24 ' bit setzen
Else
!AND r23, r24 ' bit löschen
End If
!STS {Gl_pix}, r23
'-----------------------------------------------------
Was mache ich falsch.
-
Code:
LDS r23, {gl_read}
$end Asm
If Gl_rstflag = 1 Then
!OR r23, r24 ' bit setzen
Else
COM r24 ' invertieren
!AND r23, r24 ' bit löschen
End If
!STS {Gl_pix}, r23
-
Hi,
sorry, aber es will nicht.
Code:
'-----------------------------
Gl_read = Gl_inp 'PIND 'Assign data
Gl_tris = &B11111111 'port output
$asm
LDS r24, {Gl_bit}
L_10x00f6:
LDI r25,0x01 ' 1-er laden
!AND r24,r24 ' gl_bit = 0 ?
BREQ L_10x0104 ' dann fertig
CLC ' clear carry
L_10x00fe:
ROL r25 ' rot left
DEC r24 ' bit-nr - 1
BRNE L_10x00FE ' fertig ?
L_10x0104:
LDS r23, {gl_read}
$end Asm
If Gl_rstflag = 1 Then
!OR r23, r24 ' bit setzen
Else
COM r24 ' invertieren
!AND r23, r24 ' bit löschen
End If
!STS {Gl_pix}, r23
'-------------------------------
-
sry, waren fehler drin.
das hier jedenfalls hab ich getestet, das tut, wie es soll.
Code:
Gl_rstflag = 1 ' zum testen
Gl_bit = 3 ' zum testen
$asm
LDS r24, {Gl_bit}
L_10x00f6:
ldi r25, &H01
!AND r24,r24 ' gl_bit = 0 ?
BREQ L_10x0104 ' dann fertig
CLC ' clear carry
L_10x00fe:
ROL r25 ' rot left
DEC r24 ' bit-nr - 1
BRNE L_10x00FE ' fertig ?
L_10x0104:
LDS r23, {gl_read}
$end Asm
If Gl_rstflag = 1 Then
!OR r23, r25 ' bit setzen
Else
COM r25 ' invertieren
!AND r23, r25 ' bit löschen
End If
!STS {Gl_pix}, r23
Anm: sowas wie "ldi r25, 0x01" ignoriert Bascom ohne meldung
muss aber heissen (Bascom-Style)
"ldi r25, &H01"
-
Hi,
also sorry, es geht nicht.
Komisch es werden keine Linien angezeigt.
So wie jetzt geht es, sobald ich Bascom Code überspringe geht es nicht.
Code:
'----------------------------------
!sbi Glcd_controll,Gl_a0_asm 'CD high
'Gl_dat = Sys_mread
!lds R20, {Sys_mread_asm}
!out Gl_dat_asm, R20
!cbi Glcd_controll,Gl_wr_asm 'WR low
! nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!cbi Glcd_controll,Gl_a0_asm 'CMD low
'! nop
'Gl_tris = &B00000000 'Port input 'Make portd input
clr R20 '&B00000000'
!out Gl_tris_asm,R20
!sbi Glcd_controll,Gl_a0_asm 'Set A0 high
!cbi Glcd_controll,Gl_rd_asm 'RD low
ser R20 '&B11111111
! nop
! nop
! nop
! nop
! nop
'Gl_read = Gl_inp 'PIND 'Assign data
in R18,Gl_inp_asm
sts {Gl_read} , R18
!sbi Glcd_controll,Gl_rd_asm 'RD high
! nop
!cbi Glcd_controll,Gl_a0_asm 'CD low high
'Gl_tris = &B11111111 'port output
!out Gl_tris_asm, R20
'--------------------------------
If Gl_rstflag = 0 Then
Set Gl_read.gl_bit
Else
Reset Gl_read.gl_bit
End If
Gl_pix = Gl_read
Goto Jumptestasm
'-----------------------------
$asm
LDS r24, {Gl_bit}
L_10x00f6:
LDI r25, &H01 ' 1-er laden
!AND r24, r24 ' gl_bit = 0 ?
BREQ L_10x0104 ' dann fertig
CLC ' clear carry
L_10x00fe:
ROL r25 ' rot left
DEC r24 ' bit-nr - 1
BRNE L_10x00FE ' fertig ?
L_10x0104:
LDs R23, {gl_read}
$end Asm
If Gl_rstflag = 1 Then
!OR r23, r24 ' bit setzen
Else
COM r24 ' invertieren
!AND r23, r24 ' bit löschen
End If
!STS {Gl_pix}, r23
'-------------------------------
Jumptestasm:
!sbi Glcd_controll,Gl_a0_asm 'CD high
!lds R20, {Sys_cur_addr_asm}
!out Gl_dat_asm, R20
'Gl_dat = Sys_cur_addr 'CSRW cmd
!cbi Glcd_controll,Gl_wr_asm 'WR low
! Nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!cbi Glcd_controll,Gl_a0_asm 'CMD low
! nop
!lds R20, {Gl_addrlo}
!out Gl_dat_asm, R20
'Gl_dat = Gl_addrlo
!cbi Glcd_controll,Gl_wr_asm 'WR low
! nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!lds R20, {Gl_addrhi}
!out Gl_dat_asm, R20
'Gl_dat = Gl_addrhi
!cbi Glcd_controll,Gl_wr_asm 'WR low
! nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!sbi Glcd_controll,Gl_a0_asm 'CD high
!lds R20, {Sys_mwrite_asm}
!out Gl_dat_asm, R20
'Gl_dat = Sys_mwrite
!cbi Glcd_controll,Gl_wr_asm 'WR low
! nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!cbi Glcd_controll,Gl_a0_asm 'CMD low
!lds R20, {Gl_pix}
!out Gl_dat_asm, R20
'Gl_dat = Gl_pix
!cbi Glcd_controll,Gl_wr_asm 'WR low
! nop
!sbi Glcd_controll,Gl_wr_asm 'WR high
!lds R20, {Gl_rstflag}
clr R20
'Gl_rstflag = 0