mrmike skrev:jämför w med databyte, hoppa om samma:
Kod: Markera allt
subwf databyte
bz databyte_och_w_är_sammalika ;om databyte-w = 0 hoppa till...
bz k(branch on zero) gör ungefär så här:
sen finns bnz:
Ska jag byta ut k'et mot vart jag vill att den ska goto'a till sen?
cyr skrev:Pinkevin skrev:
Har inte databladet till hands nu, så jag är inte hundra på vad delay'en gör, men är det ungefär såhär (pseudo kod)?
Kod: Markera allt
delay:
Set w = 10
Set delaycounter = w
dlywait:
If delaycounter != 0 Then
Goto dlywait
Else
Return
Förutom att delaycounter räknas ner också, så stämmer det bra... (decfsz = decrement file, skip if zero)
Annars hade det ju varit oändligt delay, kanske inte så bra

Ja, självklart ska det vara ett
delaycounter = delaycounter - 1
efter
If delaycounter != 0 Then
Jag har knåpat ihop en kodsnutt nu, som jag hoppas funkar relativt bra.
Kod: Markera allt
LIST p=16F628 ;tell assembler what chip we are using
include "P16F628.inc" ;include the defaults for the chip
__config 0x3D18 ;sets the configuration settings (oscillator type etc.)
;end of defines
org 0x0000 ;org sets the origin, 0x0000 for the 16F628,
;this is where the program starts running
movlw 0x07
movwf CMCON ;turn comparators off (make it like a 16F84)
bsf STATUS, RP0 ;select bank 1
movlw b'11110000' ;set PortA 4 inputs, 4 outputs
movwf TRISA
bcf STATUS, RP0 ;select bank 0
clrf PORTB ;set all outputs low
Loop:
btfss PORTB, 7
call Switch1
btfss PORTB, 6
call Switch2
btfss PORTB, 5
call Switch3
goto Loop
Switch1:
movlw b'00000001'
movwf databyte
call sendserial
Switch2
movlw b'00000011'
movwf databyte
call sendserial
Switch3
movlw b'00000111'
movwf databyte
call sendserial
delay:
movlw 10
movwf delaycounter
dlywait:
decfsz delaycounter
goto dlywait
return
Sendserial:
; loopa 8 ggr (8 bitar)
movlw 8
movwf counter
sendloop:
; "kopiera" en bit från databyte till pinnen
bcf PORTB, 1
btfsc databyte, 0
bsf PORTB, 1
; shifta databyte ett steg
rrf databyte, f
; dra klockpinnen hög
bsf PORTB, 0
; vänta lite så mottagaren hinner med
call delay
; dra klockpinnen låg
bcf PORTB, 0
call delay
; loopa...
decfsz counter
goto sendloop
return
end
Denna biten måste ändras så att det är PORTB som den ställer in in-/utgångar på.
Kod: Markera allt
bsf STATUS, RP0 ;select bank 1
movlw b'11110000' ;set PortA 4 inputs, 4 outputs
movwf TRISA
bcf STATUS, RP0 ;select bank 0
clrf PORTB ;set all outputs low
Även __config 0x3D18 behövs ändras så att det blir rätt config (intern OSC och /MCLR)
Vad mer behövs ändras?