Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   759 / 1320
(#) icserny válasza trudnai hozzászólására (») Jún 15, 2010 /
 
Idézet:
„Viszont a frame-eknek nem feltetlenul kell a stack-en lennie”
C18 esetén tudtommal nincs heap, minden a szoftveresen kezelt veremben tárolódik. C30-nál van külön heap, de az teljesen más (GCC) fordító.
Idézet:
„de gyanitom ha egyetlen bank-on van a stack (merthogy azt kerted), akkor nem a stack-re helyezi a lokalisokat”
De igen, sőt, megszakításnál a regisztereket és az esetlegesen elmentésre kijelölt változókat is ide menti.
Idézet:
„mivel ott nem reentrans a kod (elmeletileg)”
elvileg lehet, ha a mentések után újraengedélyezzük az interruptot - az más kérdés, hogy túl sok értelme nincsen. De a C18 fordító fel van készülve rá, s a User Guide mutat is valami bugyuta mintapéldát rá.
(#) sany hozzászólása Jún 15, 2010 /
 
Sziasztok!


PIC12F629 égető kapcsolási rajzát valaki tudna nekem adni?

Néztem a google-t de nem találok.Nem baj ha jdm az égető.


Köszönöm előre is!
(#) icserny válasza sany hozzászólására (») Jún 15, 2010 /
 
A PICkit2 is tökéletesen égeti, de a Kapcsolások között , vagy
Watt fórumtársunk honlapján egyszerűbb megoldást is találsz.

Ezeket a linkeket is érdemes megnézni.

Google is mutat hasznos linket
(#) cape-t hozzászólása Jún 15, 2010 /
 
Üdv Mindenkinek!

Próbálok egy univerzális próbapanelt építeni PIC 16F877-hez. Az lenne a kérdésem, hogy ha az RC0/T1OSO/T1CKI és RC1/T1OSI/CCP2 lábak közé beforrasztom a 32,768kHz -es kavicsot, utána adott esetben használhatom ugyan ezeket a lábakat digit I/O portként? Vagyis tönkre teszi-e a kavicsot, vagy a PIC-et, ha a kvarcra pl. kikerül +5V, vagy a GND?
Persze Jumperrel le lehet választani, de mi van, ha pl. elfelejtem lehúzni...

A válaszokat előre is köszönöm!
(#) potyo válasza cape-t hozzászólására (») Jún 15, 2010 /
 
Elméletileg nem lesz baja. A kvarc helyettesítő ábrájában a kondenzátorok pF és fF nagyságrendűek, így nem fogja sem a kvarc a lábakat, sem a lábak a kvarcot kinyírni szerintem.
(#) hadnagyakos hozzászólása Jún 15, 2010 /
 
12F629 PIC-ben szeretnék átlépni egyik BANK-ból a másikba, de az MPlab egyáltalán nem akarja.
Ez lenne a kód:
  1. bcf             STATUS, RP0
  2.         call    3ffh           
  3.         movwf   OSCCAL         
  4.         movlw   b'00001000'
  5.         movwf   TRISIO
  6.         movlw   b'00000000'
  7.         movwf   OPTION_REG
  8.         movlw   b'00001000'    
  9.         movwf   IOC
  10.         bcf             STATUS, RP0     ;
  11.         clrf    GPIO
  12.         movlw   b'00000111'
  13.         movwf   CMCON          
  14.         movlw   b'00001000'     ;
  15.         movwf   INTCON          ;
  16.         bcf     STATUS,RP0
  17.         movlw   b'11010000'


A fordításnál ezeket a hibaüzenetet kapom:
Register in operand not in bank 0. Ensure that bank bits are correct.
(#) potyo válasza hadnagyakos hozzászólására (») Jún 15, 2010 /
 
Ugye meg sem próbáltad beírni a keresőbe az üzenetet?
(#) hadnagyakos válasza potyo hozzászólására (») Jún 15, 2010 /
 
A Google-ban keresgéltem. Sajnos nem kaptam rá választ.

Szerk.:
A fórum keresőjében megtaláltam amit kerestem.
Máskot itt keresek először.
Bocsánatot kérek! :worship:
(#) bbazs hozzászólása Jún 15, 2010 /
 
Üdv mindenkinek!

Egy 4 csöves nixie órát készítenék, többféle változata van PIC el is, viszont én szeretnék hozzá egy másodpercmutatót is IN-9-es csővel.
Sajnos nemértek a PIChez, ezért kérnék segítséget, hogy hogyan lenne egyszerübb illeszteni egy ilyen csövet, az órához. Mindóssze ennyit találtam rolla link.
Köszi előre is.
(#) trudnai válasza bbazs hozzászólására (») Jún 16, 2010 /
 
Ez nem tul sok info, de nyilvan Neked kell a hazi feladatot megoldani, fel kell lelned a cso adatlapjat.

A PIC-bol tulajdonkepp TTL jel jon ki, ahhoz kell egy buffert meretezned, hogy az a csonek jo legyen.
(#) vilmosd válasza bbazs hozzászólására (») Jún 16, 2010 /
 
Hali
Nekem jott kb 221 000 talalat IN-9 nixie.
Udv Vili
(#) trudnai válasza hadnagyakos hozzászólására (») Jún 16, 2010 /
 
A fordításnál ezeket a hibaüzenetet kapom:
Idézet:
„Register in operand not in bank 0. Ensure that bank bits are correct”


Irtad megtalaltad, de nem irtad mit, igy ket megjegyzes:

1. Ez nem hibauzenet, hanem figyelmeztetes. Tehat ettol a kodod meg akar jo is lehetne, ill. akarmit is csinalsz, az uzenet meg fog jelenni (hacsak ki nem kapcsoltatod a figyelmeztetest, de az meg kicsit olyan, mint mikor a pilota leszallaskor kikapcsolja az alacsony magassagot jelzo pittyegest...)

2. Masik, hogy ne az RP0-at piszkaldd, hanem hasznaldd a BANKSEL makrot.
(#) hadnagyakos válasza trudnai hozzászólására (») Jún 16, 2010 /
 
Át is Írtam erre a megoldásra.
Köszi a segítséget!
(#) bankimajki hozzászólása Jún 16, 2010 /
 
Nem szeretek sokat tétlenkedni, úgyhogy 1 napos pihi után elkezdtem a PIC18-as családdal foglalkozni. De motoszkál bennem pár tény, amiben bizonytalan vagyok. Ezekre kérnék megerősítést, vagy javítást ha nem jól gondolom.
1. Van egy olyan teljesítménycsökkentési mód, hogy kikapcsoljuk a CPU órajelét és ekkor a perifériák tovább működnek. Ezt úgy kell értelmezni, hogy ugyanúgy reagál a megszakításokra. A TMR modul ugyanúgy számol.... stb.?
2. A Brown Out Reset működése. Simán csak annyi a lényege hogy a tápfesz. csökkenéskor a Reset folyamat indulásánál. Csak egy resetet csinál? (Mert ha reset közben ismét tápfesz csökk. van, az új resetet jelentene.)
Tehát amikor stabil a táp, csak akkor csinál egy resetet?
3. Mit is értsek a Reset alatt? Ebbe a stabil órajelbeállás is beletartozik? Szerintem igen, de nem vagyok benne teljesen biztos.
(#) potyo válasza bankimajki hozzászólására (») Jún 16, 2010 /
 
1. Igen, a PRI_RUN beállításnál ugyanúgy megy minden tovább, csak épp a processzora nem kap órajelet. A SEC_RUN beállításnál viszont a főoszcillátort is kikapcsolja és az órajelet a másodlagos oszcillátorról kapják a perifériák, ami lassúbb, mint a főoszcillátor, ezért más beállítást igényelhetnek.

2. Annyi a lényege, hogy ha a feszültség lecsökken a beállított érték alá, akkor resetbe húzza a kontrollert és ott is tartja, amíg nem emelkedik fel a feszültség a beállított érték fölé. Tehát nem csak egy impulzust ad, hanem folyamatosan resetben tartja, amíg a feszültség nem elég magas.

3. Attól függ, hogy milyen reset volt. Ha olyan reset volt, hogy az oszcillátor előtte nem futott, akkor igen, megvárja a stabil órajelet. De pl. egy RESET utasítás végrehajtásánál ugye már stabil az órajel, tehát akkor nincs semmi várakozás. Vagy pl. menet közben nyomsz neki egy resetet, akkor is azonnal indul a reset elengedése után, mivel az oszcillátor már közben futott.
(#) icserny válasza bankimajki hozzászólására (») Jún 16, 2010 /
 
Idézet:
„1. Van egy olyan teljesítménycsökkentési mód, hogy kikapcsoljuk a CPU órajelét és ekkor a perifériák tovább működnek.”
Ha a sleep módra gondolsz, ekkor nem ennyire egyszerű, mert azok a perifériák sem fognak működni, amelyek a CPU órajeléhez vannak kötve (pl. belső órajelre kötött vagy ahhoz szinkronizált timerek). Timer1 viszont a saját oszcillátorával mehet, aszinkron módban. Az interruptok általában fel tudják ébreszteni a CPU-t alvásból.
Idézet:
„2. A Brown Out Reset működése.”
Mindaddig folyamatosan resetben tartja a CPU-t, amíg a tápfeszültség alacsonyabb a beállított szintnél. Tehát amikor elegendően magas a tápfesz, akkor engedi csak el RESET-ből.
Idézet:
„3. Mit is értsek a Reset alatt?”
Adatlap, PIC18 felhasználói kézikönyv vagy a PICCOLO projekt
pár napja közétett fejezete elmondja.
(#) bankimajki válasza potyo hozzászólására (») Jún 16, 2010 /
 
Köszönöm. Majd ha lesz még kétes dolog, akkor írok.
(#) bbazs válasza trudnai hozzászólására (») Jún 16, 2010 /
 
Lehet rosszul tettem fel a kérdést, mivel nemértek a programozáshoz, ezért örülnék ha valaki segítene illeszteni egy ilyen csövet az Órához
Köszönöm előre is.
(#) vilmosd válasza bbazs hozzászólására (») Jún 16, 2010 /
 
Hali
Mivel nem tudjuk neked milyen orad van, igy eleg nehez a konkret megoldast kitalalni. Viszont ha szetnezel a neten sok kapcsolasi rajzot talalhatsz a IN-9, IN-13 kijelzohoz. Ezek altalaban analog megoldasok kivezerlesjelzohoz.IN-9 gugli.
Udv Vili
(#) vicsys válasza bbazs hozzászólására (») Jún 16, 2010 /
 
Szerintem neked nem az illesztéssel van a gondod, hanem a program megírásával. Jól gondolom?
(#) trudnai válasza bbazs hozzászólására (») Jún 16, 2010 /
 
A youtube nagyon szep videokat tarol, de ez sem a csoved adatlapjat nem tartalmazza sem pedig a kiindulasi kapcsolasi rajzot, igy nem tudjuk mi a gondod? Nekem sajnos nincs idom most masnak aramkoroket tervezni, ha elakadsz valahol, es tudok segiteni, akkor nagyon szivesen! Csak akkor kerlek irdd meg, hogy eddig mit csinaltal vagy terveztel es miben vannak ketelyeid vagy mi nem mukodik...
(#) miklosch hozzászólása Jún 16, 2010 /
 
16F883-ra C-ben írok programot és olyat szeretnék, hogy ha egy feltétel igaz kb. négy szint mélységben, akkor reseteljen. Hogyan tudom ezt megoldani? Olyannal próbálkoztam, hogy inline assemblybe gotoval a főfüggvénybe ugrottam, de ez nem bizonyult jónak, mert pl. a stack-et nem törli.
(#) potyo válasza miklosch hozzászólására (») Jún 16, 2010 /
 
Érdekes feladatnak hangzik, de szerintem valami nem stimmel a megvalósításnál, ha a kontrollert bizonyos esetben resetelni kell. Úgy kellene kitalálni, hogy ne kelljen resetelni. Tudsz többet mondani a feladatról?
(#) miklosch válasza potyo hozzászólására (») Jún 16, 2010 /
 
3 db RS485 hurkot kérdez le egymás után, és beállítható, hogy egy hurkon hány készülék van. Ezt a beállításokból szeretném megváltoztatni. Viszont a beállítások menü a hurkok lekérdezése közben érhető el hosszú gombnyomással. Így ha megváltoztatom a számokat, mindenképpen újra kéne kezdenie az egész program futtatását, hogy az inicializálásokba is bekerüljön a változás. Viszont ha simán folytatom a programot, akkor elképzelhető, hogy olyan helyre futna, ami már nem létezik.
(#) Hp41C válasza miklosch hozzászólására (») Jún 16, 2010 /
 
Szia!

Vezess be egy szamafort: A ciklusban szabad-e továbbmenni. A ciklus minden eszköz lekérdésének megkezdése előtt kérdezze le, hogy szabad-e tovább lekérdezni. Ha szabad mehet minden tovább, ha nem kilép a lekérdező rutinból. A beállítás memüpont az érvényesítéskor átállítja a szemafort - nem szabad tovább lekérdezni. A fő program az újraszervezett lekérdezés kezdetén visszaállítja szabadra...
(#) vicsys válasza miklosch hozzászólására (») Jún 16, 2010 /
 
CCS C ben van ilyen:
  1. if(checksum!=0)
  2. reset_cpu();

Ez nem lenne jó...?
(#) miklosch válasza vicsys hozzászólására (») Jún 16, 2010 /
 
HI-TECH PICC fordítót használok, úgy tudom, hogy ebben nincsen ilyen. Még arra gondoltam, hogy alapesetben nem használom a watchdogot, de ha bekapcsolom, és belépek egy végtelen ciklusba, akkor resetelni fog. A lényeg az lenne, hogy legalább 4 mélységből kell visszatérni, ha változtak a beállítások, így gondoltam, hogy legegyszerűbb a reset.
(#) olala hozzászólása Jún 16, 2010 /
 
Jó estét Mindenkinek!

USART kommunikációt szeretnék megvalósítani egy 18F4550-es PIC és egy PC között. C18-at használok a programozáshoz.
Megírtam hozzá egy inicializáló függvényt és egy másikat, amely bájtonként adatokat küld a PC felé. Sajnos a két eszköz nem érti megy egymást, a PC-n terminál progival (RealTerm) nézem a beérkező adatokat, de csupa értelmetlen karaktersorozatot látok és minden karakter ugyanaz, teljesen mindegy hogy más és más karaktereket akarok küldeni. Amikor egy karaktert küldök, a PC-n kettő jelenik meg vagy több. A küldés közben folyamatosan villog a RealTerm ablakában az Error és a BRAKE visszajelző gombja. Próbáltam különböző Baudrate értékeket beállítani, figyelembe véve hogy a hiba a lehető legkisebb legyen, de semmi javulást nem tapasztaltam, esetleg annyit hogy kevesebbet világított az Error gomb.
A PIC mellett egy 20MHz kristályt használok két 15pF kondi társaságában. Próbáltam már azt is, hogy belső 8MHz osszcillátor ketyegjen a cuccban de ez sem oldotta meg a problémát.
Elküldöm a két függvényt, a bájtonként beírós egy karakterláncot kap bemenetnek, amelyet karakterenként átküld USART-on.

  1. void InitUSART (void)
  2. {
  3.         #define CLKFRQ 20000000
  4.         #define SYNC_   0
  5.         #define BRG16_  0
  6.         #define BRGH_   0
  7.         #define BAUDRATE        2400
  8.  
  9.         #if !SYNC_ && !BRG16_ && !BRGH_
  10.                 #define OSZTO   64
  11.         #elif ( BRG16_ || BRGH_) && !SYNC_
  12.                 #define OSZTO   16
  13.         #else
  14.                 #define OSZTO   4
  15.         #endif         
  16.        
  17.         #define BAUD(X) ((CLKFRQ/OSZTO)/X)-1
  18.  
  19.         _asm
  20.                 clrf SPBRG, 0
  21.                 clrf TXSTA, 0
  22.                 clrf RCSTA, 0
  23.                 clrf TXREG, 0
  24.                 clrf RCREG, 0
  25.         _endasm
  26.  
  27.         TRISCbits.TRISC6 = 1;   //TX - kimenő - 1
  28.         TRISCbits.TRISC7 = 1;   //RX - bejövő - 1
  29.  
  30.         SPBRG = BAUD( BAUDRATE );       //BAUDRATE kbps
  31.         BAUDCONbits.BRG16 = BRG16_;
  32.  
  33.         //8bit, TX bekapcsol, asszinkron,
  34.         TXSTAbits.SYNC = SYNC_;
  35.         TXSTAbits.BRGH = BRGH_;
  36.         TXSTAbits.TXEN = 1;
  37.  
  38.         RCSTA = 0b10010000;     //Soros port be, 8bit, X, folyamatos fogadás
  39.         PIR1 &= 0b11001111;     //RC és TX flag törlése PIR1_5:4
  40.         PIE1 |= 0b00110000;     //RC és TX megszakítás engedélyezése PIE1_5:4
  41. }


  1. unsigned char cString_USART_TX[] = "Ez a teszt!";
  2. USARTWriteString(  cString_USART_TX );
  3.  
  4. void USARTWriteString( char *str )
  5. {
  6.         static unsigned char cPos_Char = 0;
  7.         if ( *(str + cPos_Char) != '\0' )
  8.         {
  9.                 //Write data
  10.                 TXREG = *(str + cPos_Char);
  11.  
  12.                 //Next goto char
  13.                 cPos_Char++;
  14.         }
  15.         else cPos_Char = 0;
  16. }


Nem tudom hol lehet a gond, de valami miatt olyan mintha a küldés beragadna, és nem fejezi be a karakterlánc végén, ezért küldi ismételten azt a millió ugyanolyan karaktert. A másik dolog (illetve összefügg az előzővel) amit észrevettem debug üzemmódban, az az hogy a TX Flag állandóan aktiválódik, még azelőtt hogy mind a 8bitet elküldhetné a hardver. Ha jól tudom, akkor csak a teljes bájt átvitele után kellene beállnia egybe. Ja, és persze minden megszakításrutinba való belépés után törlöm a TXIF-t, tehát nem ezért ugrik vissza.

Felrakom az egész projectet tömörítve, de nem véletlenül emeltem ki belőle a lényeges részeket, mert sok mellékes dolog is van benne (ez egy sablonprojectből lett továbbírva, így tele van feltételes fordításokkal, de nagyon sok időt spórolok a használatával, mert nem kell minden projectet a nulláról kezdeni).

Remélem valaki tud segíteni!
Előre is köszönöm!

usart.zip
    
(#) miklosch válasza olala hozzászólására (») Jún 16, 2010 /
 
  1. TRISCbits.TRISC6 = 1;   //TX - kimenő - 1
  2. TRISCbits.TRISC7 = 1;   //RX - bejövő - 1

Ez így biztosan jó? A TX kimenet az RX bemenet.
A másik meg, hogy próbáld meg, hogy megvárod, míg kiküldi a processzor az adott karaktert, és utána küldöd a következőt, mert lehet, hogy teletölti a TX buffert, és megzavarodik.
Pl én így csinálnám a szting adást:
  1. void usart_puts(const char * s)
  2. {
  3.         while(*s)
  4.         {
  5.                 TXREG=(*s++);
  6.                 while(!TRMT);
  7.         }
  8.         return;
  9. }
(#) szilva válasza olala hozzászólására (») Jún 17, 2010 /
 
Egyrészt a TXREG feltöltése után nem vársz semmit, így lazán egymásra írod a karaktereket, még mielőtt azok szépen kisorjáznának a soros vonalon. Próbálj meg várni a foglaltság elmúlására, például úgy, ahogy miklosch is mutatta, vagy a TXIF figyelésével.

Másrészt ha jól láttam az adatlapban (csak belekukkantottam reggel eljöttömben, most nincs előttem) a TXIF-et nem lehet törölni, hanem az a TXREG mindenkori állapotát tükrözi hardveresen. Azaz ha feltöltöd a TXREG-et, akkor törlődik, majd miután a TXREG kiürült, újra aktív lesz, jelezvén, hogy újabb karaktert írhatsz a TXREG-be. A legelső beírás után valóban tűnhet úgy, hogy azonnal visszavált aktívra, mivel a TXREG-ből azonnal átkerül az adat a kimeneti léptetőregiszterbe. Viszont a második karakter beírása után majd csak akkor válik újra aktívvá, ha a léptetőregiszter kiürül, és a TXREG-ből át tudja tenni a következő karaktert a léptetőregiszterbe. Egyébként ezek mind szépen le vannak írva az adatlapban, még idődiagramokat is láttam.

A fentieken kívül persze lehet még baud rate beállítási gond is (a leírt jelenség erre utal is amúgy a sok framing error és értelmetlen karakter miatt), azt nem ellenőriztem az adatlapból, hogy jól számolod-e a baud rate generátor konstansokat. Az adatlapban erre is van egy jópár táblázat, érdemes lenne megdebugolni a kódot, és megnézni, mit ír a baud rate regiszterekbe, majd ezt a táblázatok alapján ellenőrizni.

Másik ellenőrzési mód, ha az USART felprogramozása után (8N1 formátum) írsz egy végtelen ciklust, ami 0x55 karaktereket küld ki folyamatosan a soros porton (pl. a miklosch féle ciklus mintájára). A PIC TX lábára egy frekimérőt téve pont a kívánt bitsebesség felét kell, hogy mérd, pl. 9600bps esetén 4800Hz-et.
Következő: »»   759 / 1320
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