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   582 / 1210
(#) lastewer válasza don_peter hozzászólására (») Okt 23, 2014 /
 
Helló , működik igen , köszönöm. Lassabb villogást , hogy lehetne elérni ? Átírtam a
  1. __delay_ms(100);
- at ,
  1. __delay_ms(1000);
- re , de nem történt változás. Miért?
(#) don_peter válasza lastewer hozzászólására (») Okt 23, 2014 / 1
 
Oda maximum 255-öt írhatsz azt hiszem.
2 dolgot tudsz csinálni. egyik:
Ha duplázod az időzítéseket...
  1. __delay_ms(255);__delay_ms(255);__delay_ms(255);__delay_ms(255);

Vagy ha írsz egy rutint hozzá:
  1. void delay(char szam){
  2. char i;
  3. for(i=0; i<szam; i++){
  4. __delay_ms(255);
  5. }
  6. }
  7. //meghívása pedig
  8. delay(10);    // ez most 10szer fogja a __delay_ms(255);-öt meghívni egymás után

Nyilván ez már rugalmas, úgy használod vagy alakítod át ahogyan akarod.
A hozzászólás módosítva: Okt 23, 2014
(#) lastewer válasza don_peter hozzászólására (») Okt 23, 2014 /
 
Kössz szépen , megy
(#) lastewer válasza don_peter hozzászólására (») Okt 23, 2014 /
 
Ezeket tudom valahol tesztelni , szoftveres módon , hogy ne kelljen mindig beleprogramoznom a pic-be?
(#) don_peter válasza lastewer hozzászólására (») Okt 23, 2014 /
 
Proteus programban.
Az egy virtuális építő és tesztelő program..
Nagyon jó.. 90%-ban jól működik..
(#) don_peter hozzászólása Okt 23, 2014 /
 
Uraim, C18-ban szeretnék USART-ről adatokat fogadni.
Ezzel próbálkozom:
  1. ReadUSART();

Jól teszem?

1 byte-ot szeretnék olvasni majd kitenni portra, hogy lássam működik e..
A programot amit írtam feltettem, ha valakinek pont van ilyen projektje az kipróbálhatná, hogy működik e a dolog.
putty és virtuális serial port jelzi, hogy működik, de élesben még nem tudtam kipróbálni.
A lényeg, hogy szeretném fogadni az USART (RX/TX) -on keresztül az adatokat.
Kérném segítségeteket..
Köszi előre is..

dptp_zpm.rar
    
(#) Pali79 válasza lastewer hozzászólására (») Okt 23, 2014 /
 
Mplab Simulator
(#) lastewer hozzászólása Okt 23, 2014 /
 
Köszönöm
(#) lastewer hozzászólása Okt 23, 2014 /
 
Ha azt szeretném , hogy villanjon 3 - at majd szünet , és megint 3 at és így tovább , akkor elméletben az úgy jó lenne ha
  1. void delay(char szam){
  2. char i;
  3. for(i=0; i<szam; i++){
  4. if(i %2 == 0) { __delay_ms(100) }
  5. __delay_ms(255);
  6. }
  7. }



Tehát minden páros számnál betenne egy villanást + - ba. Ezt hogy lehetne?
(#) don_peter válasza lastewer hozzászólására (») Okt 23, 2014 /
 
A delay()-al a ciklus késleltetését állítod be.
De ha csak a delay() -t akarod változtatni cikluson belül akkor jó lehet amit írtál.
Bár itt én inkább a delay()-t hagynám simán késleltetésnek és a while() cikluson belül csinálnék egy külön feltétet amiben számolnám a ciklus számát és annak megfelelően engedném a led villogását...
(#) Qju válasza lastewer hozzászólására (») Okt 23, 2014 /
 
Vagy ha írsz egy olyan egyszerű rutint hozzá amely pontosan azt teszi amit akarsz
  1. void xmsdelay(char szam)
  2. {
  3. char i;
  4. for(i=0;
  5. i<szam;
  6. i++)
  7. {
  8. __delay_ms(1);
  9. }
  10. }
  11. //meghívása pedig
  12. xmsdelay(1000);    // ez most 1000 szer fogja a __delay_ms(1);-öt meghívni egymás után
A hozzászólás módosítva: Okt 23, 2014
(#) don_peter hozzászólása Okt 23, 2014 /
 
Srácok mit nézek be ennyire?
Ne tudok adatot fogadni USART-on keresztül:
  1. #include <usart.h>
  2. #include <stdio.h>
  3. #include <delays.h>
  4. #include <stdlib.h>
  5. #include <p18f4550.h>
  6. #include "header.h"
  7.  
  8. void main(void){
  9.         char result, i=0;
  10.         TRISA=1;
  11.         TRISB=TRISC=TRISD=TRISE=0;
  12.         ADCON1 = 0x0F;  //Minden port legyen digitális
  13.         CMCON = 7;              //comparators kikapcsolva
  14.        
  15.         // configure USART
  16.         OpenUSART( USART_TX_INT_OFF &
  17.         USART_RX_INT_OFF &
  18.         USART_ASYNCH_MODE &
  19.         USART_EIGHT_BIT &
  20.         USART_CONT_RX &
  21.         USART_BRGH_HIGH,
  22.         25 );
  23.        
  24.         while(1){      
  25.                 if(DataRdyUSART()){     // Ha érkezik adat
  26.                         LATAbits.LATA1 = !LATAbits.LATA1;       // Ledel is jelezzük
  27.                         Delay10KTCYx(1);        // Pici pihi
  28.                         result = ReadUSART(); // Az érkező adat
  29.                         WriteUSART(result);     // A vett adatot vissza is küldjük
  30.                         Delay10KTCYx(12);       // Pihi
  31.                         if(result=='e'){ LATD |= 0x01; }
  32.                         if(result=='k'){ LATD |= 0x08; }
  33.                         if(result=='t'){ LATD = 0x00; }
  34.                         Delay10KTCYx(12);
  35.                 }
  36.  
  37.                 Delay10KTCYx(150);
  38.         }
  39.         CloseUSART();
  40. }

Nem értem miért nem fogadja a beérkező adatot mert azt látom, hogy érkezik, de rá sem hederít a PIC.
Élesben sem.....
Előre is köszi.. (MPLAB + C18, 18F4550 + 20MHz + PLL4 (48MHZ))
A hozzászólás módosítva: Okt 23, 2014
(#) Birs Alma válasza Qju hozzászólására (») Okt 23, 2014 /
 
char típus itt nem 8 bit? Ha igen, akkor 12. sor nem lesz jó.
(#) Hp41C válasza don_peter hozzászólására (») Okt 23, 2014 / 1
 
Azt várod el, hogy mindig mi nézzünk a probléma után az adatlap(ok)ban:
A 18F4550 adatlapjából:
Idézet:
„The pins of the Enhanced USART are multiplexed
with PORTC. In order to configure RC6/TX/CK and
RC7/RX/DT/SDO as an EUSART:
• SPEN bit (RCSTA<7>) must be set (= 1)
• TRISC<7> bit must be set (= 1)
• TRISC<6> bit must be set (= 1)”

A programodban pedig a 11 sorban:
  1. .... TRISC = 0; ...
(#) don_peter válasza Hp41C hozzászólására (») Okt 23, 2014 /
 
Ha mér végkép nem találom a hibát...
Valamiért mindig átsiklok e lényeges részeken..
Köszi...
(#) patrik81 hozzászólása Okt 24, 2014 /
 
Sziasztok!

Össze szeretném hozni a nyomógombos programot,az LDC-sel,de csak annyit csinál,hogy gombnyomásra felvillan az RC0-ás LED (amíg nyomom a gombot), akkor kiír az LCD-re egy a-betűt,elengedéskor kialszik a LED.Ha nem teszem bele az LcdAdat('a'); sort,akkor úgy működik a LED,ahogy azt én szeretném,hogy első gombnyomásra felvillan,másodikra kialszik,elengedéskor nem csinál semmit.Tehát azt hogy kell megcsinálni,hogy az első gomlenyomásra felvillan a LED,és vele egyidejűleg kiír adatokat az LCD-re,második gombnyomásra kialszik a LED,és mondjuk letörli a kijelzőt?
(#) Birs Alma válasza patrik81 hozzászólására (») Okt 24, 2014 /
 
Kimásoltam a programod main fg-ét, és kicsit módosítottam. Próbálj ki valami ilyesmit:

  1. int main()
  2. {
  3.     char paritas = 0 ;
  4.  
  5.     ANSEL = ANSELH = 0;  // digitális adat
  6.     TRISC = 0;           // RC0 kimenet (LED)
  7.     TRISA = 0;           // PORTC és PORTA az LCD vezérléshez
  8.     TRISB7 = 1;          // RB7 bemenet (nyomógomb)
  9.     LcdInit();
  10.     while(1)
  11.     {
  12.         while(RB7);  //lenyomásig itt várakozik
  13.         if (paritas)   // ha most második gombnyomásról van szó
  14.         {
  15.             // akkor kikapcsoljuk a led-et és letöröljük a képernyőt
  16.             RC0 = 0 ;
  17.             LcdParancs(CLR_LCD)  ;
  18.             paritas = 0 ;
  19.         }
  20.         else
  21.         {
  22.             // küönben meg bekapcsoljuk  led-et és kiírjuk az A betűt
  23.             RC0=1 ;
  24.             LcdAdat('a');
  25.             paritas = 1 ;
  26.         }
  27.         while(!RB7) ; //felengedésig itt várakozik
  28.     }
  29. }


(!! Nem fordítottam le, nem próbáltam ki, ez csak javaslat !! )
A hozzászólás módosítva: Okt 24, 2014
(#) cross51 hozzászólása Okt 24, 2014 /
 
Sziasztok!
Rég foglalkoztam már PWM-el(CCP,ECCP) és nem emlékszem rá, hogy ha a PWM modul a timer2-ről megy és a timer2 túlcsordul akkor törölni kell e a TMR2IF-et vagy nem probléma ha nem törlöm?
(#) Hp41C válasza cross51 hozzászólására (») Okt 24, 2014 /
 
A TMR2IF (vagy más timer IF) bit mindenképen 1 -re áll, ha a timer átfordul, de megyszakítás csak akkor lesz belőle, ha a hozzá tartozó IE (TMR2IE) bit is 1. Nem kell törölni, ha a megszakítása tiltva van.
(#) don_peter válasza Hp41C hozzászólására (») Okt 24, 2014 /
 
Közben megnéztem kicsit mélyebben az OpenUSART() függvényt amelyet én is használtam (lást a beágyazott kódom) és kiderült, hogy alapból megcsinálja azokat a beállításokat amikre te utaltál.
Ettől független kipróbáltam a bitenkénti beállításokat is, de nem hozott eredményt.
Továbbra sem tudok programból adat kiküldeni.. Érthetetlen mivel a gyári függvényeket használom és elvileg ki kellene küldenie az adatokat..
Legalább is, ha terminálon keresztül küldöm ki akkor kiküldeni, de ha a programból akarok egy WriteUSART() parancsot kiküldeni úgy tesz mint ha nem is lenne ott az utasítás..
(#) Hp41C válasza don_peter hozzászólására (») Okt 24, 2014 / 1
 
MpLab -ban "MpLab Sim" beállítása debugger-ként. Debugger / Settings / "Uart1 Io" lapon "Enable Uart1 Io" -ba pipa, az "Output to Window" -ba pipa. Debugger / Settings / "Osc / Trace" lapon a kiválasztott órajelnek megfelelő értéket beállítani. Újrafordítás. Töréspont a WriteUSART() hívására. Indítás. Megáll a törésponton, Innen lépésenként lehet haladni....
Nem értem, miért kell egy nem működő programkönyvtár idétlen, szószátyár rutinjaival küzdeni napokat, amikor szépen végiggondolva, a lépéseket beprogramozva meg lehet írni egy konkrét típusra egyből jól működőre. TRISC beállítása, Baud generátor felprogramozása, TXSTA felprogramozása, RCSTA felprogramozása - kész is van az inicializálás. Ha kell a megszakítás: RCIE =1, TXIE = 0. A könyvtári küldő és fogadó eljárások úgyis használhatatlanok lesznek egy komolyabb programban, mivel mind a két rutin várakozik....
(#) cross51 válasza don_peter hozzászólására (») Okt 24, 2014 /
 
Egy kis segítség
  1. void init_uart(void)
  2. {
  3.     TRISC = 0xFF
  4.     TXSTA = 0b00100100;
  5.     RCSTA = 0b00010000;
  6.     SPBRG = 25;
  7.     RCSTAbits.SPEN = 1;
  8. }
  9. void write_uart(unsigned char data)
  10. {
  11.     TXREG = data;
  12.     while(!PIR1bits.TXIF);
  13. }
  14. unsigned char read_uart(void)
  15. {
  16.     RCSTAbits.CREN = 1;
  17.     while(!PIR1bits.RCIF);
  18.     return RCREG;
  19. }


http://saeedsolutions.blogspot.hu/2012/11/pic16f877-uart-code-prote...n.html valamint itt találsz egy kész programot igaz 16f877-re de ebből el tudsz indulni.
A hozzászólás módosítva: Okt 24, 2014
(#) don_peter válasza cross51 hozzászólására (») Okt 24, 2014 /
 
Köszi, srácok.
A baud sebességét hogy számolom ki?
Adatlap ezserint így kell:
  1. //Baud rate kiszámolása
  2.         /*((FOSC/Desired Baud Rate)/64) – 1
  3.         = ((16000000/9600)/64) – 1
  4.         = [25.041] = 25*/

Nekem be van állítva a PLL így 20MHz kristállyal 48MHz-en ketyeg a CPU. (18F4550)
Gondolom ebben az esetben ezzel kell számolni és mint, ha valahol ezt olvastam volna.
Ha ezt a számolást követem, akkor a következőre jön ki: ((48MHz/9600)/64)-1 == 77.
Viszont, ha itt nem számít a PLL és csak a 20MHz kvarccal kell számolni akkor az eredmény csak 31.
Addig eljutottam már, ha küldök be jelet és az SPBRG regiszterbe 77van beletöltve, akkor teljesen más karakter jelenik meg mint amit küldtem és kiakad, ha a 31-et írom bele akkor pedig nullát olvas be.
Jól számolom a Baud sebességét?
Csatoltam egy képet is..
Terminálban megjelenik a jó karakter, így biztosan beérkezik az adat...
A hozzászólás módosítva: Okt 24, 2014

usart2.JPG
    
(#) patrik81 válasza Birs Alma hozzászólására (») Okt 24, 2014 /
 
Köszi,kipróbáltam,de bizonytalanul működik,és csak az a-betűt írja ki,az RC0-t nem invertálja.
(#) patrik81 válasza patrik81 hozzászólására (») Okt 24, 2014 /
 
Tettem még bele egy delay-t,most már biztosabban működik,de az RC0 még most sem kapcsolgatja,folyton ki van kapcsolva,viszont RC1 kapcsolódik helyette
LcdAadat ('a')-nélkül tudom kapcsolgatni.
  1. while(1)
  2.     {
  3.         while(RB7);  //lenyomásig itt várakozik
  4.         if (paritas)   // ha most második gombnyomásról van szó
  5.         {
  6.             RC0 = 0;
  7.             LcdParancs(1);
  8.             paritas = 0;
  9.         }
  10.         else
  11.         {
  12.             RC0 = 1;
  13.             LcdAdat('a');
  14.             paritas = 1;
  15.         }
  16.         while(!RB7); //felengedésig itt várakozik
  17.         delay(983); //15 ms
  18.     }
(#) don_peter válasza patrik81 hozzászólására (») Okt 24, 2014 /
 
Próbáld ki LCD nélkül..
Általában az LCD vezérlését a C portra teszik.. (Feltételezve, hogy tényleg a C porton van)
  1. while(1)
  2.         {
  3.             while(RB7);  //lenyomásig itt várakozik
  4.             if (paritas)   // ha most második gombnyomásról van szó
  5.             {
  6.                 RC0 = 0;
  7.                 //LcdParancs(1);
  8.                 paritas = 0;
  9.             }
  10.             else
  11.             {
  12.                 RC0 = 1;
  13.                 //LcdAdat('a');
  14.                 paritas = 1;
  15.             }
  16.             while(!RB7); //felengedésig itt várakozik
  17.             delay(983); //15 ms
  18.         }

Aztán esetleg próbáld ki úgy, hogy az RC0 = ?; sort helyettesíted erre:
  1. RC0 = !RC0;
A hozzászólás módosítva: Okt 24, 2014
(#) cross51 válasza don_peter hozzászólására (») Okt 24, 2014 / 1
 
Jól számoltad csak a BRGH és a BRG16-ot figyelembe kell venni ha a BRGH vagy a BRG16 1 akkor 16-al kell osztani nem 64-el és ha mindkettő 1 akkor 4-el a BEGH a High Baud rate a BRG16 pedig h nem csak az SPBRG használja hanem az SPBRGH-t is, tehát nem 8 bites hanem 16 bites a baud generátor, mint az ahogy a neve is takarja.
A PPL-el meg amit látsz OSC. blokk diagramban ami a peripherials felé megy órajel azzal kell számolni, ha a perifériák felé(CPU is ideértve) 48MHz-es jeled megy akkor azzal számolj.
A hozzászólás módosítva: Okt 24, 2014
(#) patrik81 válasza Birs Alma hozzászólására (») Okt 24, 2014 /
 
Szia!

Rájöttem,az RC0 benne van az LCD vezérlésben,áttettem RC2-re és most már működik.Kicsit zavaró volt a megoldás.
(#) don_peter válasza cross51 hozzászólására (») Okt 24, 2014 /
 
Igen ezt néztem is az Adatlapban ezért számoltam a leírtak szerint.
Most így néz ki a kódom amivel szenvedek persze sikeretlen.:
  1. #include <p18f4550.h>
  2. #include <usart.h>
  3. #include <stdio.h>
  4. #include <delays.h>
  5. #include <stdlib.h>
  6. #include "header.h"
  7. #include "lcd.c"
  8.        
  9. void main(void){
  10.         char result, i=0, x=0;
  11.         //RCSTAbits.SPEN = 1;
  12.         TRISC = 0b11000000;
  13.         TRISA = 0x01;
  14.         TRISB=TRISD=TRISE=0;
  15.         ADCON1 = 0x0F;  //Minden port legyen digitális
  16.         CMCON = 7;              //comparators kikapcsolva
  17.        
  18.         lcd_init();
  19.     stdout = _H_USER;
  20.        
  21.         //Baud rate kiszámolása
  22.         /*((FOSC/Desired Baud Rate)/64) – 1
  23.         = ((48000000/9600)/64) – 1
  24.         = [77.125] = 77*/
  25.        
  26.         // configure USART
  27.         TXSTAbits.CSRC  = 0;    // Clock Source Select bit
  28.         TXSTAbits.TX9   = 0;    // 9-Bit Transmit Enable bit
  29.         TXSTAbits.TXEN  = 1;    // Transmit Enable bit
  30.         TXSTAbits.SYNC  = 0;    // EUSART Mode Select bit
  31.         TXSTAbits.SENDB = 0;    // Send Break Character bit
  32.         TXSTAbits.BRGH  = 1;    // High Baud Rate Select bit
  33.         TXSTAbits.TRMT  = 0;    // Transmit Shift Register Status bit
  34.         TXSTAbits.TX9D  = 0;    // 9th bit of Transmit Data
  35.        
  36.         RCSTAbits.SPEN  = 1;    // Serial Port Enable bit
  37.         RCSTAbits.RX9   = 0;    // 9-Bit Receive Enable bit
  38.         RCSTAbits.SREN  = 0;    // Single Receive Enable bit
  39.         RCSTAbits.CREN  = 1;    // Continuous Receive Enable bit
  40.         RCSTAbits.ADDEN = 0;    // Address Detect Enable bit
  41.         RCSTAbits.FERR  = 0;    // Framing Error bit
  42.         RCSTAbits.OERR  = 0;    // Overrun Error bit
  43.         RCSTAbits.RX9D  = 0;    // 9th bit of Received Data
  44.        
  45.         BAUDCONbits.ABDOVF      = 0;    // Auto-Baud Acquisition Rollover Status bit
  46.         BAUDCONbits.RCIDL       = 0;    // Receive Operation Idle Status bit
  47.         BAUDCONbits.RXDTP       = 0;    // Received Data Polarity Select bit
  48.         BAUDCONbits.TXCKP       = 0;    // Clock and Data Polarity Select bit
  49.         BAUDCONbits.BRG16       = 0;    // 16-Bit Baud Rate Register Enable bit
  50.         BAUDCONbits.WUE         = 0;    // Wake-up Enable bit
  51.         BAUDCONbits.ABDEN       = 0;    // Auto-Baud Detect Enable bit
  52.         SPBRG = 77;
  53.        
  54.         putrsUSART("Hello World!"); // ez mint ha itt sem lenne, semmit nem csinál rá
  55.                
  56.         while(1){
  57.        
  58.                 if(PORTAbits.RA0){
  59.                         while(PORTAbits.RA0);
  60.                                 WriteUSART(0xff);
  61.                 //if(DataRdyUSART()){
  62.                         LATAbits.LATA2 = !LATAbits.LATA2;
  63.                         result = read_uart();
  64.                         write_uart(0x01);
  65.                         printf("ReadUSART() c: %c   ", result);
  66.                         lcd_write(0xC0,0,1,1);  
  67.                         printf("ReadUSART() i: %i   ", result);
  68.                         lcd_write(0x94,0,1,1);
  69.                         printf("ReadUSART() 0x%x    ", result);
  70.                         lcd_write(0xD4,0,1,1);
  71.                         printf("Szamlalo: %i   ", x);
  72.                         lcd_write(0x80,0,1,1);
  73.                         x++;
  74.                  }
  75.                  LATAbits.LATA1 = !LATAbits.LATA1;
  76.        
  77.                  i++;
  78.                  Delay10KTCYx(100);
  79.         }
  80.         CloseUSART();
  81. }

Ha rá néznétek örülnék..
Köszi..
A hozzászólás módosítva: Okt 24, 2014
(#) cross51 válasza don_peter hozzászólására (») Okt 24, 2014 / 1
 
a PLL configja lenne a lényeg mert így oké, hogy 20MHz-el számolsz de a PLL-ben elég sok képpen be lehet állítani, hogy mennyivel van leosztva a PLL kimenete a CONFIG biteket el tudod küldeni.
A hozzászólás módosítva: Okt 24, 2014
Következő: »»   582 / 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