basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
Heeeeeeey,
Ik heb weer eens ruzie met de 74hc595. Ik heb alles als volgt aangesloten:
leds op de pinnen 1tm7 en 15
pin 8(GND0 en pin 13(OE) aan de min
pin 16 en pin 10(MR) aan de plus
pin 14(DS) aan pin 6(PB.0) van mijn pic(16f628a)
pin 11(SH_CP) aan pin 7(PB.1) van de pic
pin 12(ST_CP) aan pin 12(PB.6) van de pic
en mijn code( in ASM) doet het volgende:
Pin 14 laag.
pin 11 hoog
alles laag
Pin 14 hoog
pin 11 hoog
alles laag
dit verhaalte 4 keer zodat ik in totaal 8 bits heb ingeklokt
dan pin 12(latch) hoog
; Assign your microcontroller
LIST P=16F628
; This include file makes programming more understandble
include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
; free 16F628 RAM starts at 0x20(depends on type microcontroller)
CBLOCK 0x20
cntr1
ENDC
;some define's to make things easier
;These are for Bank Switching
#define BANK0 bcf STATUS,RP0 ; RAM PAGE 0
#define BANK1 bsf STATUS,RP0 ; RAM PAGE 1
;startadres of the controller
org 0x0000
; For using A0-A3 as digital I/O
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
; Reset Port values
clrf PORTA
clrf PORTB
; define your pin direction (input/output)
BANK1 ; Switch to bank 1
movlw b'11111111' ;
movwf TRISA ; PORTA = all inputs
movlw b'00000000' ;
movwf TRISB ; PORTB = all outputs
BANK0 ; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
;eerste schuifregister vullen
bcf PORTB,0
call klok1
bsf PORTB,0
call klok1
bcf PORTB,0
call klok1
bsf PORTB,0
call klok1
bcf PORTB,0
call klok1
bsf PORTB,0
call klok1
bcf PORTB,0
call klok1
bsf PORTB,0
call klok1
call latch
goto main
;sub routines
klok1
bsf PORTB,1 ;klok de bit(pin b,1 hoog)
movlw b'00000000' ;alles uit
movwf PORTB
return
latch
bsf PORTB,6 ;pin 12 hoog dus resultaat zou te zien moeten zijn
return
ENDDit alles zou goed moeten zijn als je het mij vraagt? Iemand een idee wat ik fout doe? De mclr pin van mijn pic hangt via een 10k aan de plus en ik heb een condensator van 100n tussen de plus en de min van de pic zitten
wie weet waar mijn fout zit?
grtz Bas
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Een 74HC595 stuur je idd. aan door de data-ingang hoog of laag te maken, een opgaande flank op de seriële klokingang te zetten, en --na dit 8 maal herhaald te hebben-- een opgaande flank op de paralelle klokingang te plaatsen.
Nu ken ik geen snars van PIC-assembler, maar het komt me voor dat je programma niets anders doet dan nullen inklokken. Als die op de uitgangen verschijnen, zou ik zeggen dat alles OK is. 't Is natuurlijk wel moeilijk na te gaan wat er mis kan zijn, omdat je vergat te melden wat er wél aan de uitgangen verschijnt... 
latch
bsf PORTB,6 ;pin 12 hoog dus resultaat zou te zien moeten zijn
return
je laat je latch aanstaan tot na de volgende klok als je alweer niewe data wil beginnen
bsf PORTB,6 ;pin 12 hoog dus resultaat zou te zien moeten zijn
nop ;korte pauze na de latch
bcf PORTB,6 ;latch uitzetten
return
zoiets meschien ?
@ pro hij zet met bitsetfile
portb,0
(maakt 1 ) dus hij verwacht 11111111 < ik moet beter lezen hij verwacht iets van 01010 * sould3mon denk dat ie met leds aan het spelen gaat ^_^
ooh midden in een klok data wissen is ook niet netjes !!!
zet die buiten een klok puls maak die klok aleen ff bsf > nop > bcf return en doe op het eind na de latch die clear pas !
[Bericht gewijzigd door sould3mon op ]
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
bsf en bcf maakt het verschil tussen de led aan en de led uit. En inderdaad ik laat de latch aanstaan. maar alsnog: dit is de enige code tot nu toe dus dan zou ik dat resultaat toch al wel moeten zien?
en de:
movlw b'00000000' ;alles uit
movwf PORTBkan ik beter vervangen door gewoon een nop en dan bcf PORTB,1
Ik ga het morgen proberen!Alvast bedankt
Je hoort wel weer van me.
grtz Bas
PS nieuwe ideejen blijven welkom 
nu het kan wel tijdens de klok geloof ik als de hc bij opgande flank de data al inklokt
maar nog is dit niet zo handig om dit tijdens een clock te doen tevens mis ook een bcf na de laatste bit inclocken , ( als je mplab gebruikt check je logic analyzer dies bij dit soort dingen erg handig )
[spoiler]
..
call klok1
bcf PORTB,0
call latch
movfw 0b00000000 ;reset
movwf PORTB ;all
goto main
;sub routines
klok1
bsf PORTB,1
nop ;klok de bit(pin b,1 hoog)
bcf PORTB,1
return
latch
bsf PORTB,6
nop
bcf PORTB,6 ;pin 12 hoog dus resultaat zou te zien moeten zijn
return
END
[/spoiler]
het verschil tussen je eigen code en deze met logic analyzer zal je wel een eind opweg moeten helpen
[Bericht gewijzigd door sould3mon op ]
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
De beide klokingangen v/d 74HC595 reageren enkel op een positieve flank; wat je er verder mee doet maakt geen zier uit. Ook de snelheid waarmee alles gebeurt is niet kritisch wat het aansturen met een µC betreft: Philips geeft een maximale klokfrequentie van 100MHz aan.
@sould3mon: ik had ook basz's code beter moeten lezen. Alleen weet ik nog steeds niet wat z'n schuifregister doet: alle uitgangen hoog, laag of willekeurig naargelang de wind staat?
010101011101010101110101
ofzo de bedoeling was denk ik 01010101 maar de laatse bit werd niet uitgeklokt waardoor het er iig neit mooi en duidelijk uitziet
(waarshijnlijk eenled matrix shema gevonden
)
boven updated code onder oude
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
zo ik ben met al jullie tips aan de slag gegaan en het werkt nu:D (op mijn breadboard). Het probleem zat hem in de code en in de poorten die gebruikt werden. B.6 is niet geschikt als latch poort. vraag me niet waarom maar nu ik B.2 gebruik werkt alles zoals het hoort! Bedankt!
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
oke nu probleem(pje) hoe klok ik het tweede setje getallen in? eerst de latch hoog maken zodat het eerste setje ingeklokt wordt. Dan een delay(dat wil ik) en dan weer de latch hoog toch? of niet?
euhm hoe bedoel je persies ?
heb je 2 595's in "daisy chain" ? dus 16 bits ?
of bedoel je gewoon een nieuwe reeks in de chip ?
met daisy chain als je de chip in de juist aangesloten heb wacht met de latch tot aantal bits ingeklokt zijn
igg meschien dit eens doorlezen
http://www.mikroe.com/en/books/picbook/7_07chapter.htm
hoe je er een routine van kan maken om aan te roepen
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
ik bedoel dat ik eerst 8 bits inklok. dus bijvoorbeeld 11110111 maar daarna 00010000 in wil klokken. dat wil ie nog niet doen:S. Alleen het eerste setje van 8 bits is dus maar zichtbaar
ik zal die link eens door gaan lezen bedankt!:D
zou het ook verstandig zijn om pullup of pulldown weerstanden te gebruiken op de ingangen van de 74hc595?
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Op 21 januari 2007 20:18:35 schreef basz:
ik bedoel dat ik eerst 8 bits inklok. dus bijvoorbeeld 11110111 maar daarna 00010000 in wil klokken. dat wil ie nog niet doen:S. Alleen het eerste setje van 8 bits is dus maar zichtbaar
Dat wordt gokken: ofwel een software-fout, ofwel vergeet je de paralelle klokingang hoog te maken voor je hem weer laag maakt. Tip: hang tijdelijk een LEDje met gepaste weerstand aan QH', dan heb je ook een visuele indicatie van wat er in het schuifregister zelve gebeurt.
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
Op 21 januari 2007 20:20:10 schreef remy:
zou het ook verstandig zijn om pullup of pulldown weerstanden te gebruiken op de ingangen van de 74hc595?
dit idee had ik ook al. ga ik ff testen.
@pros software fout ben ik ook bang voor.maar wat bedoel jij met de parallele klokingang? Want zoals ik het zie. Je hebt een ingang waarop je het signaal (hoog of laag) aanbied. Je hebt een ingang waarmee je het aangeboden signaal echt inklokt. Je hebt een ingang waarmee je al het ingeklokte spul zichtbaar maakt(de latch)
welk bedoel jij met de parallele klokingang? En zou jij even simpel willen laten zien hoe je een nieuw setje bits inklokt? bijvoorbeeld
signaal aanbieden op pin 14(hoog of laag)
inklokken op pin 12(hoog signaal)
dit hier boven acht keer
dan de latch pin 14 hoog
en hoe dan verder voor het volgende setje? gewoon weer hetzelfde verhaal opnieuw?
trouwens dat ledje is een goed idee maar dan moet ik de nop's even vervangen door delay's van een halve seconde ofzowiets
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Ik bedoel de latch (die de bits van het serieel schuifregister op de paralelle D-buffers plaatst, pin 12 dus. Waarom die chipbakkers telkens weer andere benamingen gebruiken, is me een raadsel). En, om mezelf te verbeteren, je moet hem laag maken, vóór je hem terug hoog kan maken om je bits te latchen. Tenandere, je kan dit --om te testen-- ook doen na iedere seriele klokpuls (op pin 11); dan moet je de bitjes telkens een plaats zien opschuiven.
Wat pull-up weerstanden betreft: noodzakelijk als je stuurt met open-collector uitgangen; verder zie ik weinig nut.
[Toevoeging]
Bediening:
Paralelle klokingang laag maken (pin 12)
(8 x) {
Seriele klokingang laag maken (pin 11)
Bit klaarzetten op de data-ingang (pin 14)
Seriele klokingang hoog maken (pin 11)
}
Paralelle klokingang hoog maken (pin 12)
Bij serieschakeling van meerdere IC's de lus uitbreiden tot 16x, 24x, enz. en dan pas alles gelijktijdig latchen.
[Bericht gewijzigd door pros op ]
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
dit is nu mijn code:
; Assign your microcontroller
LIST P=16F628
; This include file makes programming more understandble
include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
; free 16F628 RAM starts at 0x20(depends on type microcontroller)
CBLOCK 0x20
cntr1
cntr2
cntr3
ENDC
;some define's to make things easier
;These are for Bank Switching
#define BANK0 bcf STATUS,RP0 ; RAM PAGE 0
#define BANK1 bsf STATUS,RP0 ; RAM PAGE 1
;startadres of the controller
org 0x0000
; For using A0-A3 as digital I/O
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
; Reset Port values
clrf PORTA
clrf PORTB
; define your pin direction (input/output)
BANK1 ; Switch to bank 1
movlw b'00000000' ;
movwf TRISA ; PORTA = all outputs
movlw b'00000000' ;
movwf TRISB ; PORTB = all outputs
BANK0 ; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
movlw b'00000000'
movwf PORTB
movlw b'00000000'
movwf PORTA ;alles is nu laag
;eerste schuifregister vullen
bsf PORTB,0 ;achtste led
call klok1
bcf PORTB,0 ;zevende led
call klok1
bsf PORTB,0 ;zesde led
call klok1
bcf PORTB,0 ;vijfde led
call klok1
bsf PORTB,0 ;vierde led
call klok1
bcf PORTB,0 ;derde led
call klok1
bsf PORTB,0 ;tweede led
call klok1
bcf PORTB,0 ;eertse led
call klok1
call latch
call delay_500ms ;delay
;nu alles omdraaien
bcf PORTB,0 ;achtste led
call klok1
bsf PORTB,0 ;zevende led
call klok1
bcf PORTB,0 ;zesde led
call klok1
bsf PORTB,0 ;vijfde led
call klok1
bcf PORTB,0 ;vierde led
call klok1
bsf PORTB,0 ;derde led
call klok1
bcf PORTB,0 ;tweede led
call klok1
bsf PORTB,0 ;eertse led
call klok1
call latch
call delay_500ms ;delay
goto main
;sub routines
klok1
bsf PORTB,1 ;klok de bit(pin b,1 hoog)
nop
bcf PORTB,1
return
latch
bsf PORTA,2 ;latch is hoog dus resultaat zou te zien moeten zijn
nop
bcf PORTA,2
return
; Delay routines
delay_500ms
movlw D'5'
goto delay
delay movwf cntr3
delay1 movlw 0x82
movwf cntr2
delay2 movlw 0xff
movwf cntr1
delay3 decfsz cntr1, f
goto delay3
return
ENDen als je het mij vraagt klopt alles. In het begin zet ik alle pinnen van de pic laag. dan zet ik een bit klaar. en klok ik die in. na het inklokken wordt de klok-pin gelijk weer laag. Dat stukje doe ik 8 keer.
dan de latch (pin 12) hoog. en daarna gelijk laag. Dan een vertraging(de delay_500ms) en dan weer alles van voor af aan? wat doe ik fout? want nu is het resultaat dat al mijn leds aan zijn:P
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Voor zover ik iets van die PIC-assembler begrijp, is je programma OK. Als je de clear-ingang (pin 10) met Vcc verbonden hebt, en de OE-ingang (pin 13) met GND, zou het gewoon moeten werken.
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
jep dat heb ik gedaan. En ja het programma doet het ook prima tot de delay. Dus alles na";nu alles omdraaien" werkt niet. Als ik dat gedeelte+de delay weghaal werkt alles wel gewoon. wat ik nu kan bedenken is dat mijn delay het niet doet maar dat lijkt me sterk. Ik test morgen wel weer verder.
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
zo even een update:P
het schuifregister werkt nu.(sould3emon en pros erg bedankt!
) Ik had een gedeeltelijk werkende pic. waardoor de klok enzo het wel deed maar de latch niet(goed). En er zaten een paar fouten in de code. Voor iedereen die ooit nog via de zoekmaschine hier komt zal ik ff mijn nu nog belabberde code neergooien. Met deze code stuur ik drie schuifregisters aan
; Assign your microcontroller
LIST P=16F628
; This include file makes programming more understandble
include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
; free 16F628 RAM starts at 0x20(depends on type microcontroller)
CBLOCK 0x20
cntr1
cntr2
cntr3
ENDC
;some define's to make things easier
;These are for Bank Switching
#define BANK0 bcf STATUS,RP0 ; RAM PAGE 0
#define BANK1 bsf STATUS,RP0 ; RAM PAGE 1
#define schuifreg1 PORTB,0 ;dit is dus pin 14 van het eerste schuifregister
#define klokingang1 PORTB,1 ;klokingang van eerste schuifregister(pin 11)
#define latch1 PORTA,2 ;dit is de latch
#define schuifreg2 PORTB,2
#define klokingang2 PORTB,3
#define schuifreg3 PORTB,4
#define klokingang3 PORTB,5
;startadres of the controller
org 0x0000
; For using A0-A3 as digital I/O
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
; Reset Port values
clrf PORTA
clrf PORTB
; define your pin direction (input/output)
BANK1 ; Switch to bank 1
movlw b'11111000' ;
movwf TRISA ; PORTA = all inputs, 0-3 are outputs
movlw b'00000000' ;
movwf TRISB ; PORTB = all outputs
BANK0 ; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
movlw b'00000000'
movwf PORTB
movlw b'00000000'
movwf PORTA ;alles is nu laag
;eerste schuifregister vullen
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
;tweede schuifregister vullen
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
;derde schuifregister vullen
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
call latch
;--------------------------------------------------------
;nu alles omgekeerd
;eerste schuifregister vullen
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
bsf schuifreg1
call klok1
bcf schuifreg1
call klok1
;tweede schuifregister vullen
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
bcf schuifreg2
call klok2
bsf schuifreg2
call klok2
;derde schuifregister vullen
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
bcf schuifreg3
call klok3
bsf schuifreg3
call klok3
call latch
goto main
;subroutines
klok1
bsf klokingang1 ;klok de bit(pin b,1 hoog)
nop
bcf klokingang1
return
klok2
bsf klokingang2
nop
bcf klokingang2
return
klok3
bsf klokingang3
nop
bcf klokingang3
return
latch
bsf latch1 ;latch is hoog dus resultaat zou te zien moeten zijn
call delay_300ms
bcf PORTA,1
return
goto main
;--------------------------
; Delay routines
;--------------------------
delay_100ms
movlw D'1'
goto delay
delay_300ms
movlw D'3'
goto delay
delay_500ms
movlw D'5'
goto delay
delay_1s
movlw D'10'
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
ENDVoor de liefhebbers eentje met een Avr geschreven in gcc.
Deze laat gedurende de for-loop er steeds een ledje bij laten branden.
Met 1 schuifregister.
#include <avr/io.h>
#include <util/delay.h>
/*
Atmega8 en 74HC595
PC0(pin 22) = Data(14)
PC1(pin 23) = Latch(12)
PC2(pin 24) = Clock(11)
*/
// delay routine gejat van marcel ;)
void delay_ms(unsigned int t)
{
while(t > 0)
{
/*
_delay_loop_2 doorloopt 4 clock cycles
per tel. 4 x 250 = 1000 cycles
bij 1Mhz clock is dit +/- 1ms delay
zie ook de AVR libc documentatie
*/
_delay_loop_2(250);
t--;
}
}
int main()
{
unsigned char i;
unsigned char j;
delay_ms(100); //stabilisatie
DDRC |= (1 << PC0); //Deze drie poorten als uitgang
DDRC |= (1 << PC1);
DDRC |= (1 << PC2);
for(j=0; j<8; j++) // Deze lus wordt 9 keer aangeroepen
{
PORTC &= ~(1 << PC1); // Latch laag
for(i=0; i<8; i++) // Deze lus
{
PORTC &= ~(1 << PC2); // Clock laag
if(j >= i) // Ledje na ledje aan
{
PORTC |= (1 << PC0);// Data hoog
}
else
{
PORTC &= ~(1 << PC0);// Data laag
}
delay_ms(100); // vertraging voor het oog
PORTC |= (1 << PC2); // Clock hoog
}
PORTC &= ~(1 << PC2); // Clock laag
PORTC |= (1 << PC1); // Latch hoog
}
}
basz
Low cost Mantis CNC bouwebeschrijving zie www.basmolkenboer.nl
haha erg handig om ook hier te posten. Inmiddels heb ik mijn zo goed als complete code af.
; Assign your microcontroller
LIST P=16F628
; This include file makes programming more understandble
include <P16F628.INC>
__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF
; Disable warning : Register in operand not in bank 0
ERRORLEVEL -302
; free 16F628 RAM starts at 0x20(depends on type microcontroller)
CBLOCK 0x20
Var1
Var2
Var3
bits1
bits2
bits3
cntr1
cntr2
cntr3
herhalen
ENDC
;some define's to make things easier
;These are for Bank Switching
#define BANK0 bcf STATUS,RP0 ; RAM PAGE 0
#define BANK1 bsf STATUS,RP0 ; RAM PAGE 1
#define data1 PORTB,0 ;dit is dus pin 14 van het eerste schuifregister(data pin)
#define klok1 PORTB,1 ;klokingang van eerste schuifregister(pin 11)
#define data2 PORTB,2 ;pin 14 van het 2e schuifregister
#define klok2 PORTB,3 ;pin 11 van het 2e schuifregister
#define data3 PORTB,4 ;pin 14 van het 3e schuifregister
#define klok3 PORTB,5 ;pin 11 van het 3e schuifregister
#define latch1 PORTA,2 ;dit is de latch van alle schuifregisters
;startadres of the controller
org 0x0000
; For using A0-A3 as digital I/O
movlw D'7' ;
movwf CMCON ; Comparators off, all pins digital I/O
; Reset Port values
clrf PORTA
clrf PORTB
; define your pin direction (input/output)
BANK1 ; Switch to bank 1
movlw b'11111000' ;
movwf TRISA ; PORTA = all inputs, 0-3 are outputs
movlw b'00000000' ;
movwf TRISB ; PORTB = all outputs
BANK0 ; Switch to bank 1
;--------------------------------------------------------------------------
; main loop
;--------------------------------------------------------------------------
main
movlw D'5'
movwf herhalen
knipperen
;87654321 nummer van de led
movlw b'10101010' ; zet waarde in w
call schuifregister1
movlw b'10101010'
call schuifregister2
movlw b'10101010'
call schuifregister3
call latch
call delay_300ms
movlw b'01010101'
call schuifregister1
movlw b'01010101'
call schuifregister2
movlw b'01010101'
call schuifregister3
call latch
call delay_300ms
decfsz herhalen, f
goto knipperen
;--------------------------
movlw D'5'
movwf herhalen
cirkel
movlw b'00000000'
call schuifregister1
movlw b'00001000'
call schuifregister2
movlw b'00000000'
call schuifregister3
call latch
call delay_300ms
movlw b'11100000'
call schuifregister1
movlw b'10011100'
call schuifregister2
movlw b'00000011'
call schuifregister3
call latch
call delay_300ms
movlw b'11111111'
call schuifregister1
movlw b'11111111'
call schuifregister2
movlw b'11111111'
call schuifregister3
call latch
call delay_300ms
decfsz herhalen, f
goto cirkel
;------------------
movlw D'5'
movwf herhalen
aanuit
movlw b'00000000'
call schuifregister1
movlw b'00000000'
call schuifregister2
movlw b'00000000'
call schuifregister3
call latch
call delay_300ms
movlw b'11111111'
call schuifregister1
movlw b'11111111'
call schuifregister2
movlw b'11111111'
call schuifregister3
call latch
call delay_300ms
decfsz herhalen, f
goto aanuit
goto main
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
schuifregister2
movwf Var2
movlw D'8'
movwf bits2
loop2 rlf Var2,1
btfss STATUS, C
bcf data2
btfsc STATUS, C
bsf data2
bsf klok2
nop
bcf klok2
decfsz bits2,f
goto loop2
return
schuifregister3
movwf Var3
movlw D'8'
movwf bits3
loop3 rlf Var3,1
btfss STATUS, C
bcf data3
btfsc STATUS, C
bsf data3
bsf klok3
nop
bcf klok3
decfsz bits3,f
goto loop3
return
latch
bsf latch1
nop
bcf latch1
return
;--------------------------
; Delay routines
;--------------------------
delay_100ms
movlw D'1'
goto delay
delay_300ms
movlw D'3'
goto delay
delay_500ms
movlw D'5'
goto delay
delay_1s
movlw D'10'
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
ENDZoals je ziet stuur ik 24 leds aan. Straks worden dit 125 leds. Ik gebruik het geheel namelijk voor het aansturen van mijn 5*5*5 led kubus. Nu kan ik nog maar een verdieping maar straks met nog een schuifregister of een 4017 kan ik 5 verdiepingen aansturen