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 ?

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

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%)]

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.

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%)]

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

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!!!

RMW-probleem: dat kunnen we voorkomen, hoe???

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%)]

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.

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.

@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?)

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.

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%)]

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.

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%)]

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 :-)

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?

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.

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.

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

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 ...