AC/DrieC
Den Dries www.hulens.be
Hallo , ik zit nu met het volgende probleem. Ik wil als ik schakelaar 1 induw dat IO4 van poort B hoog wordt, als ik schakelaar 2 induw dat IO5 van poort B hoog wordt en als ik schakelaar 3 induw dat IO6 van poort b hoog wordt. Ze moeten hoog blijven zolang ik op de schakelaar duw, hiervoor heb ik volgende code geschreven
MENU CLRF PORTB
MOVLW B'00000000'
MOVWF PORTB
MENU2 BTFSC PORTA,SW1
GOTO schak1
BTFSC PORTA,SW2
GOTO schak2
BTFSC PORTA,SW3
GOTO schak3
MOVLW B'00000000'
MOVWF PORTB
GOTO MENU
schak1 MOVLW B'00010000'
MOVWF PORTB
GOTO MENU2
schak2 MOVLW B'00001000'
MOVWF PORTB
GOTO MENU2
schak3 MOVLW B'00000100'
MOVWF PORTB
GOTO MENU2
Maar ik zou de schakelaars ook tegelijkertijd willen kunnen induwen zodat IO4 , 5 , 6 gelijktijdig hoog zijn maar dit lukt niet met mijn code en ik geraak er ook niet uit hoe dit wel zou lukken , iemand een oplossing ?
mts plus
Life is waiting!
dan zou je moeten zorgen dat als een knop ingedrukt is je een pin set(bsf)
en als hij niet ingedrukt si dat je hem cleart(bcf)
btfss PORTA,SW1
bcf PORTB,4
btfsc PORTA,SW1
bsf PORTB,4
btfss PORTA,SW2
bcf PORTB,5
btfsc PORTA,SW2
bsf PORTB,5
bijv zo
AC/DrieC
Den Dries www.hulens.be
a oke danku dat is ook al het antwoord op mijn volgende vraag dan , hoe je een pin van een poort appart kon aanspreken bedankt voor de hulp ik ga dit al eens testen!
Ik heb nog een vraag , kan je van 1 pin een TOGGLe maken want ik zou ook een soort van clock op een IO moeten hebben om data ergens anders in te klokken ? ik heb al eens in de instructieset gekeken maar vind dit nergens, ik zou ook in een loopke een pin altijd hoog en laag kunnen maken met een pauze ertussen maar kan ik vorig programma dan nog gelijktijdig uitvoeren (bovenstaand programma) ?
[Bericht gewijzigd door klein is fijn op (55%)]
klein is fijn
Moderator
Gebruik volgende keer zelf even de edit. 
Dat bovenstaande programma duurt iets van 12 instructies voor 3 pinnen, daar kan makkelijk nog iets anders bij. Bouw een teller in die na een x aantal cycles een pin hoog of laag maakt.
AC/DrieC
Den Dries www.hulens.be
oke ik heb zitten proberen een toggle te maken , dit is het begin nog maar maar dit werkt al niet :s weet iemand waarom? Sorry dat ik zoveel vraag maar ben een beginner in ASM , ik probeer ook eerst altijd zelf voor ik iets vraag hoor, ik zoek ook in de instructielijsten enzo, dat jullie niet denken dat ik zelf niets opzoek he 
test
variable teller
btfss PORTA,SW1
bcf PORTB,3
btfsc PORTA,SW1
bsf PORTB,3
btfss PORTA,SW2
bcf PORTB,4
btfsc PORTA,SW2
bsf PORTB,4
btfss PORTA,SW3
bcf PORTB,5
btfsc PORTA,SW3
bsf PORTB,5
movlw teller
teller = (teller +1)
if teller>100
bcf PORTB,7
endif
GOTO test
[Bericht gewijzigd door AC/DrieC op (37%)]
mts plus
Life is waiting!
vrasgen stelle is geen enkel probleem.
domme antwoorden geven wel.
je kan voor een klok bijv de oscuit pin van de micrcontroller gebruiken.
van deze kan je echter niet de snelheid wijzigen.
wat je wilt met je teller kan niet,
een lege waarde naar een variabele schrijven doe je zo
teller equ h'41' ; de variabele definieren
movlw d'00' ; lege waarde in het werkgeheugen zetten.
movwf teller,1 ;het werk geheugen naar teller schrijven
hoofd ; het label hoofd
bsf PORTB,7 ; PORTB,7 hoog
call test ; roep de vertraging op
bcf PORTB,7 ;PORTB,7 laag
call test; roep de vertraging op
goto hoofd ; terug naar hoofd
test_teller ; een label genaamd test_teller aanmaken
movlw d'100' ; 100 naar het werkgeheugen
subwf teller,0 ; 100 van je teller afhalen
test ; label genaamd test aanmaken
incf teller,1 ; de teller met 1 ophogen
btfss STATUS,Z ; kijken of de zero flag in het status register geset is
goto test ; zo nee dan gaan we naar test
return ; terug springen
dit zou ongveeer moeten doen wat je wilt
als je de waarde 100 groter maakt word de vertraging grote dus de frequentie lager
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 25 februari 2008 17:54:02 schreef mts plus:
btfss PORTA,SW1 bcf PORTB,4 btfsc PORTA,SW1 bsf PORTB,4 btfss PORTA,SW2 bcf PORTB,5 btfsc PORTA,SW2 bsf PORTB,5
BCF en BSF direct op poort bits: pas op voor het read-modify-write probleem!!!
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
AC/DrieC
Den Dries www.hulens.be
oke maar de het probleem is volgende: ik heb een hoofdprogramma met de 3 schakelaars die worden uitgelezen, zie bovenstaande code. nu zou ik vanuit dit hoofdprogramma ook tegelijkerteid 1 moeten laten toggelen op een bepaalde frequentie, dit kan ik niet met een apparte lus doen want als we in die lus zitten kan ik de schakelaars niet meer uitlezen of ben ik verkeerd ? (de togglefrequentie zou 1khz moeten zijn. Alvast bedankt voor de hulp
oke ik heb het volgende geprobeerd, ik heb de code van mts plus bij in men hoofdprogramma gezet, ik heb alleen wat schrik dat de frequentie van de toggle wa&t gaat afwijken als ik 1 van mijn schakelaars induw ? Ik ga de schakeling morgen aan de scoop hangen om te zien. Ik denk als de frequentie niet gaat veranderen dat ik uit de problemen ben
Iedereen bedankt en ik zal morgenavond laten weten of alles werkt zoals het moet !
[Bericht gewijzigd door AC/DrieC op (33%)]
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 25 februari 2008 23:11:53 schreef picsels:
RMW-probleem: dat kunnen we voorkomen, hoe???
google en de zoekmachine van deze site zijn je beste vrienden.
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Helaas, dat zijn ze niet, daarom stel ik dit iedere keer weer aan de orde als iemand dit stokpaardje van stal haalt 
Als het antwoord is, 'gebruik altijd een schaduwregister', prima.
Maar dan nog ben ik geïnteresseerd in de randvoorwaarden wanneer je wél BCF en de zijnen mag (zou mogen) gebruiken.
En als het antwoord daarop is 'gebruik ze nooit', ook best.
Dan weet ik tenminste weer waarom ik PICBasic gebruik 
RMW fouten ontstaan doordat zodra je op een poort 1 bit wil veranderen de poort gelezen word en niet de latch.
Vervolgens word op die waarden de bit operatie uitgevoerd en terug geschreven naar de latch/poort.
Dit is geen probleem als de poort dezelfde waarde heeft als de latch maar als een poort een vanaf buiten bv een hoog signaal op een pin heeft staan(of laag) en in de latch exact het omgekeerde dan zal bij een RMW operatie de verkeerde waarde terug geschreven worden in de latch en dus de poort een totaal andere waarde waarde krijgen dan dat jij verwacht.
Gebruik RMW operaties nooit op poorten rechtstreeks en je hebt dat probleem ook niet, of je moet gewoon echt zeker weten dat je poort dezelfde waarden bevat als de poortlatch.
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
@The Headhunter: dank voor de info.
Echter WvO heeft deels gelijk: wát het RMW probleem is, is wel overal te vinden.
Hóe het te voorkomen, is juist het probleem.
Wat jij in feite zegt: gebruik een schaduwregister ('gebruik RMW operaties nooit op poorten rechtstreeks').
'je moet gewoon echt zeker weten...'
Hoe weet je dat zeker?
Wat nu als bijvoorbeeld op PORTB alle pennen als output zijn ingesteld.
Kun je dan veilig RMW's gebruiken?
(Eventueel een 'nop' ertussen als RMW' meteen na elkaar staan?)
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 26 februari 2008 09:14:02 schreef picsels:
Helaas, dat zijn ze niet, daarom stel ik dit iedere keer weer aan de orde als iemand dit stokpaardje van stal haalt
Als het antwoord is, 'gebruik altijd een schaduwregister', prima.
dan is het antwoord toch duidelijk?
Op 26 februari 2008 09:14:02 schreef picsels:
Maar dan nog ben ik geïnteresseerd in de randvoorwaarden wanneer je wél BCF en de zijnen mag (zou mogen) gebruiken.
wel:
1. Op alle registers behalve de PORT registers.
2. Op port registers als er maar 1 bit van dat register output is
3. Als je echt helemaal volkomen zekere bent dat je geen probleem zal hebben, maar dan stel je hier geen vragen...
Op 26 februari 2008 09:14:02 schreef picsels:
Dan weet ik tenminste weer waarom ik PICBasic gebruik
Hoezo? Gebruik PICbasic automatisch schaduw registers? Ik weet dat Jal dat doet
Dat is juist het grappige als je alles als output hebt staan en je zet er vanaf buiten een hoog signaal op dan is in de latch de poort laag maar de poort zelf is hoog bij een RMW krijg je na de write dus een hoog terug in je latch en dus op je poort.
Een nop maakt dus ook niet uit, hoogstens bij snel achter elkaar RMW doen zodat de poort kan stabiliseren voordat deze weer gelezen word.
Ik zou gewoon kiezen voor schaduw registers.
Ik zie nl. niet direct een methode om de poort te garanderen.
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 26 februari 2008 10:15:45 schreef The Headhunter:
Een nop maakt dus ook niet uit
Dat hangt er van af of het probleem veroorzaakt wordt door
- statische belasting
- capacitieve belasting
- timing
Voor de laatste twee kan een nop (of meerdree nops) wel eens helpen.
Maar de eneig echte oplossing is het gebruik van een shadow register. Of de LAT registers in een 18F.
Dat zeg ik toch ook?
Een nop maakt dus ook niet uit, hoogstens bij snel achter elkaar RMW doen zodat de poort kan stabiliseren voordat deze weer gelezen word.
[Bericht gewijzigd door The Headhunter op (78%)]
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 26 februari 2008 11:13:21 schreef The Headhunter:
Dat zeg ik toch ook?
je zei 'een nop maakt dus nix uit'. Het lastige is dat mensen soms een RMW probleem hebben, en NOP ergens tussen plaatsen, en voila, het probleem is weg! Een NOP kan het probleem wel degelijk 'wegmaken', maar niet echt verhelpen. Ik wil dus net als jij zeggen dat shadowing de enige echte oplossing is, en ook nog even die mensen over de streep trekken die denken het opgelost te hebben met een NOPje.
mts plus
Life is waiting!
de truk aan het begin van je hoofdroutine een i/0 port update doen
alle onderlinge wijzigingen doe je in een register
en deze zet je dan in de i/o port update 1 1 kjeer op de poort.
dan weet je zeker dat het goed gaat.
je zal in mijn programmatje wel wat problemen krijgen et je frequentie.
1khz is een vertraging van 1 ms
als je een loop maakt van 250 µs en daarin je schakelaars verwrkt.
dan kan je deze 4 keer herhalen.
voor 1 ms
je zult zien dat je schakelaars snelgenoeg reageren.
en dat je klok stabiel is.
[Bericht gewijzigd door Henry S. op (40%)]
picsels
Volgend project: 7-seg gaming displays; dan dec-1982 labvoeding afmaken, dan funcgen met ad9833 afmaken, dan...
Op 26 februari 2008 10:15:45 schreef The Headhunter:
Een nop maakt dus ook niet uit, hoogstens bij snel achter elkaar RMW doen zodat de poort kan stabiliseren voordat deze weer gelezen word.
Het ligt iets genuanceerder (zie 9.10.2 Successive Operations on an I/O Port in de 'PICmicro Mid-Range MCU Family Reference Manual').
Het verwarrende is dat MC in alle documentatie met voorbeelden werkt waarbij lustig PORTx registers met RMW instructies worden veranderd.
@WvO: PICBasic werkt volgens mij niet met schaduwregisters.
Maar vanwege het gemak van de taal is het simpel om 'snel even' wat testjes te doen 
mts plus
Life is waiting!
inderdaad picsels.
microchip doet heel veel examples met rmw op poorten.
zelofs de codes in c hebben hier nog de neiging toe.
weetiemand hoe dat met avr is?
klein is fijn
Moderator
Op 26 februari 2008 12:14:51 schreef mts plus:
weetiemand hoe dat met avr is?
Geen idee hoe dat in assembler zit, maar in Bascom AVR kan je zowel de pin als de port uitlezen van iedere pin. De ene is het register waarin staat wat de pin zou moeten zijn, de andere is de waarde van de pin zelf.
mts plus
Life is waiting!
ik doelde meer op de rmw problemen.
heb je die ook bij avr of is dat meer een pic probleem?
ga er van uit dat dat bij beide is.
AC/DrieC
Den Dries www.hulens.be
mijn programma zie er nu zo uit, ik heb het siganaal aan pin 7 nog niet kunnen meten maar normaal is dit nu een kloksignaal. De delayroutine heb ik uit een voorbeeld gehaald en hierin is de tijd aan te passen.
test
btfss PORTA,SW1
bcf PORTB,3
btfsc PORTA,SW1
bsf PORTB,3
btfss PORTA,SW2
bcf PORTB,4
btfsc PORTA,SW2
bsf PORTB,4
btfss PORTA,SW3
bcf PORTB,5
btfsc PORTA,SW3
bsf PORTB,5
bcf PORTB,7
call DELAY_ROUTINE
bsf PORTB,7
call DELAY_ROUTINE
GOTO test
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
Op 26 februari 2008 18:52:02 schreef AC/DrieC:
mijn programma zie er nu zo uit
Ik zie nog steeds bcf en bsf op PORTB ...