Hallo,
Is het mogelijk in mikrobasic om een bit van een poort, individueel te setten zonder de andere bits te beïnvloeden.

dim cnt as byte

cnt  = 4
trisc = $ff
trisa = 0
trisd = 0
porta = 0

main:
while true
     portd=%00111111
     if portc.5 = 1 then               'toets wordt ingedrukt
        while portc.5 = 1 wend
        cnt = cnt - 1
        porta.cnt = 1
        cnt = cnt - 1
        porta.cnt = 1
        if cnt = 0 then cnt = 4 end if
     end if
wend
end.

Dus hier zou ik graag poorta bit 3 & 2 tegelijk geset hebben en 1 & 0 bij het opnieuw indrukken van de knop.
Via setbit(porta,cnt) gaat dit ook niet.

  porta = porta | (3 << cnt);

Ik "spreek" alleen C... sorry.


PORTA.2 = 1
PORTA.3 = 1

zou moeten werk zie helpfile

Of PORTA = PORTA Or 0x0C

Op 9 juli 2009 16:03:10 schreef timmie:


PORTA.2 = 1
PORTA.3 = 1

zou moeten werk zie helpfile

Ja dacht ik ook maar ik zit hier een segment aan te sturen en bij porta.3=1, cleart hij de andere bits. Ik heb het in proteus eens gesimuleerd maar daar was het net hetzelfde;(.

Hoe los je dat dan hier simpel op? "A write to a port implies that the port pins are
read, the value is modified and then written to the port
data latch." ??

PORTA.4 is een open collector
Ik durf te wedden dat als je PORTA.3 gebruikt het wel werkt
Oftewel, pullup weerstand op PORTA.4
Het heeft dus niets te maken met de instructies, maar met de fysieke eigenschappen van deze pin.

@hadv, maar ik maak geen gebruik van porta.4.
Het moet overigens iets softwarematig zijn denk ik want wanneer ik dit typ:


     portd=%00111111
     if portc.5 = 1 then               'toets wordt ingedrukt
        while portc.5 = 1 wend
        cnt = cnt +1
        if cnt = 1 then porta = 12 end if
        if cnt = 2 then porta = 3 end if
        if cnt = 2 then cnt = 0 end if
    end if

werkt alles wel en heb ik geen problemen met poorta. Ik denk dat die port.pin=waarde meer bedoeld is om iets is voor condities. Maar ik kan natuurlijk ook de bal misslaan...

niet naar de poort schrijven naar naar de latch.

Welke pic gebruik je?

kijk eens of inline assembly het wel goed doet.
Dat zou dan met bsf porta,3 of bcf porta,3 moeten kunnen

Ik gebruik een PIC16F877A
, inline assembly vanaf "cnt = cnt - 1" tem "porta.cnt = 1".

...

DECF	_cnt, 1


poortens_L_14:
	
MOVLW	1
MOVWF	STACK_0
MOVF	_cnt, 0
L_main_0:
BTFSC	STATUS, Z
GOTO	L_main_1
RLF	STACK_0, 1
BCF	STACK_0, 0
ADDLW	255
GOTO	L_main_0
L_main_1:
MOVF	STACK_0, 0
IORWF	PORTA, 1

DECF	_cnt, 1

poortens_L_16
MOVLW	1
MOVWF	STACK_0
MOVF	_cnt, 0
L_main_2:
BTFSC	STATUS, Z
GOTO	L_main_3
RLF	STACK_0, 1
BCF	STACK_0, 0
ADDLW	255
GOTO	L_main_2
L_main_3:
MOVF	STACK_0, 0
IORWF	PORTA, 1

...

En hoe schrijf je naar de latch zelf?

houd eens een byte bij in je ram.
in deze byte doe je alle bewerkingen.
en deze byte zet je na iedere cyclus op de porta.

Ik zie zo 123 niet het lat register bij de 16f serie. werk zelf vaak met de 18f die heeft wat wel.

Een 16F heeft geen LATx registers, je kunt zoals gezegd wel een shadow register bijhouden in RAM.

Of RMW gewoon vermijden door de poort output pinnen niet te zwaar te belasten :)
Als je binnen de toegestane belastingsgrenzen blijft, heb je geen problemen...

Op 9 juli 2009 19:45:54 schreef Bv:
@hadv, maar ik maak geen gebruik van porta.4.

ik zie toch heel duidelijk staan


cnt = 4

en verderop


PORTA.cnt

En ik denk dat ik het al zie....
Je laat het portbit varieren in de while...wend lus.
Ik denk niet dat je compiler hier goed mee omgaat, want dynamische assignments van portbits heb ik nog niet gezien.
Kijk maar in de assembly die je zelf meelevert, alleen PORTA.1 wordt hier gebruikt.
Daarom werkt iets als porta = 12 wel, want dan gebruik je het hele byte.