Problem med skiftregister

Övriga diskussioner relaterade till komponenter. Exempelvis radiorör, A/D, kontaktdon eller sensorer.
Bola
Inlägg: 133
Blev medlem: 16 november 2009, 10:28:41
Ort: Göteborg

Problem med skiftregister

Inlägg av Bola »

Hej!

Jag tänkte testa mig på att styra ett skiftregiester med hjälp av min pic16f690 vilket jag inte tyckte verka så svårt. Får dock inget på utportarna som jag hoppades på. Det blir 0v om man mäter mellan utpinnarna och jord.
Skiftregistret är: 73-689-07

Denna kod använder jag:

Kod: Markera allt

#include <p16F690.inc>
 __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
#define Delay1 0x20
#define Delay2 0x21 

Start:
     bsf        STATUS,RP0       ; select Register Page 1
     CLRF 	 TRISB			  ; make all IO Pin B an output
     bcf        STATUS,RP0       ; back to Register Page 0
     CLRF 	 PORTB			  ; Clearar PORTB samt 8:a reg.
	
     MOVWF   PORTB
     call         Delay          ; delay

     MOVLW	  B'11110000'		  ;clear hög, klocka hög, a och b höga 
     MOVWF   PORTB
     call         Delay          ; delay

     goto    $               ; LOOP

     

; Delay Function.  Enter with number 771uS delays in Wreg
Delay     
     movwf     Delay2         ;
DelayLoop:
     decfsz    Delay1,f       ; Waste time.  
     goto      DelayLoop      ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
     decfsz    Delay2,f       ; The outer loop takes and additional 3 instructions per lap * 256 loops
     goto      DelayLoop      ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
                              ; call it a two-tenths of a second.
     return

     end
Klockan är kopplad till RB6, clear till RB7 och a och b är kopplade till RB5. Delayen är på 0,197 sekunder villket borde räcka som jag förstått det om jag läsa databladet för skiftregistret rätt. Jag funderar dock på om man kan klocka på detta sättet, men det borde väl inte vara några problem? den skiftar när clear är hög och när man går från låg till hög (0v till +5v) på klockpinnen vilket jag gör eller?
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Problem med skiftregister

Inlägg av Icecap »

Åh, var ska vi börja...

Kod: Markera allt

#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
#define Delay1 0x20
#define Delay2 0x21

#define CLOCK PORTB,6
#define CLEAR PORTB,7
#define DATA  PORTB,5

Start:
     banksel  TRISB           ; Välj bank på detta sätt, det är idiotsäkert
     CLRF     TRISB           ; make all IO Pin B an output
     banksel  PORTB
     CLRF     PORTB           ; Clearar PORTB samt 8:a reg.
     BSF      CLEAR           ; Stop resetting
     bsf      DATA            ; Set data to '1'
     
     nop
     bsf CLOCK ; Now shake clock some times to actually shift out the datas into the register
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK
     nop
     bsf CLOCK
     nop
     bcf CLOCK

EndLoop:
     goto    EndLoop          ; LOOP - the idiotproof way!

     end
Lite förklaring: för att få ut data måste du faktisk klocka ut data med ett antal klock. För att fylla upp alla 8 bit måste du skicka 8 klockpulser och inte 0 som ditt program gjorde.
Skriv svar