Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1121 / 1319
(#) watt válasza Simon Kornél hozzászólására (») Máj 3, 2013 /
 
Igen, vagy egy másik PIC-el...
(#) petXYZW hozzászólása Máj 3, 2013 /
 
Üdv Mindenkinek!

Problémám akadt az SSPI-vel! Hátha volt már hasonló probléma.

SD kártyát szeretném SPI módban használni, de addig el sem jutok, ugyanis már SSPI sem működik. Nem használok megszakítást pollozással működne a dolog.
Az eszköz: pic16F877A - 20Mhz osc

A konfig:
  1. __CONFIG  _LVP_OFF & _WDT_OFF & _HS_OSC & _CPD_OFF


Lenne ugye az inicializálás:
  1. clrf    STATUS
  2.         bsf     STATUS,RP0              ;Bank 1 kiválasztása
  3.         movlw   B'10010000'             ;sck rc3, sdo rc5, sdi rc4, cs rc0
  4.         movwf   TRISC
  5.         clrf    TRISD ;ledeknek
  6.         ;SPI init
  7.         bcf     STATUS,RP0              ;Bank 0 kiválasztása
  8.         clrf    SSPSTAT ;próbáltam már 0x40-el is.
  9.         ;SSPCON = B'110010'
  10.         movlw   B'00110010'             ;Alacsony frekvencia SSP fosc/64
  11.         movwf   SSPCON


A ciklus amiben egy SPI szubrutint hívok:

  1. ;CS = 1
  2.         bsf             PORTC,CS
  3.         ;for(i=11;i>0;i--) SPI(0xFF) várunk 80 órajelet
  4.         ;CIKLUS1 = 11
  5.         movlw   11                             
  6.         movwf   CIKLUS1
  7.         ;
  8. Wait80cycles:
  9.         ;SPI_IN = 0xFF
  10.         movlw   0xFF                   
  11.         movwf   SPI_IN
  12.         ;
  13.         ;SPI(SPI_IN)
  14.         call    SPI
  15.         ;
  16.         decfsz  CIKLUS1
  17.         goto    Wait80cycles    ;CIKLUS1>0
  18.         ;CS = 0
  19.         bcf             PORTC,CS


  1. SPI:;uchar SPI_OUT SPI(uchar SPI_IN)
  2.         ;STATUS és W reg mentése
  3.         movwf   W_SAVE
  4.         movfw   STATUS
  5.         movwf   STA_SAVE
  6.         ;
  7.         clrf    STATUS                  ;Bank 0 kiválasztása
  8.         ;SSPBUF = SPI_IN;
  9.         movfw   SPI_IN                  ;W reg = SPI_IN
  10.         movwf   SSPBUF                  ;SSPBUF = W reg
  11.         ;
  12.         ;while(!BF)
  13.         bcf             STATUS, RP1     ;Bank 1 kiválasztása
  14. LoopSPI:
  15.         btfss   SSPSTAT, BF     ;átvitel kész?
  16.         goto    LoopSPI                 ;Nem
  17.         ;
  18.         bcf             STATUS,RP0              ;Bank 0 kiválasztása
  19.         ;SPI_OUT = SSPBUF
  20.         movfw   SSPBUF                  ;W reg = SSPBUF
  21.         movwf   SPI_OUT                 ;SPI_OUT = W reg
  22.         ;
  23.         ;STATUS és W reg visszaállítás
  24.         movfw   STA_SAVE
  25.         movwf   STATUS
  26.         movfw   W_SAVE
  27.         ;      
  28.         return


A szubrutin belsejében elakad, egyetlen egyszer sem jut át a SSPSTAT BF bitteszten, mindig 0 marad a bit, végtelen ciklusba kerül.

A szerint már megvizsgáltam PIR1 SSPIF és a SSPCON WCOL biteket is minden 0.

Az agyam már leolvadt, el sem tudom képzelni miért nem megy.

Minden segítséget előre is köszönök:
Péter
(#) watt válasza petXYZW hozzászólására (») Máj 3, 2013 /
 
Az SPI nagyon egyszerű periféria, minden órajelre egy bitet ki és beléptet(léptető regiszter). Ha nincs aki válaszoljon, akkor 0-kat, vagy 1-eket fog beléptetni, a bemenet véletlen állapotától függően. Tehát 8 órajel után a BF-nek át kell billennie, akkor is, ha nincs rákötve eszköz a vonalra. Nézd meg, hogy a movwf SSPBUF kiadása után van-e órajel a kimeneten, esetleg azt, hogy megjelenik-e az adat(55h-kat küldve négyszögjel jelenik meg.)

Még annyit, hogy az RP1-el nem a bank 1-et választod ki, úgy meg pláne nem, ha törlöd!
Lehet, hogy a BANKSEL-t kéne használni, még akkor is, ha két sort használ. A végén legfeljebb kiírtod...
A hozzászólás módosítva: Máj 3, 2013
(#) petXYZW válasza watt hozzászólására (») Máj 3, 2013 /
 
Köszönöm a választ. Kijavítom a regiszterbank választást, valószínű ez szerepelt hibásan a kódban. Soha nem vettem volna észre.
(#) tibiiii00 hozzászólása Máj 3, 2013 /
 
Sziasztok!

Lenne egy kérdésem. PIC18F2480-ban szeretném 16MHz belső kvarcot használni.
Ugye belső 4 MHz-et lehet négyszerezni PLL segítségével, de sajnos nem tudtam összehozni.
Az OSCCON-t beállítom 4MHz-re és a PLL-t is bekapcsolom, de csak 4MHz el megy így is.
Van valami trükkje? mert így sajnos nem működött.
Segítségeket előre is köszönöm.

Üdv.: Tibi
(#) watt válasza tibiiii00 hozzászólására (») Máj 3, 2013 /
 
Az OSCTUNE 6. bitje választja ki, hogy a belső oszci menjen a PLL-re.
(#) tibiiii00 válasza watt hozzászólására (») Máj 3, 2013 /
 
köszi a választ.
Tudtam , mert azzal kapcsoltam be a PLL-t.
És azt a bitet 1-be állítottam, és így sem működik sajnos
(#) bbalazs_ válasza tibiiii00 hozzászólására (») Máj 3, 2013 /
 
Esetleg mellekelhetned a progi elejet valamint a configbitek allapotat.
Kiolvasva a configbiteket ugyanazt kapod vissza, mint amit korabban beirtal?
(#) nedudgi válasza tibiiii00 hozzászólására (») Máj 3, 2013 /
 
Csak pontosítok, az adott mikrokontroller nem tartalmaz kvarcot, mindössze egy belső RC oszcillátort.
A hozzászólás módosítva: Máj 3, 2013
(#) icserny válasza tibiiii00 hozzászólására (») Máj 3, 2013 /
 
Idézet:
„Van valami trükkje?”
Az adatlap szerint két feltétele van a PLL bekapcsolhatóságának a belső oszcillátor használata esetén:

- FOSC<3:0> = 1001 vagy 1000
- OSCCON<6:4> = 111 vagy 110

Bővebben: adatlap 3.6.4 PLL IN INTOSC MODES szekciója
(#) watt válasza icserny hozzászólására (») Máj 3, 2013 /
 
Akkor három!
(#) potyo válasza tibiiii00 hozzászólására (») Máj 6, 2013 /
 
Próbáld kikapcsolni a pic tápját, várj egy kicsit és kapcsold be. Nemtudom, ez is olyan-e, de voltak picek, amiknél a PLL tiltása/engedélyezésekor el kellett venni a tápját is, hogy az új beállítás aktív legyen.
(#) _vl_ válasza potyo hozzászólására (») Máj 6, 2013 /
 
Ez itt nem játszik. Szoftverből kell bekapcsolni a PLL-t, szigorúan az indulást követően.
(#) Simon Kornél válasza Simon Kornél hozzászólására (») Máj 8, 2013 /
 
Szia!
Csak nem sikerült 100%-osan az INTERRUPT-os kommunikáció. Az adás működik, de a vétellel van probléma. Megnéztem a fórumokat, de nem találom a hibát. Segíts nekem, hogy hol rontottam el vagy hol keressem a hibát. (Mellékelem a programot.)
Köszönöm a segítségedet előre is!
Üdv.:K

LCD.c
    
(#) Simon Kornél válasza Hp41C hozzászólására (») Máj 8, 2013 /
 
Szia!
Csak nem sikerült 100%-osan az INTERRUPT-os kommunikáció. Az adás működik, de a vétellel van probléma. Megnéztem a fórumokat, de nem találom a hibát. Segíts nekem, hogy hol rontottam el vagy hol keressem a hibát. (Mellékelem a programot.)
Köszönöm a segítségedet előre is!
Üdv.:K

LCD.c
    
(#) _vl_ válasza Simon Kornél hozzászólására (») Máj 8, 2013 /
 
Az a probléma, hogy nem érted az interruptok működését, felhasználási módját.
Az interrupt nem úgy működik, hogy egy regiszterben egy bit jelzi, hogy "most esemény van", neked meg ezt a bitet kell rendszeresen nézegetni (ezt ugyanis pont nem interruptos perifériakezelésnek hívják, hanem az a neve, hogy polling, és ez pont az ellentéte annak).
Az interrupt működése úgy néz ki, hogy csinálsz egy függvényt, aminél egy külön fordítási jelzést használsz, amivel tudatod a fordítóval, hogy ez itt "az" interrupt függvény (a függvény elején, a függvény neve elé, az üres visszatérési értéket jelentő "void" mögé kell beszúrni az a szót, hogy "interrupt" ), majd az interruptok beállítása és engedélyezése után NEM csinálsz semmit a programban, hanem csak vársz, ill. foglalkozol más dolgokkal. És amikor jön az interrupt, akkor a program automatikusan az interrupt függvényben "terem" (ezt a hardver megcsinálja magától, nem kell, sőt nem is szabad ezt a függvényt hívogatni függvényként), majd amikor az véget ért, akkor ott folytatódik tovább a programod futása, ahol korábban járt.
Ja, és az interrupt függvényben nem szabad semmi olyasmit csinálni, ami sokáig tart. Leginkább a minimálisan szükséges műveleteket elvégezzük, majd távozunk.
A hozzászólás módosítva: Máj 8, 2013
(#) sirály12 válasza Simon Kornél hozzászólására (») Máj 9, 2013 /
 
Ha jól látom ez ccs c igaz?
Eze kell neked elvileg:

Sorosport beállítása:
  1. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)


Engedélyezned kell a soros porti megszakítást:
  1. enable_interrupts(INT_RDA);
  2. enable_interrupts(GLOBAL);


Ezután lehet lekezelni a megszakítást:
  1. #int_rda
  2. void rda_isr(void)
  3. {
  4. //Ide jön a kód amit akarsz hogy a megszakítás végezzen el. Pl.:
  5. int8 c;
  6. c = getc();
  7. putc(c);
  8. }


Azt hiszem ennyi. Ha nem ccs lenne, akkor elnézést.
(#) zenetom hozzászólása Máj 11, 2013 /
 
Hali!
Eldobom az agyam, hogy nincs 12F-nél RLNCF utasítás. Csak RLF van, és az bizony a carry-n keresztül forgat, aminek biztos van értelme, csak én nem látom.
Szóval ha forgatni akarok balra, akkor még a forgatás után a carry bit szerint be kell állítanom a 0. bitet. Vagy van ennél egyszerűbb megoldás?
Szerk.: tudom, hogy a carry bit értéke közben berotálódik a 0. helyre, de nekem az nem kell..
Szerk2.: közben megtaláltam. Kétszer kell forgatni, először a WREG-be, aztán a regiszterbe.
A hozzászólás módosítva: Máj 11, 2013
(#) svandras0404 hozzászólása Máj 15, 2013 /
 
Üdv mindenkinek!
Egy kis segítséget kérnék.
Real time orát szeretnék összehozni pic-el.
A PIC programozás már megy (ASM), de Real T. -al még nem volt dolgom.
SPI-vel kommunikál (MCP795W10-I/SL).
Fogalmam sincs hogy kellene hozzákezdeni.
Minden segítség jól jönne.
Előre is köszönöm.
(#) kissi válasza svandras0404 hozzászólására (») Máj 16, 2013 /
 
Szia!
Ha az asm megy, akkor először elolvasod az óra adatlapját és azt kell leprogramozni !
Mi a KONKRÉT kérdésed ?!
(#) pajti2 hozzászólása Máj 16, 2013 /
 
Csinált már valaki végig engedélyeztetési eljárást pic-es áramkörökre? Az fcc part 15 class A-ra gondolok (rádiofrekvenciás kisugárzás).

Egyáltalán vannak a pic-ek annyira "csendes"-ek, hogy 6-8 pic egy panelen (smd, röviden összekötött, meg minden) még mindig bele tudjon férni a legalacsonyabb sugárzási kategóriába? Vagy eleve kár miatta izzadni? Microchip oldalakon kotortam ilyesmiért, de egy árva szót sem találtam róla. Szerintem kiröhögnek, ha ilyet levélben megkérdezek tőlük
(#) Hp41C válasza pajti2 hozzászólására (») Máj 16, 2013 /
 
Kérdezd meg a fórumukon.
(#) kszabi hozzászólása Máj 21, 2013 /
 
Sziasztok!
Az MPLAB X -hez letölthető GDD-sikerült már valakinek használni?
A 8-as alatt még működött, de ezt sehogy se sikerül elindítani.
Köszi kszabi
(#) Simon Kornél válasza _vl_ hozzászólására (») Máj 21, 2013 /
 
Köszönöm a válaszodat és utána néztem az interrupt-nak. Az alábbi módon csináltam egy interrupt-ot, de nem történt semmi.
  1. volatile char Flag = 0;
  2.  
  3. void GetCh(void);
  4.  
  5. #pragma code InterruptLow = 0x18
  6. void InterruptLow()
  7. {
  8.         _asm
  9.                         goto    GetCh
  10.         _endasm
  11. }
  12. #pragma code
  13. #pragma interruptlow GetCh
  14. void GetCh(void)
  15. {
  16.         Flag = 1;
  17. }

Röviden annyit csinálna a megszakítás, hogy ha érkezik adat a soros porton keresztül, akkor a Flag = 1 lesz.
De nem történik semmi, az adatot az UART-on keresztül elküldöm és nem jön létre az interrupt-olás. (Az interuptot a fentiekben csatolt programban a soros kommunikáció inicializálásánál engedélyezem) Mit csináltam rosszul?
Lehet, hogy rossz sorrendben engedélyezem az interuptolást? Üdv.:K
(#) Simon Kornél válasza sirály12 hozzászólására (») Máj 21, 2013 /
 
Köszönöm a válaszodat, de nem CCS-t használok.
(#) watt válasza Simon Kornél hozzászólására (») Máj 22, 2013 /
 
Engedélyezted a prioritásos megszakítást? Beállítottad, hogy a kérdéses periféria alacsony megszakításban okozzon megszakítást? Elolvastad az adatlapot a megszakításokról?
(#) Simon Kornél válasza watt hozzászólására (») Máj 22, 2013 /
 
Köszönöm a kérdéseidet. A fentiekben leírtam, hogy a megszakítási beállítások a csatolt C file-omban vannak. Beállítási gondjaim voltak, mert jelenleg működik a megszakítás. De legalább a kérdéseid hatására újra átnéztem az interruptal kapcsolatos dolgokat. Üdv.:K
(#) Prome hozzászólása Máj 24, 2013 /
 
Sziasztok.
Segitséget kérnék.
Tudtok olyan anyagot ahol a PIC-ek utasitászkészletét tárgyalják tipusokra bontva példaprogramokkal?
Köszi
(#) watt válasza Prome hozzászólására (») Máj 24, 2013 /
 
Adatlapok. Én abból tanultam meg annó...
(#) icserny válasza Prome hozzászólására (») Máj 24, 2013 /
 
PICmicro Mid-Range MCU Family Reference Manual
PIC18C Family Reference Manual
dsPIC30F/33F Programmer's Reference Manual
PIC32MX Family Reference Manual

Related MIPS® Documentation
• MIPS M4K™ Software User’s Manual – MD00249-2B-M4K-SUM
• MIPS® Instruction Set – MD00086-2B-MIPS32BIS-AFP
• MIPS16e™ – MD00076-2B-MIPS1632-AFP
• MIPS32® Privileged Resource Architecture – MD00090-2B-MIPS32PRA-AFP
Következő: »»   1121 / 1319
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem