Heeeeeeey mensen,

Ik ben nu al een tijdje aan het oefenen met schuifregisters maar op de een of andere manier wil het mij nog niet lukken. Hier is de (zelfgeschreven) code. Kan iemand zie of ik een of andere domme fout maak?


main

;	          76543210
	movlw	b'00000001'		;1e bit hoog
	call	klok
	movlw	b'00000001'		;2e bit hoog
	call	klok
	movlw	b'00000000'		;3e bit laag
	call	klok
	movlw	b'00000000'		;4e bit laag
	call	klok
	movlw	b'00000000'		;5e bit laag
	call	klok
	movlw	b'00000000'		;6e bit laag
	call	klok
	movlw	b'00000001'		;7e bit hoog
	call	klok
	movlw	b'00000001'		;8e bit hoog
	call	klok
	call	latch
	goto	main

;sub routines
klok
	movlw	b'00000000'		;alles uit
	call 	outputwait
	movlw	b'00000010'		;klok de bit
	call	outputwait
	return
latch
	movlw	b'00000100'		;pin 12 hoog dus resultaat zou te zien moeten zijn
	call	outputwait
	call	klok	
outputwait
	movwf	PORTB	
	call	delay_100ms	; wacht 0,1 sec
	return
	
; Delay routines

delay_100ms
	movlw	D'1'
	goto	delay	

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
        goto	delay2
	decfsz	cntr3, f
        goto	delay1
	return
        END

Als hardware heb ik gewoon de 16f628a op een nette 5 volt aangesloten. Ook de onstoorcondensator van 100n heb ik tussen pin 5 en 14 gezet. Verder hangt de MCLR(pin 4) via 10k aan de plus(hier stond eerst typefout).

Pin 6(portb.0) van de pic hangt aan pin 14(serial data input) van de 595
pin 7(portb.1) van de pic hangt aan pin 11(shift register clock input)van de 595
pin 8(portb.2) van pic hangt aan pin 12(storage register clock input)

verder hangt de 595 ook aan dezelfde nette 5 volt:P

handige aplet om een schuifregister te snappen

http://home.scarlet.be/~tb091759/shiftreg.htm

Kortom wat doe ik fout? Voor zover ik het begrijp zet ik netjes een bit klaar. Klok die in door pin 11 hoog te maken. Dit doe ik 8 keer. Dan maak ik pin 12 hoog en dan weer pin 11.

Wat zie ik toch over het hoofd? :S

Je stuurt een waarde naar het w register.
Daarna roep je klok en wat doet deze?
Deze overschrijft het w register zonder dat je het in portb hebt gezet.

Je gebrukt alle bits van portb elke keer opnieuw.

Je kan beter bit voor bit gebruiken en niet het hele portb register.

outputwait
	movwf	PORTB	
	call	delay_100ms	; wacht 0,1 sec
	return

met movwf PORTB. Zet ik toch de waarde van het werkregister in PORTB? Dat is toch gewoon goed. Wat ik wel met je eens ben is dat dit niet heel erg efficient is:P

grtz Bas

EDIT ow w8 ik zie al wat je bedoeld :P ik ga het aanpassen en dan weer testen;)

[Bericht gewijzigd door basz op ]

Eh nee kijk nog eens goed


movlw	b'00000001'		;1e bit hoog
	call	klok
...

;sub routines
klok
*** Zie hier
--->	movlw	b'00000000'		;alles uit
	call 	outputwait
	movlw	b'00000010'		;klok de bit
	call	outputwait
	return

zo alles aangepast en weer een code gemaakt die zou moeten werken. Maar helaas het werkt niet............

main
	bsf		PORTB,0			;1e bit hoog
	call	klok
	bsf		PORTB,0			;2e bit hoog
	call	klok
	bcf		PORTB,0			;3e bit laag
	call	klok
	bcf		PORTB,0			;4e bit laag
	call	klok
	bcf		PORTB,0			;5e bit laag
	call	klok
	bcf		PORTB,0			;6e bit laag
	call	klok
	bsf		PORTB,0			;7e bit hoog
	call	klok
	bsf		PORTB,0			;8e bit hoog
	call	klok	
	call	latch
	call	klok
	goto	main

;sub routines
klok
	bsf		PORTB,1			;klok de bit(pin b,1 hoog)	
	movlw	b'00000000'		;alles uit
	movwf	PORTB
	return
latch
	bsf		PORTB,2			;pin 12 hoog dus resultaat zou te zien moeten zijn	
	call	klok	

    END

ik heb trouwens de delay routine eruit gelaten. Dit zou wel moeten kunnen ofniet? De pic werkt op het interne kristal van 4 mhz

 
bsf           PORTB,0			;1e bit hoog
...

PORTB blijft zo 0 of heb ik het mis?

mijns inziens blijft jouw schuifregister zo 0 schuiven en zal je dus geen (merkbaar) resultaat zien.

[Bericht gewijzigd door Electroprutser op ]

PORTB,0 geeft aan bij welke uitgang de instructie bsf uitgevoerd moet worden. en dat bsf zorgt er nu juist voor dat PORTB,0 hoog wordt;)

grtz Bas

Een kijkje in de datasheet:

BSF Bit Set f
Syntax: label BSF f,b
Operands: 0 <= f <= 127
0 <= b <= 7
Operation: 1 -> (f<b> )
Status Affected: None
Encoding: 01 01bb bfff ffff
Description: Bit 'b' in register 'f' is set.
Words: 1
Cycles: 1
Example BSF REG1, 7
Before Instruction
REG1 = 0x0A
After Instruction
REG1 = 0x8A



bsf  PORTB,b'00000001'  ; lijkt me te doen wat jij wil

gezien jouw eerdere code...

Dan nog de volgende vragen:
Staat PortB goed ingesteld.
Dus TRISB als uitgangen?
Is de 74HC595 goed aangesloten?
Wordt de 74HC595 goed aangestuurd?

EDIT:
Klopt niet Electroprutser.

bsf portb,0

is gelijk aan

movlw xxxxxxx1
movwf portb

x = inhoud die al in portb stond

[Bericht gewijzigd door Willie Worteltje op ]

er zit ook een handige logic analyzer in mplab 7.40 +

je zou daar eerst kunnen kijken als je datasheet timing table erbij pakt moet dat te volgen zijn ( beter gezegd je moet percies het zelfde zien als je goed heb al zal je in mplab dit zien:


mplab
data _| |__| |_  
clk  __| |__| |_
datasheet
d__/ \__
c __/  \__

meestal zet ik ook de special funtion registers enzo aan om te kijken of de poorten geset worden etc

zo hoef je niet steeds heen en weer met je pic terwijl je niet weet of je code al werkt

p.s er zijn macro's op het web te vinden waar je veel van kan leren ( je word zoizo gedwongen over te typen :D )
geloof dat mikroelectronica een picbook online heeft staan
.heb zo geen directe link voor je ,

maar mocht je het niet kunnen googlen kijk ik morgen op des betrefende pc oid

zelf uitvogelen leer je natuurlijk ook veel van , en meschien kom je er met de eerder genoemde functies zelf al uit
neem niet weg dat het handig kan zijn om die macro te bekijken .

suc6

Op 10 oktober 2006 22:26:59 schreef Willie Worteltje:
Dan nog de volgende vragen:
Staat PortB goed ingesteld.
Dus TRISB als uitgangen?
Is de 74HC595 goed aangesloten?
Wordt de 74HC595 goed aangestuurd?

EDIT:
Klopt niet Electroprutser.

bsf portb,0

is gelijk aan

movlw xxxxxxx1
movwf portb

x = inhoud die al in portb stond

Whoops! dan moet ik toch maar weer een beetje ASM gaan opfrissen. Heb er al een tijdje niets meer mee gedaan. Maar wil nu weer gaan beginnen.

Bij mij loopt nu Basic, C en ASM een beetje door elkaar geloof ik. (Ben denk ik met iets teveel verschillende projecten bezig.)

Op 10 oktober 2006 20:30:21 schreef basz:
Verder hangt de MCLR(pin 4) via 10k aan de min.

Als MCLR werkelijk aan GND hangt zal er inderdaad niet veel gebeuren in je PIC (continue reset).
MCLR moet aan +5V hangen!

CD :)

de mclr hangt via 10K aan de plus neit aan de min. Dit was een typefoutje.
@sould3mon zou jij meer uitleg kunnen geven over die macro's? En liefst ook ff de site weer opzoeken. Ik denk dat ik dan wel in staat ben uit te zoeken wat o wat er toch fout zit in mijn code:p

grtz Bas

Op 10 oktober 2006 22:26:59 schreef Willie Worteltje:
Dan nog de volgende vragen:
Staat PortB goed ingesteld.
Dus TRISB als uitgangen?
Is de 74HC595 goed aangesloten?
Wordt de 74HC595 goed aangestuurd?

port B staat goed ingesteld. Trisb ook. 74HC595 is ook goed aangesloten. En tja dan blijft de aansturing over als probleem........

ff opgezocht
http://www.mikroe.com/en/books/picbook/7_07chapter.htm

hiermee moet je het zelf kunnen (wel naar beneden scrollen boven aan staat namelijk de 597 als eerste ;)

he bedankt ik ga het allemaal doorleze. Jullie horen wel van me of het nu wel werkt.

grtz Bas
---------------------------------------
Edit: Ik kijk naar die site van jou he zie het schema staan en ontdek dat ik een enorme fout heb gemaakt! Ik ben vergeten de reset van de 595 op de plus aan te sluiten :O. Na het aansluiten van de reset op de plus werkt alles prima:D :P
mijn eigen code dan. die macro ga ik later vanavond wel probere eerst uit eten:P
bedankt hè!

[Bericht gewijzigd door basz op ]

nog een tip: NOOIT bcf/bsf of andere read-modify-write instructies gebruiken op poort registers. Google rad-modify-write problem.

Dit probleem omzeil ik door een NOPje tussen beide bitbang instructies te plaatsen.
Voorbeeldje van hoe ik het doe voor een Allegro A6812 VFD driver/shift register:


TABLE3
	ADDWF   PCL,F	; Jump to data, table is terminated with 'FE'
	DT	0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x7F,0xFF	; 0,1,2,3,4,5,6,7,8,9,-,DP,SP

TABLE3_END
	RETLW   0xFE
	
; Check to ensure table doesn't cross a page boundary
	IF ( (TABLE3 & 0xFE) >= (TABLE3_END & 0xFE) )
       MESSG   "Warning - User Defined: TABLE3 crosses page boundary in computed jump"
	ENDIF

#define	SRDAT	PORTB,0
#define	SRCLK	PORTB,1
#define	SRLAT	PORTB,2

SENDDATA	; Output segment data to A6812
	MOVF	DIG,W 		        ; Recall digit number (1 to 9)
	ADDLW	H'4F'   	        ; Point at register to display (D1 to D9)
	MOVWF	FSR     	        ; Use as pointer
	MOVF	INDF,W  	        ; Get value of register pointed to into W
	
		; Get bit patterns for ASCII characters 
	MOVWF   OFFSET	  		; OFFSET holds start of table address
	PAGESEL (TABLE3)		; Select Program Memory Page of table
	CALL    TABLE3			; Retrieve character
	MOVWF	VAR			; Store into VAR

	MOVLW	D'8'			; Transfer 8 bits
	MOVWF	VAR1			; Initialize counter

LOOP_2
	RLF	VAR,F			; Rotate VAR one place to the left through Carry
	BTFSS	STATUS,C		; Carry=1?
	BCF	SRDAT			; If not, set SRDAT to 0
	BTFSC	STATUS,C		; Carry=0?
	BSF	SRDAT			; If not, set SRDAT to 1

	BSF	SRCLK			; Generate one clock
	NOP
	BCF	SRCLK			; 
	
	DECFSZ	VAR1,F			; Eight bits have been sent?
	GOTO	LOOP_2			; If not, repeat

LATCH		; Latch all data to A6812 outputs
	BSF	SRLAT			; All bits have been sent, latch shift registers
	NOP				; to output latches
	BCF	SRLAT			; 

Werkt perfect.

CD :)

[Bericht gewijzigd door Turbokeu op ]

Hallo,

ben zelf ook bezig geweest om een 74hc595 aan te sluiten op de 16f628,is gelukt,maar als er 2 74HC595 aangesloten zijn moetje dan:

MOVLW D'8' ; Transfer 8 bits

veranderen in 16 of werkt dat zo niet?

Vermits we hier met 8-bits microcontrollers werken kan je maximum 8 bits in één keer verzenden.
Je kan wel je 16 bits in twee 8-bits variabelen plaatsen en deze 2 variabelen via je shiftroutine na elkaar doorsturen.
In mijn bovenstaande routine moet je dan gewoon de juiste waarde in VAR plaatsen en de shiftroutine twee maal aanroepen.

CD :)

Op 15 oktober 2006 10:27:17 schreef Turbokeu:
Dit probleem omzeil ik door een NOPje tussen beide bitbang instructies te plaatsen.
(snip)
Werkt perfect.

Dat is *geen* goede oplossing. Dat je programma werkt is een nodig maar niet voldoende argument. Ik ben gisteren zonder links of rechts te kijken de straat over gestoken, en ik leef nog. Links en rechts kijken is dus niet nodig?

In mijn (ons) bovenstaand geval is het Read-Modify-Write probleem eigenlijk zelfs niet van toepassing vermits er enkel naar de poort geschreven wordt.

Het probleem is wel van toepassing indien de poort zowel inputs als outputs bevat, èn er geschreven en gelezen wordt (zie Microchip's 'PICmicro MID-RANGE MCU FAMILY' documentatie, hoofdstuk 9.10).

Quote
The use of NOP instructions between the subsequent PORTx read-modify-write instructions, is a
lower cost solution, but has the issue that the number of NOP instructions is dependent on the
effective capacitance C and the frequency of the device.
/Quote

In het slechtste geval (hogere klokfrekwenties) stop je dan 1 of 2 NOPjes méér.

CD :)

Op 15 oktober 2006 12:20:35 schreef Turbokeu:
In mijn (ons) bovenstaand geval is het Read-Modify-Write probleem eigenlijk zelfs niet van toepassing vermits er enkel naar de poort geschreven wordt.

Je weet dat BCF en BSF read-modify-write instructions zijn?

Jawel, maar vermits de poort niet expliciet (ik bedoel door de software) uitgelezen wordt heeft dit niet echt belang meer (en werkt het niet, stop dan een NOPje meer).

Eén NOP bij 4MHz voldoet in al mijn gevallen, bij hogere klokfrekwenties (10, 20MHz) zet je op de limiet maar twee of drie NOPs zodat de read-after-write operatie na de latch naar de poortuitgangen toch correct uitgevoerd wordt (voor de software maken deze extra NOPs toch geen merkbaar verschil).

CD :)

Op 15 oktober 2006 18:29:54 schreef Turbokeu:
Jawel, maar vermits de poort niet expliciet (ik bedoel door de software) uitgelezen wordt heeft dit niet echt belang

Een BCF/BSF lees de poort eerst uit. Dat dit impliciet is doet daar niets aan af.

Op 15 oktober 2006 18:29:54 schreef Turbokeu:
Eén NOP bij 4MHz voldoet in al mijn gevallen

Die je tot nu toe gezien hebt. Met de huidige layout van je schakeling. Met de huisige die-revision van de chip. Bij de huidige stand van de maan. etc.

Op 15 oktober 2006 18:29:54 schreef Turbokeu:
CD :)

Als je daar mee bedoeld: bewezen, klaar! zie dan mijn tegenargument over het oversteken van een straat.