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   714 / 1210
(#) Droot válasza Droot hozzászólására (») Okt 20, 2015 /
 
Senki?
(#) geri12 hozzászólása Okt 20, 2015 /
 
Sziasztok!

Van egy problémám. Van egy projektem, aminél digitális értéket kell feszültségértékre alakítani. Én MCP4921-es DAC-vel valósítottam meg az analog átalakítást, hogy a programnak csak spi vonalon keljen folyamatosan írnia. Ez eddig nem is gond, program meg van írva, és működik is. Amire viszont rádöbbentem hogy nem lineáris. Már kínomban azt hittem a programmal van gond, ezért a gyári mikroelektronikás példával megnéztem, amit le is filmeztem hogy lássátok mi a problémám. Röviden ugye 12 bites a dac. 4095-ös digitális értéknél 5V, mivel a referencia is 5V. 0-nál pedig 0. Ez eddig istenes is. Arra viszont nem gondoltam hogy 2048-as digitális értéknél nem 2,5V lesz a DAC kimeneten. Valaki használt már ilyen DAC ic-t? Ezek ilyenek, és én voltam eddig tudatlan?
készített videó
(#) Pali79 válasza Hp41C hozzászólására (») Okt 20, 2015 /
 
Szia Hp41C!
Megjött az analizátor csatolom a forrást és az analizátor által készített fájlt. Neked biztos mond mint nekem. Azt vettem észre, hogy ha csak egyszer fut le, akkor semmit nem mutat az analizátor, ezért 10× futtatom le.
(#) icserny válasza geri12 hozzászólására (») Okt 20, 2015 /
 
Ilyet nem használtam még, de az adatlapja szerint max. +/-12LSB azaz +/-15 mV lehet az integrális nonlinearitás. Ennél jobban nem térhetne el az ideális egyenestől. Apropo lineáris: ugye 0-ba fut a görbe, és nincs egy 0.4 V körüli eltolás?

Az MCP4921 környékének kapcsolási rajzát jó lenne látni! (Vref táplálása, kimeneti terhelés, stb.)
(#) ktamas66 válasza geri12 hozzászólására (») Okt 20, 2015 /
 
Az adatlapban mindenhol csak 2V körüli Vref példák vannak, és a Vref csak unbuffered módban lehet Vdd.
(#) geri12 válasza (Felhasználó 15355) hozzászólására (») Okt 20, 2015 /
 
Azért próbáltam ki mikroelektronikás demóval hogy biztos legyek benne nem a program viccel meg. Demo csak nem hibádzik...
A hozzászólás módosítva: Okt 20, 2015
(#) geri12 válasza ktamas66 hozzászólására (») Okt 20, 2015 /
 
Igen valószínűleg referencia gond van itt. MCP4821-el ezért volt jó Simpi-nek, mert az belső referenciás.
(#) Pali79 válasza geri12 hozzászólására (») Okt 20, 2015 /
 
Próbáltad a BUF bitet állítani, hogy mit csinál?
(#) geri12 válasza icserny hozzászólására (») Okt 20, 2015 /
 
Kimeneti terhelés 10K. Vref 5V tápról közvetlenül. LDAC test, SCK, SDI közvetlenül mikrovezérlőre, többi adott.

És igen van 0,4V-os eltolás. (0,481)
A hozzászólás módosítva: Okt 20, 2015
(#) geri12 válasza Pali79 hozzászólására (») Okt 20, 2015 /
 
Még nem, de az már csak holnap.
(#) diablo hozzászólása Okt 21, 2015 /
 
Sziasztok!

Egy float számot kellene átalakítanom karaktertömbbé, hogy LCD-n megjeleníthessem két tizedes jegyig. De az XC8-ban lévő ftoa függvény nem igazán akar működni, pontosabban le sem fordul.
Így kellene használni, de még arra se jöttem rá, hogy mi az a status és miért nincs neki értéke:

#include <stdlib.h>
#include <stdio.h>
void
main (void)
{
char * buf;
float input = 12.34;
int status;
buf = ftoa(input, &status);
printf("The buffer holds %s\n", buf);
}


A következő feladat meg karaktertömb visszaalakítása float-tá lenne. Számolgatni kellene velük, tehát nem lenne jó egész számokban tárolni őket, memória meg van bőven.
Gyorsan kellene a megoldás.
A hozzászólás módosítva: Okt 21, 2015
(#) diablo válasza diablo hozzászólására (») Okt 21, 2015 /
 
Megoldódott, más volt a hiba, viszont a status változót továbbra se tudom, hogy mire jó. Továbbá nem tudom hogy lehetne korlátozni két tizedes jegyre a kiírt számot. (az utána lévők már úgyis pontatlanok)
(#) geri12 hozzászólása Okt 21, 2015 /
 
Ismét itt...

Ezekben a percekben rájöttem mi volt a hiba. Nem program hiba volt, hanem az hogy a 7 lábon nem volt GND kapcsolat. 5-ös lábról volt átvive wire to wire vezetékkel Bread Boardon megépítve és az 5-ös 7-es közötti vezeték szakadt volt. Kívülről jó volt, innentől kezdve egyesével meg kell mérnem ezeket a már régóta használt vezetékeket. Sosem jártam még így, elnézést érte. A DAC ic most már remekül megy! Üdv! Geri12
(#) Lamprologus válasza diablo hozzászólására (») Okt 21, 2015 /
 
printf utasításnál a paramétereknél meg lehet adni, hogy a váltózót hogy jelenítse meg...
pl: printf("Voltage %6.3fV\r\n", voltage); // Result: Voltage 1.125V

a súgóban biztos megtalálod, a %-jel utáni résznél tudod megadni ...
(#) diablo válasza Lamprologus hozzászólására (») Okt 21, 2015 /
 
És a printf-fel hogy írjak az LCD-re? Nem volt még szükségem rá PIC programozásnál, nem nagyon értem hova ír. Én mindig a saját LCD-re író függvényemmel írom ki amit kell.
Pl. WriteLCD(line, "text"); A text helyére kellene betennem a printf sorodat? Vagy hogy?
(#) foxi63 válasza diablo hozzászólására (») Okt 21, 2015 /
 
Szia!
továbbra is használhatod a saját WriteLCD() függvényedet, csak a dekralációban ( char , char* ) legyen. Ekkor már csak egy mutatót kell átadni ahol az adott szöveg van. Pl.: WriteLCD(1,buf);
Természetesen ez ott lévő szöveget is nullával kell lezárni.
(#) benjami válasza diablo hozzászólására (») Okt 21, 2015 /
 
Az sprintf függvény ugyanúgy működik mint a printf, csak string-be (akarom mondani karaktertömbbe) teszi a kiírandó szöveget.
(#) Bell válasza diablo hozzászólására (») Okt 22, 2015 /
 
Ez is lehet megoldás:
  1. #include <stdio.h>
  2. ...
  3. static int (*putc_fn)( int );
  4.  
  5. int main(void)
  6.     {
  7.         double szam = 123.456;
  8.         procIni();
  9.         LCDIni();  
  10.         SERIALini();
  11.         Open_str(LCDstr);
  12.         printf("LCD-re: %.2f",szam);
  13.         Open_str(SERIALstr);
  14.         printf("Soros portra: %.2f",szam);
  15.     }
  16.      
  17. void Open_str( int str )
  18.       {
  19.         putc_fn = str;
  20.       }
  21.  
  22.  
  23. void SERIALstr(unsigned char ch )
  24.             {
  25.         send_serial_data_byte( ch ); //saját soros port kiírás
  26.             }
  27.  
  28. void LCDstr(unsigned char ch )
  29.             {
  30.         send_data_byte( ch ); //saját LCD kiírás, ékezetes átalakítás, stb...
  31.             }
  32.      
  33. void putch( unsigned char ch )
  34.       {
  35.         (*putc_fn) (ch); //a printf átirányítása saját függvényre
  36.       }
(#) don_peter hozzászólása Okt 22, 2015 /
 
Uraim, kérnék egy kis segítséget.
PIC18F46K22-es MCU beállításaival kapcsolatban.
Még mindig a DS18B20-al szívok és mivel nem akar működni meg kell minden eddigi beállításomat kérdőjeleznem.

Az 1ms és az 1us-al is lehet, gond mivel a DS nagyon kényes az időzítésre.
A lényeg:
16MHz-es kristályt használok, 4xPLL bekapcsolva ami elvileg 64MHz-et eredményez.
Regiszterek:
  1. CM2CON1 = 0;
  2.         CM1CON0 = 0;
  3.         CM2CON0 = 0;
  4.         ANSELA = 0;
  5.         ANSELB = 0;
  6.         ANSELC = 0;
  7.         ANSELD = 0;
  8.         ANSELE = 0;
  9.         OSCCON = 0;     // Primary Clock-ot használjuk CONFIG1H beállításai szerint
  10.     OSCCON2 = 0x04; // Oscillator drive circuit on
  11.     OSCTUNE = 0x20; // PLL enabled
  12.         CCP1CON = 0;    // Coperátorok és PWM kikapcsolva
  13.         CCP2CON = 0;
  14.         CCP3CON = 0;
  15.         CCP4CON = 0;
  16.         CCP5CON = 0;
  17.         INTCONbits.GIE = 0;

Konfigurációs beállítások:
  1. //CONFIG1H
  2. #pragma config FOSC             = HSMP          //0xF3  HS oscillator (medium power 4-16 MHz).
  3. #pragma config PLLCFG   = ON            //0xFF  Oscillator multiplied by 4xPLL
  4. #pragma config PRICLKEN = ON            //0xFF  Primary clock is always enabled.
  5. #pragma config FCMEN    = OFF           //0xBF  Fail-Safe Clock Monitor disabled.
  6. #pragma config IESO     = OFF           //0x7F  Oscillator Switchover mode disabled.
  7. //CONFIG2L
  8. #pragma config PWRTEN   = ON            //0xFE  Power up timer enabled.
  9. #pragma config BOREN    = ON            //0xFB  Brown-out Reset enabled and controlled by software (SBOREN is enabled).
  10. #pragma config BORV     = 285           //0xE7  VBOR set to 2.85 V nominal.
  11. //CONFIG2H
  12. #pragma config WDTEN    = OFF           //0xFC  Watch dog timer is always disabled. SWDTEN has no effect.
  13. #pragma config WDTPS    = 256           //0xE3  1:256.
  14. //CONFIG3H
  15. #pragma config CCP2MX   = PORTC1        //0xFF  CCP2 input/output is multiplexed with RC1.
  16. #pragma config PBADEN   = OFF           //0xFD  PORTB<5:0> pins are configured as digital I/O on Reset.
  17. #pragma config CCP3MX   = PORTB5        //0xFF  P3A/CCP3 input/output is multiplexed with RB5.
  18. #pragma config HFOFST   = OFF           //0xF7  HFINTOSC output and ready status are delayed by the oscillator stable status.
  19. #pragma config T3CMX    = PORTC0        //0xFF  T3CKI is on RC0.
  20. #pragma config P2BMX    = PORTD2        //0xFF  P2B is on RD2.
  21. #pragma config MCLRE    = EXTMCLR       //0xFF  MCLR pin enabled, RE3 input pin disabled.
  22. //CONFIG4L
  23. #pragma config STVREN   = ON            //0xFF  Stack full/underflow will cause Reset.
  24. #pragma config LVP              = OFF           //0xFB  Single-Supply ICSP disabled.
  25. #pragma config XINST    = OFF           //0xBF  Instruction set extension and Indexed Addressing mode disabled (Legacy mode).
  26. #pragma config DEBUG    = OFF           //0xFF  Disabled.
  27. //CONFIG5L
  28. #pragma config CP0      = OFF       // Kódvédelem kikapcsolva
  29. #pragma config CP1      = OFF
  30. #pragma config CP2      = OFF
  31. #pragma config CP3      = OFF
  32. //CONFIG5H
  33. #pragma config CPB      = OFF           // Boot Blokk kódvédelem kikapcsolva
  34. #pragma config CPD      = OFF           // Eeprom kódvédelem kikapcsolva
  35. //CONFIG6L
  36. #pragma config WRT0     = OFF           // Írásvédelem kikapcsolva
  37. #pragma config WRT1     = OFF
  38. #pragma config WRT2     = OFF
  39. #pragma config WRT3     = OFF
  40. //CONFIG6H
  41. #pragma config WRTB     = OFF           // Boot Blokk írásvédelem bekapcsolva
  42. #pragma config WRTC     = OFF           // Configuration Register Write Protection
  43. #pragma config WRTD     = OFF           // Data EEPROM Write Protection
  44. //CONFIG7L
  45. #pragma config EBTR0    = OFF       // Táblázatolvasás ne legyen letiltva
  46. #pragma config EBTR1    = OFF
  47. #pragma config EBTR2    = OFF
  48. #pragma config EBTR3    = OFF
  49. //CONFIG7H
  50. #pragma config EBTRB    = OFF       //Boot blokk táblaolvasás ne legyen letiltva


És végül a késleltetés:
  1. #include <delays.h>
  2.  
  3. void Delay_Us(unsigned int us){ // 1/(64000000/4) == 0.00000000625 * 16 = 0.0000001 == 1us
  4.         unsigned char i;
  5.         for(i=(16*us); i>0; i--) Delay1TCY();
  6. }
  7.  
  8. void Delay_Ms(unsigned int ms){ // 1/(64000000/4) == 0.00000000625 * 16*10000 = 0.001 == 1ms
  9.         unsigned char i;
  10.         for(i=ms; i>0; i--) Delay10KTCYx(16);
  11. }

Valami tuti nem kerek, de nem értem, hogy eddig ezzel nem volt gondom, de ez a DS hőérzékelő teljesen keresztbe vág.
Előre is köszi az észrevételeket.
(#) diablo válasza benjami hozzászólására (») Okt 22, 2015 /
 
Nem igazán akar működni.

float f1 = 123.4567;
char *buf1;
buf1 = printf("Voltage: %.2fV", f1);
WriteLCD(2, buf1);

Ez nem ír ki semmit csak egy véletlen karaktert;

Bell, a tiedet meg nem igazán értem. Hol adom, hogy melyik sorba, oszlopba írja ki a karaktertömböt? Az Open_str(LCDstr)-t csak egyszer kell meghívni, utána már a printf szolgál WriteLCD függvényként?
(#) icserny válasza diablo hozzászólására (») Okt 22, 2015 /
 
A printf helyett nem sprintf-ről volt szó?
(#) diablo válasza icserny hozzászólására (») Okt 22, 2015 /
 
Meg printf-ről is. A printf nem az eredmény karaktertömb címével kellene, hogy visszatérjen amit az LCD függvény is vár bemeneteként?
Mindjárt kipróbálom sprintf-fel, mert eddig rosszul használtam és nem tudtam miért nem fordul le.
(#) cross51 válasza diablo hozzászólására (») Okt 22, 2015 /
 
A printf az stdout-ba ír ki formázott stringet amit xc8-ban a void putch(char c)végkimenetli függvénynek hívnak a C18-ban nem emlékszem, hogy hogy kel/hogy hívják. És a putch-ból kell a karaktert kiírni az lcd-re.
(#) Bell válasza diablo hozzászólására (») Okt 22, 2015 /
 
Itt egyszerűen arról van szó, hogy putc_fn arra a függvényre fog mutatni, ahol ahol a saját függvényed kezdődik. Akár így is lehetne:
  1. putc_fn = LCDstr;
  2. printf("LCD-re írunk");

Ahol LCDstr a saját LCD-re író függvényed.
Az eredeti putch-t, aminek a printf adogatja a karaktereket, átdefiniáltuk.
(#) diablo válasza cross51 hozzászólására (») Okt 22, 2015 /
 
Sprintf-fel már működik, köszi nektek a segítséget.
De egy kicsit még értetlenkednék.

Tehát ha a putch függvényt bebűvészkedem a saját LCD-re író függvényemben, akkor a printf-fel tudnék egyből az LCD-re írni? Max az előtte lévő sorban adok még egy utasítást az LCD-nek, hogy melyik sorba, oszlopba írjon.

De ha nincs visszatérési értéke és egy karaktert vár bemenetként, akkor hogy működik?
void
putch(char c)
{
}

Ennyi a .c állománya, nem vágom, vagy a c az most a printf által generált kimeneti tömb első karaktere?
Az LCD függvényem ilyen, ebbe hogy lehet betenni?:
void WriteLCDbyte(char rs_pin, char data)
{
// Itt beállítom az RS pin-t és szétosztom az adatot a megfelelő kimenetekre.
// Enable, delay stb.
};

Ide hogy kell a putch-t betenni?

Bell: Így már érthetőbb, de az eredetire még nem jöttem rá.
A hozzászólás módosítva: Okt 22, 2015
(#) Bell válasza diablo hozzászólására (») Okt 22, 2015 /
 
Nem hosszú, próbáld ki és írd meg, mire nem jöttél rá .
Én értékadással használom, de azt gondoltam logikusabb open-nel.
(#) Droot hozzászólása Okt 22, 2015 /
 
Sziasztok!

PIC32-vel hogyan kell Rx interruptot kezelni?
Egyenlőre csak azt akarom hogy amit küldök neki küldje vissza, de nem hívódik meg az interrupt.
  1. IEC0bits.U1RXIE = 1;
  2.     IFS0bits.U1RXIF = 0;
  3. void __ISR(_UART_1_VECTOR, ipl2) IntUart1Handler(void)
  4. {
  5.       PORTDbits.RD2 = 1;
  6.   char curChar = U1RXREG;
  7.   U1TXREG=curChar;  // Echo back the same character.
  8.   while(!U1STAbits.TRMT);
  9.   IFS0bits.U1RXIF = 0;  
  10. }
(#) don_peter hozzászólása Okt 22, 2015 /
 
Uraim, hogy tudok egy stabil késleltetést készíteni C18-ban?
18F46K22 PIC + 16MHz kristály + 4xPLL bekapcsolva, 64MHz az órajelem.
Csak a fontosabb beállításokat linkelem:
  1. #pragma config FOSC             = HSMP          //0xF3  HS oscillator (medium power 4-16 MHz).
  2. #pragma config PLLCFG   = ON            //0xFF  Oscillator multiplied by 4xPLL
  3. #pragma config PRICLKEN = ON            //0xFF  Primary clock is always enabled.
  4. #pragma config FCMEN    = OFF           //0xBF  Fail-Safe Clock Monitor disabled.
  5. #pragma config IESO     = OFF           //0x7F  Oscillator Switchover mode disabled.

Ugyan beállítottam a Fosc-ot is ahogyan Hp41C említette, de észlelhető eredményt nem hozott.
  1. #define Fosc    64000000L  // 64MHz

Az inicializálásnál a PIC összes lába digitális és az interrupt kikapcsolva, és persze minden egyéb, PWM, ADC.
Fontosabb regiszterek az óra jel miatt:
  1. OSCCON = 0;     // Primary Clock-ot használjuk CONFIG1H beállításai szerint
  2. OSCCON2 = 0x04; // Oscillator drive circuit on
  3. OSCTUNE = 0x20; // PLL enabled

Sajnos a mérések alapján (Proteusban mivel nincs oszcillátorom) az időzítések nem pontosak.
Ha beállítok mondjuk egy 1us-t egy rutinnal pl:
  1. void Delay_Us(unsigned int [b]us[/b]){  // 1/(64000000/4) == 0.00000000625 * 16 = 0.0000001 == 1us
  2.         unsigned int i = [b]us[/b]*1;
  3.         while(i--) Delay1TCY();
  4. }

Akkor az viszonylag kis ciklusokra jó, de ha mondjuk emelem akkor nagy akár dupla eltéréseket is mutathat.
Képeket töltök fel, hogy érthető legyen.
Az első kép ahol 1us látható a mérésekkel a fentebb látható "unsigned int i = us*1;" kóddal érem el.
Ezt a kódot most hagyom is de változtatom a us változót. (ki is emeltem, hogy melyik az)
Delay_Us(1);-ről Delay_Us(100);-ra.
A 2. képen látható, hogy 100us helyett 22.5us a késleltetés.
Ez egyébként egy port egy bit magas majd alacsony szintre való állítása.

Hogy tudom ezt megoldani, hogy egységes időzítést kapjak, mert a DS18B20 eléggé kényes az ilyenre.
Előre is köszönöm.
(#) kissi válasza don_peter hozzászólására (») Okt 22, 2015 /
 
Már leírtam, hogy mi a problémája, olvasd már el és gondolkodj rajta egy kicsit !
(#) don_peter válasza kissi hozzászólására (») Okt 22, 2015 /
 
Félre értesz, az már megvan.
És megy is a DS, mutatja az értékeket, de maga az időzítés elcsúszik akár mit csinálok.
10000, 1000 is meg van..
A hozzászólás módosítva: Okt 22, 2015

ds18b20_7.JPG
    
Következő: »»   714 / 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