beste ,
ik heb een pic 16f84
op poort b heb ik 7 ingangen en 1 uitgang

op de uitgang (PORTB,0) moet de toestand vande bit getoggled worden ( dus van 1 naar 0 , en omgekeerd)

ik zit al een tijdje te zoeken maar er raak er niet wijs uit .
Stel dat mijn portb,0 hoog is , dan skipt hij naar de bcf...
Maar dan werkt de volgende instruktie me weer tegen.
Weet iemand een oplossing?

Mijn asm is :

btfss PORTB,0 ; als 1 is ,skippen
btfsc PORTB,0 ; als 0is skippen
bcf PORTB,0
bsf PORTB,0

zoiets:


  btfss PORTB,0 ; als 1 is ,skippen
  goto set;
  goto clear;
clear:
  bcf PORTB,0;
  goto cont;
set:
  bsf PORTB,0;
  goto cont;
cont:

edit: kan vereenvoudigt worden:


btfss PORTB,0 ; als 1 is ,skippen
  goto set;
clear:
  bcf PORTB,0;
  goto cont;
set:
  bsf PORTB,0;
cont:

[Bericht gewijzigd door pol op ]

Als rb0 getoggeld word kan hij alleen 1 of 0 zijn dus hoef je maar naar 1 te kijken.
de ene status(1) sluit nl. automatisch de andere uit(0)


main          call toggle
              
toggle        btfss Rb0     ;is hij 1
              goto  notset  ;nee hij was 0
              goto  set     ; ja hij is 1
notset        bsf   RB0
              return
set           bcf   RB0
              return

OF


main          call toggle
              
toggle        btfsc Rb0     ;is hij 0
              goto  notset  ;nee hij was 1
              goto  set     ; ja hij is 0
notset        bcf   RB0
              return
set           bsf   RB0
              return

XOR. als je xort met 1 dan keert de bit om als je xort met nul dan niet

dus a = a xor 00100000b keert bit 6 om

Op 26 november 2005 16:09:11 schreef free_electron:
XOR.

Dat is natuurlijk het beste anwtoord. Maar vergeet niet dat je geen read-modify-write operaties moet doen op een poort register, gebruik een shadow register!

dat spreekt vanzelf ! wat je terugleest van de poort is niet noodzakelijk wat je er op gezet hebt ...

Headhunter, dat kan korter:


toggle        btfss  RB0     ;is hij 1?
              goto   set     ;nee, hij was 0, dus zet bit
              bcf    RB0     ;ja, hij was 1, dus reset bit
              return
set           bsf    RB0
              return

Op 26 november 2005 18:22:11 schreef Fuzzbass:
Headhunter, dat kan korter:


toggle        btfss  RB0     ;is hij 1?
              goto   set     ;nee, hij was 0, dus zet bit
              bcf    RB0     ;ja, hij was 1, dus reset bit
              return
set           bsf    RB0
              return

thx , ik moest enkel het label 'set' veranderen , omdat mplab dat ziet als een instruktie

Op 26 november 2005 16:23:05 schreef free_electron:
dat spreekt vanzelf ! wat je terugleest van de poort is niet noodzakelijk wat je er op gezet hebt ...

Zo te zien aan de laatste twee posts (btfss, bcf etc direct op RB0) luistert er niemand naar ons :(

Op 26 november 2005 19:13:57 schreef Wouter van Ooijen:
[...]

Zo te zien aan de laatste twee posts (btfss, bcf etc direct op RB0) luistert er niemand naar ons :(

het werkt nogthans hoor ...

Op 26 november 2005 19:48:02 schreef Extragroot:
het werkt nogthans hoor ...

Ja, en ik ben laatst de straat overgestoken zonder links of rechts te kijken en ik leef nog steeds, dus dat kijken is nergens voor nodig.

Helaas hebben Wouter en Free-elektron gelijk.

XOR werkt ook en nog beter ook

en schrijven direct naar een poort het wil wel maar ik heb ook een schematje waarbij een led ook getoggeld word rechtstreeks op een poort en dat ding lijkt zich niets van enige timing aan te trekken puur omdat je een Read Modify Write uitvoert op een poort.Dat het nu werkt wil dus niet zeggen dat het altijd goed werkt.

Op 26 november 2005 19:13:57 schreef Wouter van Ooijen:
[...]

Zo te zien aan de laatste twee posts (btfss, bcf etc direct op RB0) luistert er niemand naar ons :(

Een goed ontwerp van de hardware draagt erg veel bij aan het voorkomen van de read-modify-write BUG van picjes. Ja, ik vind het een bug, een uitgangspin zou zijn status uit de poortlatch terug moeten lezen, en niet van de pin, daar heb je nl helemaal niets aan.

In ieder geval, als je de poort niet noemenswaardig capacitief belast, of de volle source- of sink stroom trekt, dan is er niets aan de hand.

Op 26 november 2005 21:29:10 schreef Fuzzbass:
In ieder geval, als je de poort niet noemenswaardig capacitief belast, of de volle source- of sink stroom trekt, dan is er niets aan de hand.

Als de maanstand gunstig is en je op de juiste wijze met een haring zwaait (sorry, voor piclister only) onder het prevelen van de juiste bezweringen dan heb je er inderdaad geen last van. Maar voor muggles is het gebruik van een shadow register toch sterk aan te bevelen.

Vraag: weet jij welke source en sink stromen in deze gegarandeerd veilig zijn?

Op 26 november 2005 21:29:10 schreef Fuzzbass:
[...]

een uitgangspin zou zijn status uit de poortlatch terug moeten lezen, en niet van de pin, daar heb je nl helemaal niets aan.

das geen bug. das juist goed ! zo kan je 2 pinne van een poort gebruiken als input en de andere 6 als output. je weet wat er op je output staat , dus je kan zo je input terughalen door een paar domme AND / Or bewerkingen.

Op 26 november 2005 23:13:50 schreef Wouter van Ooijen:
[...]

Als de maanstand gunstig is en je op de juiste wijze met een haring zwaait (sorry, voor piclister only) onder het prevelen van de juiste bezweringen dan heb je er inderdaad geen last van. Maar voor muggles is het gebruik van een shadow register toch sterk aan te bevelen.

Vraag: weet jij welke source en sink stromen in deze gegarandeerd veilig zijn?

denk niet dat de stroom een rol speelt. tzal eer de triggerlevels zijn van de ingang. waarschijnlijk zit er schmittrigger aan de ingang. als je teveel capacitief belast en je stijg/daaltijden zijn niet ok dan krijg je rare fenomen bij read modify write. tegen dat je aant schrijven bent is de stande veranderd...

Op 27 november 2005 16:51:49 schreef free_electron:
denk niet dat de stroom een rol speelt. tzal eer de triggerlevels zijn van de ingang.

En je dacht dat de stroom geen invloed heeft op de spanning?

neenne , je begrijpt verkeerd. ik bedoel zolang je binne grenzen van de poort driver blijft natuurlijk. zolang je daar in het juiste kwadrant zit maakt het niks uit. eenmaal je erbuiten gaat krijg je vodden omdat je nooit snel genoeg de trigger levels haalt van de ingag. we sensen nog altijd spanning ... stroom is natuurlijk deoorzaak van de spanning.

Op 27 november 2005 17:09:42 schreef free_electron:
neenne , je begrijpt verkeerd. ik bedoel zolang je binne grenzen van de poort driver blijft natuurlijk.

maar de maximale stroom die de poortdriver toestaat (nuttig om bv een LED lekker te laten branden) veroorzaakt een spanning die de ingangsversterker niet meer altijd 'goed' interpreteert.

das bizar ... nu ja ,als je geen weerstand gebruikt zal de io spanning zakken naar de Vf van de led ( aagzien de current limiter in de chip zit ... dus dat kan de verklaring zijn.

> das bizar

das jouw mening. het is gewoon het gedrag volgens de datasheet.

> ... nu ja ,als je geen weerstand gebruikt zal de io spanning zakken naar de Vf van de led ( aagzien de current limiter in de chip zit

nee, er zit geen als zodanig bedoelde current limiter op de chip.

Op 27 november 2005 19:23:02 schreef Wouter van Ooijen:
nee, er zit geen als zodanig bedoelde current limiter op de chip.

En daarom is het dus gewoon fout om rechtstreeks een led aan te sluiten. Ik zorg gewoon dat de output niet te zwaar belast wordt en gebruik altijd bsf en bcf instructies.
Een kwart Watt weerstandje kan ook best ruim een halve Watt aan (als je hem tenminste niet beetpakt :-) maar dat is niet bevordelijk voor de levensduur.

> En daarom is het dus gewoon fout om rechtstreeks een led aan te sluiten.

klopt

> Ik zorg gewoon dat de output niet te zwaar belast wordt en gebruik altijd bsf en bcf instructies.

Dat hangt af van wat je 'te zwaar' noemt. Als je de stroom trekt die volgens de spec toegestaan is, dan valt er genoeg spanning om bij het teruglezen een probleem te veroorzaken.

Maar ik vroeg al eens: weet jij hoeveel stromm je een pin kan laten sourcen danwel sinken om geen probeelm met een read-modify-write te krijgen?

Op 27 november 2005 21:15:22 schreef Wouter van Ooijen:
Maar ik vroeg al eens: weet jij hoeveel stromm je een pin kan laten sourcen danwel sinken om geen probeelm met een read-modify-write te krijgen?

Volgens de datasheet van een 628A:

Vol = 0.6 Volt bij Iol= 8.5 mA
Voh = VDD - 0.7 Volt bij Ioh = -3.0 mA

Dus bij bovengenoemde stromen zijn de logische niveaus dus wel gegarandeerd, ze noemen tot 0.8 V laag en boven 2.0 V hoog (bij VDD van 4.5 tot 5.5 V).

In de praktijk zal wel meer kunnen, maar dit kan dus volgens de datasheets.

Op 27 november 2005 19:23:02 schreef Wouter van Ooijen:
> das bizar

das jouw mening. het is gewoon het gedrag volgens de datasheet.

nee is mijn mening niet. PIC 's zijn bij mijn weten CMOS toch ? CMOS heeft inherent current sources aan de uitgang zitten ... ( wat niet wil zeggen dat ze niet kunnen kapot gaan bij kortsluitingen.. ze gedragen zich bij steeds kleinere belasing gedurende een tijd als current source tot ze uiteindelijk door interne dissipatie opbranden. )