www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC16F627 povezava med pinoma RA1 in RA4

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Čet Avg 23, 2012 9:15 pm    Naslov sporočila:  PIC16F627 povezava med pinoma RA1 in RA4 Odgovori s citatom

Zdravo,

uporabljam PIC16F627 in imam zelo čuden pojav. Pina RA1 in RA4 imam definirana kot izhoda. RA4 je open drain zato imam še dodaten pull up upor. Ko na RA1 spreminjam stanje iz 0 .. 1 mi to vedno vpliva na stanje na RA4. Na RA1 in RA4 imam vezani ledici in ko v kodi nastavim RA4 = 1 in potem RA1 = 0 mi bo zadnja komanda RA1 = 1 vplivala na RA4 in mi izklopili ledico. CMCON sem nastavil na 0x07 kar naj bi pomenilo izklopljene komparatorje na kar sem najprej posumil vendar mi ta problem ni čisto logičen. Če recimo RA1 nastavim pred nastavljanjem RA4 pa je ok.

Kakršenkoli namig bi mi prišel prav. Hvala.

Lp

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Peter123
Član
Član



Pridružen-a: Tor 13 Jan 2009 15:34
Prispevkov: 1367
Aktiv.: 7.34
Kraj: Lj.

PrispevekObjavljeno: Pet Avg 24, 2012 7:14 am    Naslov sporočila:   Odgovori s citatom

Predlagam da prilepiš kos kode.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Pet Avg 24, 2012 8:42 am    Naslov sporočila:   Odgovori s citatom

Rutine pokličem v tem vrstnem redu:

1. inicializacija I/O:

Koda:
  CMCON = 0x07; // disable analog mode - comparators 
  TRISA = 0b10100001; // set outputs and inputs
  TRISB = 0b00001010; // set outputs and inputs


2. inicializacija interruptov:

Koda:
  INTCON = 0b11000000;// GIE (global interrupt), PEIE (peripheral interrupt)
  PIE1   = 0b00100000;// RCIE = 1


3. inicializacija UARTA:

Koda:
  SPBRG = DIVIDER;
  BRGH = 1;
  CSRC = 1;
  SYNC = 0;
  SPEN = 1;
  RX9  = 0;
  CREN = 1;
  TX9  = 0;
  TXEN = 0;


4. inicializacija timerja:

Koda:
  T0CS = 0;// internal clock form clkout
  PSA  = 0;// prescaler assigned to timer0
  PS0  = 1;// prescaler set to 16
  PS1  = 1;
  PS2  = 0;
  T0IE = 1;




Ravno sedaj ko gledam tole... a je možno, da vrstni red klicanja teh rutin povozi TRISA in TRISB in bi moral inicializacijo I/O poklicati čisto na koncu in ne prvo kot je tukaj?

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
bferlic
Član
Član



Pridružen-a: Tor 09 Dec 2003 17:28
Prispevkov: 99
Aktiv.: 0.44
Kraj: Brezula, Rače

PrispevekObjavljeno: Pet Avg 24, 2012 10:12 am    Naslov sporočila:   Odgovori s citatom

Vrstni red ne bi smel biti problem, razen če je kakšna napaka v prevajalniku. A lahko prilepiš še del kode, kjer spreminjaš stanje na RA1 in RA4?

LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo MSN Messenger - naslov
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Pet Avg 24, 2012 10:51 am    Naslov sporočila:   Odgovori s citatom

Preklop je čist preprost.

Najprej recimo takole:



Če naredim takole je vse ok:
Koda:
RA1 = 1;
DelayMs(50);
RA1 = 0;

RA4 = 1;


Če pa naredim takole pa je rezultat tega, da ko bo RA1 šel na 0 mi bo tudi RA4 šel na 0, kljub temu da je nastavljen na 1. Kot bi RA1 imel vpliv na RA4 pa med njima sploh ni fizične povezave.
Koda:

RA4 = 1;

RA1 = 1;
DelayMs(50);
RA1 = 0;


Prevajalnik je Hitech C 9.71a. Na napajanju PICa imam 100nF kondenzatorje čimbližje VDD pinu.

S PICom 16f627 sicer še nisem delal ampak tudi pri drugih serijah (16 in 18) nisem imel takih problemov.

Ta RA4 je eden od pinov, ki so potem direktno vezani na ULN2003. Ostali pini so pač "normalni", ta pa ima pull up ker je open drain in samo to je razlika proti ostalim.

lp

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MvE
Član
Član



Pridružen-a: Ned 04 Jan 2009 12:24
Prispevkov: 146
Aktiv.: 0.78
Kraj: MB

PrispevekObjavljeno: Pet Avg 24, 2012 1:07 pm    Naslov sporočila:   Odgovori s citatom

Na hitro, če se mudi bi šlo rešiti tako, da vpišeš binarno vrednost v PORTA:

Koda:
PORTA = 0b00010010;
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Pet Avg 24, 2012 1:21 pm    Naslov sporočila:   Odgovori s citatom

Ja sej zdej se poslužujem metode, da RA4 nastavim nazadnje. Tako dela ok, mi pa vseeno ni najbolj všeč ker še vedno ne razumem zakaj prihaja do tega.


Koda:

RA1 = 1;
DelayMs(50);
RA1 = 0;

RA4 = 1;

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3638
Aktiv.: 17.03

PrispevekObjavljeno: Pet Avg 24, 2012 3:02 pm    Naslov sporočila:   Odgovori s citatom

@MvE je že prav nakazal rešitev.
PIC pini imajo zanimivo lastnost beri/spremeni/piši . To pomeni, da se za spremembo enega pina prebere zunanje stanje celega PORTa, nato se vrednost spremeni, potem se cel PORT vpiše nazaj. Pri zunanjii pull-up/down uporih je lahko to prebrano stanje drugačno od notranjega stanja istega porta.

Zato se pri varnostno pomembnih programih uporablja zaporedje
Koda:

  movf PORT_,W
  andlw b'xxxxxxxx' ; kjer je x=0 za pine, ki jih želimo izklopiti, vsi ostali x so 1
  movwf PORT_

  movf PORT_,W
  iorlw b'xxxxxxxx' ; kjer je x=1 za vse pine, ki jih želimo vklopiti, vsi ostali x so 0
  movwf PORT_

  movf PORT_,W
  xorlw b'xxxxxxxxx' ; kjer je x=1 za vse pine, katerim želimo spremeniti stanje (iz 1 v 0 ALI iz 0 v 1), vsi ostali x so 0
  movwf PORT_ 
Sedaj pa to .asm sintakso spravi v C .
_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Pet Avg 24, 2012 3:22 pm    Naslov sporočila:   Odgovori s citatom

Good point ja. Iz headerja je razvidna definicija pina, ki je vezana na port. Opazujem diagram pinov in se mi svita za kaj se gre, ja. Sedaj se mi zdi logično zakaj pride do tega. V bistvu je vedno najboljše da v takšnem primeru kar na celem portu delam operacije kot na posameznem pinu.

Hvala za info in razlago!!!

LP
Aljoša

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Aljosa
Član
Član



Pridružen-a: Pet 15 Sep 2006 11:43
Prispevkov: 149
Aktiv.: 0.69
Kraj: Trbovlje

PrispevekObjavljeno: Pet Avg 24, 2012 3:37 pm    Naslov sporočila:   Odgovori s citatom

Evo še razlaga, če bo kdo še imel podobno težavo:

When you perform any operation, apart from a MOV on a register ... the PIC {or SX} first reads the register, then it performs the operation on the number it has just read and finally it write the number back to the register. This is fine when dealing with normal registers and most special function registers. However, if you perform RMW (read modify write) operation on a port register (PORTA PORTB etc) [ed: or some timer / counter registers] then you are heading for trouble. Why? Because when the uP reads a port register, it reads the actual state of the pins, rather than the output latch. This can cause two problems:

If the pin is an input, then the input pin state will be read, the operation performed on it, and the result sent to the output latch. This may not immediately cause problems, but if that pin is made into an output later on, the state of the output latch may have changed from the time it was deliberately set by the code.
Now, if the pin is defined as an output, the output latch and the actual pin *ought* to be in the same state. In practice sometimes they aren't. If you are driving a capacitive load, the pin will take time to respond as it charges and discharges the capacitor. A common problem occurs when using the bit set (bsf) or bit clear (bcf) directly on a port.

bsf portb, 0 -- don't do this!
bsf portb, 1 -- don't do this!
bcf portb, 1 -- don't do this!
or
setb portb.0 -- don't do this!
setb portb.1 -- don't do this!

Which *might* work. However, if pin B0 is loaded in any way, then it may not have time to respond to the first instruction before the second one is executed. The second instruction reads the port and sees that the pin B0 is low (because it hasn't got time to go high) and writes the low state back into the output latch. The result would be that B0 never gets set.

How do you avoid this issue? Well, it's bad practice to use RMW instructions directly on a port. So you use whats known as a shadow register. The shadow register is simply a ram location you reserve. All operations are performed on this register, and when you are finished, you copy it to the port register. It's a bit more trouble, and it can slow things down a tiny bit, but the effort is worth it for reliable operation.

Note that it's not only bsf and bcf that are RMW instructions, although they are the most common. Other examples are

andwf portb,f -- don't do this!
iorwf portb,f -- don't do this!
xorwf portb,f -- don't do this!

(Instructions that merely *read* from a port are safe, as long as you stay aware of the fact that the value you read may be different from the value you just wrote:

andwf portb, w ; this is fine
iorwf portb, w ; this is fine

)

_________________
"Logic will get you from A to B. Imagination will take you everywhere.
―Albert Einstein
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Alex17
Član
Član



Pridružen-a: Ned 28 Feb 2010 21:46
Prispevkov: 476
Aktiv.: 2.76
Kraj: Ljutomer

PrispevekObjavljeno: Pet Avg 24, 2012 4:33 pm    Naslov sporočila:   Odgovori s citatom

Če hočeš spreminjati posamezne bita, pa jim vrednosti nastaviš V LATA / LATB registru.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
snow
Član
Član



Pridružen-a: Tor 27 Dec 2005 14:02
Prispevkov: 341
Aktiv.: 1.53
Kraj: Ljubljana || Velenje

PrispevekObjavljeno: Sob Avg 25, 2012 1:37 pm    Naslov sporočila:   Odgovori s citatom

Alex17 je napisal/a:
Če hočeš spreminjati posamezne bita, pa jim vrednosti nastaviš V LATA / LATB registru.


Ja če gre za naprednejše PICe.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 80 dni


Powered by phpBB © 2001, 2005 phpBB Group