Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   364 / 1210
(#) n_yálastrubadúr válasza AZA hozzászólására (») Feb 5, 2013 /
 
Igen mert kiolvasom az RCREGET. De most minden flag-et trölök tmr0,tmr1,tmr2,rb4-7, rb0, az egész pir1-et. De mindig beragad a megszakításba.
(#) n_yálastrubadúr hozzászólása Feb 5, 2013 /
 
És ezt akkor csinálja, ha a Pickit2-ben nyomom az adatokat mint az őrült. Ha 2-3 byte-ot küldök kisebb eséllyel és később fagy be. Az se érdekel most hogy jó a vétel vagy sem. De ne ragadjon már bele a megszakításba!!!
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 5, 2013 / 1
 
Idézet:
„- Kötelező kiolvasni az RCSTA -t, minden adat kiolvasása előtt egyszer. A teszteket egy másolaton kell végezni. El kell dönteni, hogy van-e ráfutási vagy keretezési hiba.”

Az alábbi kód már évek óta jól működik nekem....
  1. btfss   PIR1,RCIF                       ; Is it a receive interrupt
  2.                 goto    INT_UART_TX
  3.  
  4.                 movf    UartRxChWp,w            ; Put receive char to buffer if no error
  5.                 movwf   FSR
  6.                 movf    RCSTA,w                         ; Check for error
  7.                 andlw   (1<<FERR) | (1<<OERR)
  8.                 btfss   STATUS,Z
  9.                 goto    UART_ERR                        ; If error not to read char
  10.                 movf    RCREG,w                         ; Read character
  11.                 movwf   INDF                            ; Write it to buffer
  12.                 incf    FSR,w                           ; Move pointer in circular way
  13.                 andlw   0x0F
  14.                 iorlw   low(UartRxChar)
  15.                 movwf   UartRxChWp
  16.                 incf    UartRxChNum,f           ; Sign one more char in buffer
  17.                 goto    INT_UART_TX
  18.  
  19. UART_ERR                                                        ; Receive error, reenable receive
  20.                 movf    RCREG,w                         ; Clear receive interrupt flag, drop character
  21.                 bcf             RCSTA,CREN                      ; Turn off receiver
  22.                 nop
  23.                 bsf             RCSTA,CREN                      ; Turn on  receiver
  24.  
  25. INT_UART_TX                                                     ; Is it a transmit interrupt
(#) AZA válasza n_yálastrubadúr hozzászólására (») Feb 5, 2013 /
 
Üdv!
FERR,OERR bit csak olvasható,nem tudod törölni.
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Feb 5, 2013 /
 
Szia!
Egy az egyben lemásoltam a programod! A problémám biztosan banális! Mert most is ugyanúgy kifagy.
(#) Hp41C válasza AZA hozzászólására (») Feb 5, 2013 /
 
A PIR1 RCIF és TXIF bitjei is csak olvashatók. Törlésük az RCREG kiolvasásával illetve a TXREG írásával lehetséges.
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 5, 2013 /
 
Akkor a felprogramozás lehet rossz. Előbb Baud generátort kell beállítani, aztán a formátumot. Külön művelettel engedélyezni a vevőt / adót. Ez után kell a megszakításukat elgedélyezni. A beragadásnak más oka is lehet. Egy másik egység kér megszakítást, amit a kiszolgáló nem kezel le, így kilépés után egyből a kiszolgáló fut le. Mindaddig így fog működni, amíg a kiszolgáló program nem törli a megszakítás okát.

Szimulátorban futtatva meg tudod állapítani, hogy melyik egység kéri a megszakítást. Az UART vétele egy register injection stimulussal szimulálható.
Idézet:
„Egy az egyben lemásoltam a programod!”

A sok saját szimbólumommal hogyan küzdött meg a fordító?
A hozzászólás módosítva: Feb 5, 2013
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Feb 5, 2013 /
 
Nincsen más megszakítás beállítva. A kód pedig így jön sorban.
  1. movlw   .25
  2.         movwf   SPBRG
  3.         movlw   0x24
  4.         movwf   TXSTA
  5.         bcf             STATUS,5
  6. ;#############################################  
  7.  
  8.         BANKSEL ANSEL
  9.         clrf    ANSEL
  10.         clrf    ANSELH
  11.         BANKSEL PORTA
  12.  
  13.         banksel PIE1
  14.         clrf    PIE1
  15.         bsf             PIE1,RCIE
  16.         banksel PORTA
(#) n_yálastrubadúr hozzászólása Feb 5, 2013 /
 
Megnéztem a TMR0 és a TXIF flag-je 1. Ezeket törlöm a megszakításban, akkor is kifagy. Tényleg fogalmam sincsen mi lehet ez. Lehet hogy rossz a pic?
Kipróbáltam egy másikkal ugyanaz
A hozzászólás módosítva: Feb 5, 2013
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Feb 5, 2013 /
 
Nagyon szépen köszönöm! Tudtam, hogy ez banális lesz, a probléma a TXIF volt! Mert én csak töröltem a flag-et, amit ugye nem lehet. Most hogy írom, nem fagy be. De azt is próbáltam , hogy kikapcsolom az adót, de akkor hülye adatokat vesz. Nem lehet kikapcsolva ha megy a vevő?
A hozzászólás módosítva: Feb 5, 2013
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 5, 2013 /
 
Elég, ha a IRE1 TXIE bitjét 0 -ra állítod, ha nincs mit adni.
A hozzászólás módosítva: Feb 5, 2013
(#) k_h hozzászólása Feb 5, 2013 /
 
Sziasztok!
Segítség kellene. Pic16f690-et szeretnék programozni, de valamiért sehogy se jön össze. WinPic 800-as progit használok, és Pro Pic-2-es programozót, párhuzamos portról megy, saját készítésű. A jelek megvannak, beállítgattam melyik legyen invetálva meg minden... de nem ismeri fel az ic-t, bár be is van állítva a tipus, égetéskor akkor is az első bájtra hibát jelez. kiolvasásra minden 3FFF-en van. Teljesen tanácstalan vagyok mit csinálok nem jól már 100 szor átnéztem minden a megfelelő lábra van-e kötve.
(#) k_h válasza k_h hozzászólására (») Feb 5, 2013 /
 
Úgy néz ki megoldódott, kivettem az íc-t az áramkörböl, és rövid vezetékkel kötöttem a programozóhoz. Így jó lett. Vagy a madzag volt hosszú vagy nem tetszett neki, hogy benne van az áramkörben.
(#) n_yálastrubadúr hozzászólása Feb 5, 2013 /
 
Most már jó az abszolút probléma, de visszatérve c-re még mindig ottvan a megint érdekes jelenség. Már nem fagy be, de egyáltalán nem értem, hogy a kinti feldolgozás miért rontja el a vételt, vagy nemtudom micsinál de nem jó a kapott érték. Ellentétben ha kint csak ráírom binárisan egy portra akkor sosem rontja el a fogadott értéket. Ha viszont ugyanaz a 8 bit decimálisan van kiírva, akkor tök hülye. De ott is ha hosszabb időt hagyok a multiplexálás kapcsolgatására akkor megint az az érték jön amit küldök. Ennyire nem szívattam magam még a pic egyik moduljával sem, sokáig nem programoztam, ez meg is látszik.
(#) n_yálastrubadúr hozzászólása Feb 5, 2013 /
 
Szerintem az lesz a baj, hogy a megszakítás nem ment rendesen? Mert ha binárisan kiírom akkor semmilyen Status bitet nem használok, ha decimálissá alakítom, akkor kell a Status, ezért írhat hamis értékeket. De ma már kérdeztem, de nem bizonyosodtam meg 100% ra. Hol van a visszatöltés a megszakításban?
  1. 51:                
  2. 52:                void interrupt my_isr (void){
  3.   0004    00FE     MOVWF 0x7e
  4.   0005    0E03     SWAPF STATUS, W
  5.   0006    00F0     MOVWF 0x70
  6.   0007    080A     MOVF PCLATH, W
  7.   0008    00F1     MOVWF 0x71
  8.   0009    120A     BCF PCLATH, 0x4
  9.   000A    118A     BCF PCLATH, 0x3
  10.   000B    2886     GOTO my_isr
  11. 53:                     char trash;
  12. 54:                
  13. 55:                     if ( FERR | OERR ) {
  14.   0086    3000     MOVLW 0
  15.   0087    1283     BCF STATUS, 0x5
  16.   0088    1303     BCF STATUS, 0x6
  17.   0089    1918     BTFSC RCSTA, 0x2
  18.   008A    3801     IORLW 0x1
  19.   008B    1898     BTFSC RCSTA, 0x1
  20.   008C    3801     IORLW 0x1
  21.   008D    3800     IORLW 0
  22.   008E    1903     BTFSC STATUS, 0x2
  23.   008F    2896     GOTO 0x96
  24. 56:                             CREN = 0;
  25.   0090    1218     BCF RCSTA, 0x4
  26. 57:                             #asm
  27. 58:                                     nop
  28.   0091    0000     NOP
  29. 59:                             #endasm
  30. 60:                              CREN = 1;
  31.   0092    1283     BCF STATUS, 0x5
  32.   0093    1303     BCF STATUS, 0x6
  33.   0094    1618     BSF RCSTA, 0x4
  34. 61:                             trash = RCREG;}
  35.   0095    081A     MOVF RCREG, W
  36. 62:                    
  37. 63:                     dat = RCREG;
  38.   0096    081A     MOVF RCREG, W
  39.   0097    00F4     MOVWF dat
  40. 64:                     TXREG = 0 ;
  41.   0098    0199     CLRF TXREG
  42. 65:                }
  43.   0099    0871     MOVF 0x71, W
  44. 66:                
  45. 67:                const char table[10]={0xED,0xC,0xBB,0x3F,0x5E,0x77,0xF7,0x2C,0xFF,0x7F};
  46. 68:                
  47. 69:                     void main () {
(#) mhatalyak hozzászólása Feb 5, 2013 /
 
Sziasztok!

Valaki ismeri a "Tanuljuk meg a C++ programozási nyelvet 24 óra alatt" c. könyvet? Ebből esetleg meg lehet tanulni a PIC programozást?
(#) icserny válasza mhatalyak hozzászólására (») Feb 5, 2013 /
 
1. Nem
2. Ebben a topikban már számos szakirodalmat ajánlottunk PIC16-hoz, PIC18-hoz és PIC24-hez. Bővebben: Link
(#) benjami válasza mhatalyak hozzászólására (») Feb 5, 2013 /
 
Azért ne keverjük össze a C és a C++ nyelvet egymással. A C++ a C nyelv kiegészítése az objektumorientált dolgokkal. Ezt nem nagyon használjuk mikrovezérlőkhöz, egyrészt a szűkös memória miatt, másrészt a hardverközeli programokhoz nem is annyira szükséges ez. Maradjunk meg a sima C-nél.
(#) llaczo hozzászólása Feb 6, 2013 /
 
Sziasztok.
12F675 analog bemenetnél azt vettem észre hogy 0-tól 5 volt feszültségnél nem megy fel az érték 0-tól 1024-ig hanem csak kb. 550-ig. Az adatlapról már kipróbáltam mindent (?). Kínomban, (lesz ami lesz) megnöveltem az analog bemeneten a feszt egész 12 voltig és láss csodát nem ment tönkre a PIC hanem felfutott kb. 800-ig. Itt már kezdte növelni az 5 volt táp feszt is és nem mentem tovább. Találkozott már valaki ilyen jelenséggel, vagy mit hagytam ki az adatlapon. Ezekkel a beállításokkal a legjobb. Szimulátoron kitűnően működik. a valóságban már nem.
AN 0
ANSEL: 00100001
ADCONO: 10000011
TRISIO: 00000001
CMCON: 00000111
(#) Kovabe válasza llaczo hozzászólására (») Feb 6, 2013 /
 
Szia C-ül nem beszélek de olyan mintha az 5V-rol valami ellenállással csatlakoznál és igy már mint egy feszültségosztó jön létre és azért lehet hogy nem jön meg a teljes 5V-t.
(#) icserny válasza llaczo hozzászólására (») Feb 6, 2013 /
 
Idézet:
„Itt már kezdte növelni az 5 volt táp feszt is”
Az ilyen akciókat jó lenne mellőzni, mert tönkreteheted vele a mikrovezérlőt! Jó lenne, ha kapcsolást és teljes programot mutatnál, mert lehetséges. hogy:
- Túl nagy ellenálláson keresztül jut az analóg bemenetre a jel
- Túl kevés idő marad az ADC mintavevő-tartó áramköre kondenzátorának feltöltésére.

Egyszóval nem tartod be az adatlapi ajánlásokat.
(#) n_yálastrubadúr hozzászólása Feb 6, 2013 /
 
A probléma biztosan nyelvtani. Egész éjszaka próbáltam minden megoldást, már semmi ötletem sem maradt és átírtam a dissasembly-jét asm-be. Úgy működik. Megpróbálom érthetően leírni. A probléma az, hogy amit veszek a vevővel. (most megszakításon kívül és minden hibakezelés nélkül, csak egy működik nem működik módon) ki szeretném íratni decimálisan. De rossz értéket ír ki! Na de a konverter jó mert ha direkt feltöltöm mondjuk 223-al akkor helyesan azt írja ki, aznonban a vevőm értékét binárisan írom ki akkor az is jó. Ezzel nemtudom kizárni így a hibát. És a tetejébe ugyanez a program listázott kódja beírva sima asm.be decimálisan is működik. Kiszedtem a táblázatot és csak az egyesek (num) értékét nézem, leegyszerűsítettem teljesen 1000 dolgot variáltam, de sehogy sem jó.
A hozzászólás módosítva: Feb 6, 2013

887usart.c
    
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 6, 2013 /
 
Szia!
A char num = 0; char numt =0; char numh = 0; sort tedd a for ciklusba az xxx = dat; el; vagy közvetlenül utána.
Sem ez a programozott sem a kikommentezett megszakításos megoldás nem lesz jó. Ld. amit már készer leírtam...
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Feb 6, 2013 /
 
Beletettem amit mondtál. -nem változott- Te most a vevő dolgára gondolsz, hogy nem lesz jó? De nekem a bajom hogy nem tudom decimálisan úgy ki írni hogy az is legyen mint ami tényleg benne van, ez binárisan kiírva pedig helyes. Ez a nagy problémám. Az a része jó amikor nem a táblát hívom csak a num regisztert vizsgálom, ha 0 akkor ha egy akkor .. ??
A hozzászólás módosítva: Feb 6, 2013
(#) n_yálastrubadúr hozzászólása Feb 6, 2013 /
 
Nemtudom mennyire lehet érteni mi a bajom, de megpróbáltam úgy kommentezni, hogy világosabb legyen. Persze nem így írnám assemby-sen, csak már fogalmam sincs miért csak bináris értékekben jó..
szerk: Ja és nagyon fontos hogy a decimális alakító az jó mert ha fix értéket vagy egy ad mérés van előtte akkor ok. De arra vagyok kíváncsi hogy a vevő miért jó binárisan és akkor miért nem jó átalakítva. Ezt a logikátlanságot nem bírom felfogni! Mi a magyarázat?
A hozzászólás módosítva: Feb 6, 2013

887usart.c
    
(#) Stefan válasza n_yálastrubadúr hozzászólására (») Feb 6, 2013 /
 
Én kipróbálnám, hogy mi van ha "unsigned char" változókat használsz.
(#) n_yálastrubadúr válasza Stefan hozzászólására (») Feb 6, 2013 /
 
Most kipróbáltam nemjó sajnos.
(#) n_yálastrubadúr válasza n_yálastrubadúr hozzászólására (») Feb 6, 2013 /
 
Akkor szerinted azért nemtudom átalakítani mert rossz a vételi program? Értelmeztem amit tegnap küldtél, nincsen benne az a mutató kezelő nemtudom mi. Csak egy egyszeri vételnek jó ez így?
  1. void interrupt my_isr (void){
  2.         char trash;
  3.  
  4.         if (FERR == 1 | OERR == 1) goto uart_err;
  5.  
  6.         dat = RCREG;
  7.  
  8.         goto    fin;
  9.  
  10. uart_err:
  11.         trash = RCREG;
  12.         CREN = 0;
  13.         asm ("nop");
  14.         CREN = 1;
  15. fin:   
  16.         asm ("nop");
  17. }


Egyébként még most is ugyanaz a probléma, de lövésem sincsen, hogy mivel a baj, mert assembly-ben működik még akkor is jó ha csak kiolvasom és kész. De ez itt is jó, DE itt csak binárisan korrekt.
(#) Hp41C válasza n_yálastrubadúr hozzászólására (») Feb 6, 2013 /
 
Szia!
Ha binárisan jó a kiírás a következő problémák jöhetnek elő:
- Nem felel meg a hétszegmenses átkódoló táblázat a bekötésnek, polaritásnak , tűl gyors a 4 us -es váltás és elmosódnak a minták.
Tegyél fel egy olvasható rajzot és az egész programot, amiből megállapítható, hogyan vannak bekötve a szegmensek.

Állítsd be a MpLab szimulátorát és minden kipróbálható lépésenként. Az uart szimulálásához készíts egy regiszter injection stimulus (2).
A hozzászólás módosítva: Feb 6, 2013
(#) n_yálastrubadúr válasza Hp41C hozzászólására (») Feb 6, 2013 /
 
A programban felírtam melyik láb melyik szegmens. De 1us-al sem rossz minden mást normálisan átalakít! És rendesen kiír. Ha pl egy fix érttékkel töltöm fel vagy egy folyamatason növelt regiszer értékét is rendesen követi, az a/d értékét is helyesn írja ki! Csak az usart-ot nem! Ezért nincsen fogalmam se hogy miért nem!? Ha binárisan meg írom az usartot nem téved!

887usart.c
    
Következő: »»   364 / 1210
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