basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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? 
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
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.
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
outputwait
movwf PORTB
call delay_100ms ; wacht 0,1 sec
returnmet 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
ik ga het aanpassen en dan weer testen;)
[Bericht gewijzigd door basz op ]
Electroprutser
Recente projecten: ASURO-Robot, K8048
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
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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
ENDik heb trouwens de delay routine eruit gelaten. Dit zou wel moeten kunnen ofniet? De pic werkt op het interne kristal van 4 mhz
Electroprutser
Recente projecten: ASURO-Robot, K8048
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 ]
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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
Electroprutser
Recente projecten: ASURO-Robot, K8048
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...
Willie Worteltje
Er zijn 10 soorten mensen. Mensen die binair begrijpen en mensen die het niet begrijpen... http://home.versatel.nl/edithenwilliam/william.htm
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
)
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
Electroprutser
Recente projecten: ASURO-Robot, K8048
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 portbx = 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.)
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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 
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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 
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
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
. Na het aansluiten van de reset op de plus werkt alles prima:D 
mijn eigen code dan. die macro ga ik later vanavond wel probere eerst uit eten:P
bedankt hè!
[Bericht gewijzigd door basz op ]
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
nog een tip: NOOIT bcf/bsf of andere read-modify-write instructies gebruiken op poort registers. Google rad-modify-write problem.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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?
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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 
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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?
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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 
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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?
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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 
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
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.
Als je daar mee bedoeld: bewezen, klaar! zie dan mijn tegenargument over het oversteken van een straat.