Kommunikation mellan PICar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg av cyr »

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 :)
Pinkevin
Inlägg: 285
Blev medlem: 1 januari 2004, 12:44:10
Ort: Norrtälje

Inlägg av Pinkevin »

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:

Kod: Markera allt

btfsc	STATUS,Z
goto	k
sen finns bnz:

Kod: Markera allt

btfss	STATUS,Z
goto	k
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?
Skriv svar