“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)
Korte beschijving:
Je hebt 3 pinnen:
-Clock
-Data
-Strobe
Aansturen in pseudo-code:
Pak de 8bits (char oid) die je wil versturen
Zet de laatste (8e) bit op de data pin.
clock hoog en weer laag
Zet de 1 na laatste (7e) bit op data
clock hoog en weer laag
...
Zet de 1e bit op data
clock hoog/laag
strobe hoog/laag
De strobe zorgt ervoor dat je invoer op de uitgangen van het schuifregister geplaatst worden
Heb je 2 schuifregisters? geen probleem, begin dan bij bit 16 (nog steeds aan het einde 1x strobe doen)
Heb je er 20? ook geen probleem, begin bij bit 160...
Hoe je ze moet doorlussen staat gewoon in de datasheet, maar alleen de data lus je door, rest staat gewoon parralel.
je stuurt er serieel een signaal in, bijvoorbeeld: 10101010
dan moet dus poort 2,4,6,8 aan en poort 1,3,5,7 uit?
en die clock sluit je gewoon aan op je pic?
“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)
Beschrijving van SA007 is wel goedbart0l0meus schreef op vrijdag 28 september 2007 @ 15:53:
Het is voor mij nog niet compleet duidelijk
je stuurt er serieel een signaal in, bijvoorbeeld: 10101010
dan moet dus poort 2,4,6,8 aan en poort 1,3,5,7 uit?
en die clock sluit je gewoon aan op je pic?
Je hebt 3 pinnen op je PIC uC. 1 daarvan gebruik je als clock, 1 als data en 1 als enable (SA007 noemt het strobe).
Dit stelt de inhoud van het schuifregister voor:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [0][0][0][0][0][0][0][0] |
Je wilt de data 0101 0101 in het schuifregister zetten. Daarvoor zet je bit 7 op je data-uitgang. Vervolgens de clock 1x hoog en weer laag. Nu is de inhoud van je schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [1][0][0][0][0][0][0][0] |
Dit herhaal je, maar nu met bit 6. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [0][1][0][0][0][0][0][0] |
Dit herhaal je, maar nu met bit 5. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [1][0][1][0][0][0][0][0] |
Dit herhaal je, maar nu met bit 4. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [0][1][0][1][0][0][0][0] |
Dit herhaal je, maar nu met bit 3. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [1][0][1][0][1][0][0][0] |
Dit herhaal je, maar nu met bit 2. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [0][1][0][1][0][1][0][0] |
Dit herhaal je, maar nu met bit 1. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [1][0][1][0][1][0][1][0] |
Dit herhaal je, maar nu met bit 0. Inhoud van het schuifregister:
1
2
| bit: [0][1][2][3][4][5][6][7] data: [0][1][0][1][0][1][0][1] |
En zo heb je de data in je schuifregister zitten. Om het op de uitgang te krijgen moet je vervolgens de enable-uitgang (ingang op het schuifregister) hoog (of laag, staat in de datasheet
2 of meerdere schuifregisters kun je daisy-chainen. De clock en enable is voor elk schuifregister het zelfde. Op elk schuifregister zit een data-uit, die sluit je aan op de data-in van het volgende schuifregister. Zo kun je met 2 8-bit schuifregisters ineens 16bits er in klokken.
Het is denk ik wel verstandig om gebruik te maken van een timer, want als je 1 instructiecycles lang de clock hoog maakt, dan gaat dat waarschijnlijk te snel voor het schuifregister.
[ Voor 5% gewijzigd door M14 op 28-09-2007 19:02 ]
Mess with the best, Die like the rest
There is no such thing as Society
There are 2 kinds of people: Snipers and their targets
Never run for a sniper ... you only die tired :)
Dat is een kwestie van ff rekenen, de 595 kan dacht ik tot 1MHz aan, als je je PIC aan een kristal van 8 MHz hangt gaat het gewoon goed (klok laag maken, kijken of je een '1' of '0' moet uitsturen, uitsturen, byte eentje opschuiven, klok weer hoog maken, tellertje eentje verhogen, kijken of je klaar bent met verzenden (tellertje = 7), terug herbeginnen) is 8 instructies met instructieklok van 2 MHz, dus stuur je aan 250 kHz.M14 schreef op vrijdag 28 september 2007 @ 18:29:
[...]Het is denk ik wel verstandig om gebruik te maken van een timer, want als je 1 instructiecycles lang de clock hoog maakt, dan gaat dat waarschijnlijk te snel voor het schuifregister.
Als de boer zijn koeien kust, zijn ze jarig wees gerust. Varkens op een landingsbaan, leiden nooit een lang bestaan. Als de boer zich met stront wast, zijn zijn hersens aangetast. Als het hooi is in de schuur, zit het wijf bij den gebuur.
Zit wat in, maar een timer heeft meer voordelen. Als je tijdens de interrupt de data vanuit een variabele in het schuifregister zet, kun je in de main de uC andere dingen laten doen, zonder verder naar het schuifregister om te kijken. Het enige waar je rekening mee moet houden is dat je niet de byte in de main gaat aanpassen, terwijl ie halverwege is met die zelfde byte in het schuifregister te zetten. Maar dat is allemaal wel af te vangen.naftebakje schreef op vrijdag 28 september 2007 @ 19:23:
[...]
Dat is een kwestie van ff rekenen, de 595 kan dacht ik tot 1MHz aan, als je je PIC aan een kristal van 8 MHz hangt gaat het gewoon goed (klok laag maken, kijken of je een '1' of '0' moet uitsturen, uitsturen, byte eentje opschuiven, klok weer hoog maken, tellertje eentje verhogen, kijken of je klaar bent met verzenden (tellertje = 7), terug herbeginnen) is 8 instructies met instructieklok van 2 MHz, dus stuur je aan 250 kHz.
Mess with the best, Die like the rest
There is no such thing as Society
There are 2 kinds of people: Snipers and their targets
Never run for a sniper ... you only die tired :)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| main
movlw b'00001000'
call schuifregister1
;-------------------------------------------------------------
schuifregister1
movwf Var1 ; zet de waarde vanuit w in Var1. dit is het getal wat geklokt moet worden
movlw D'8' ;zet de waarde 8 in het werkregister
movwf bits1 ;sla de waarde 8 uit w op in bits1 dis is het aantal bits wat ingeklokt moet worden
loop1
rlf Var1,1 ;rotate left trough carry en sla het resultaat op in Var1. Eerste bit zit nu in de carry
btfss STATUS, C ; lees de carry uit. Is carry= 1?
bcf data1 ;zo nee, zet de datalijn naar 0
btfsc STATUS, C ; is carry 0?
bsf data1 ;zo nee data is 1
bsf klok1
nop
bcf klok1 ;bitje is nu ingeklokt
decfsz bits1,f ;verlaag bits1 met één totdat die nul is
goto loop1 ; is bits1 0? dan "return" zo nee ga naar loop1
return |
“If Your Only Tool Is a Hammer Then Every Problem Looks Like a Nail” (Abraham Maslow)