Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1184 / 1320
(#) roleez válasza roleez hozzászólására (») Szept 1, 2014 /
 
Újra, mert valahogy a módosítást elböktem...
Szóval az adc önállóan jól működik. De mivel egy relatív komplex egységről van szó,
egyben kell jól működnie, így önállóan az adc tesztnek már nincs létjogosultsága.
A sok teszt - és felületes debug (mikroProg) után arra a
következtetésre jutottam, hogy talán az interruptok környékén lehet a gond.
Erről próbálok szélesebb gondolatokat tőletek meríteni, persze egészen más megközelítésben
akár.
A hozzászólás módosítva: Szept 1, 2014
(#) ktamas66 válasza roleez hozzászólására (») Szept 1, 2014 / 1
 
Ezt még át kell gondolni . Én a helyedben lecserélném az ADC_Init()-et, és 64Tosc-ra tenném a TAD-t,már csak próbaként is (mivel van egy ilyen kitétel az RC-hez.)
Idézet:
„For device frequencies above 1 MHz, the device must be in Sleep mode for the entire conversion or the A/D accuracy may be out of specification.”
(#) ktamas66 válasza roleez hozzászólására (») Szept 1, 2014 / 1
 
Én is lemaradtam a módosításról .
Amit még hozzá akartam fűzni: ha a TAD RC módban 4us, akkor egy Get_... 14*4+22=78us. Ezt hívod 5-ször = 390us + az egyebek. Ezt hívod 1ms-onként .
(#) roleez válasza ktamas66 hozzászólására (») Szept 2, 2014 /
 
Köszönöm!
Szóval ilyennel fogom próbálni:
ADCON2,
ACQT = 001 (2TAD)
ADCS = 110 (Fosc/64)
Így egy konverzió: 20 usec alatt lezajlik.
Előző írásomban rosszul írtam, 64 MHz-en megy a PIC.
(#) roleez válasza ktamas66 hozzászólására (») Szept 2, 2014 /
 
Igen, de belefér a 1 msec-be, nem?
Változtatom nem RC ad clockra.
(#) kelektronic hozzászólása Szept 3, 2014 /
 
Sziasztok! Pic + lcd-s áramkörhöz kapcsolódó kérdésem van. Építeni szándékozok egy pic alapú rádiofrekis műszert. Amibe 2 X 20 karakteres kijelzőt jelölnek meg. Nekem viszont ugyanilyen, ámde 4 X 20 karakteresem van. Ha ezt a "nagyobb kijelzőt kötöm az áramkörre mi történik? Köszönöm segítségeteket! Üdv mindenkinek! Tibi

az áramkör linkje: Bővebben: Link
A hozzászólás módosítva: Szept 3, 2014
(#) matheattila válasza kelektronic hozzászólására (») Szept 3, 2014 /
 
Ha szerencséd van akkor minden módosítás nélkül fog működni, csak annyi különbséggel, hogy a második sor szöveg nem a második sorban hanem a harmadikban fog megjelenni, mert a 4x20-asnál másképp van a címzés.
Viszont ha mégsem működne akkor módosítani kell a programot...
(#) roleez válasza ktamas66 hozzászólására (») Szept 9, 2014 /
 
kicsit megcsúszva, mert most tudtam érdemi teszteket elvégezni.
no, a TAD=8, Fosc/64 beállítással most nem dobott hibát, az idő majd mindent eldönt!
köszönöm!
van meg tranziens esetben "tüske", de azt kiszűröm, feltételezve, fizikailag ilyen nem lehetséges.
(#) tamasati válasza watt hozzászólására (») Szept 13, 2014 /
 
Köszönöm a válaszokat, már halvány elképzelésem van, és nézegettem példa programokat is. Elkezdtem írni egy modbus slave programot pic-re, aminek az RB portjait használom bemenetnek, RD portjait kimenetnek. Ami megzavart, az, hogy a modbus dokumentációban memória regiszterekre hivatkoznak mint adatforrásokra. Nos az én memória regisztereim a PORTB, és a PORTD. Innen közvetlenül olvasom ki és állítom be az állapotokat. Jól gondolom a megoldást? Erre gondol a protokoll?
(#) watt válasza tamasati hozzászólására (») Szept 13, 2014 / 1
 
Szerintem igen. A memória fogalma elég tág.
(#) proksa1 hozzászólása Szept 16, 2014 /
 
Elöször a PIC kezdőknek rovatba tettem fel a kérdésem de nem kaptam választ. Adott egy TLV5628C DAC konverter amit egy PIChez illesztenék. A kommunikációban kellene egy kis segítség. Az adatlap szerint soros interfészt használ(spi), de nincsen chipselect lába, mivel az áramkörömben 3db-ot használok ezért felraktam őket külön lábakra, hogy majd software-es spi-vel hajtom meg őket, úgyis csak kiküldeni szeretném feléjük adatokat. A kérdés, hogy mit kellene nekem küldenem,hogy mondjuk a DACA kimenetnek értéket tudjak adni? a referenciám 5V tehát mondjuk a 2.5Vhoz a 127 tartozik. 12bites parancsszót ír az adatlap tehát akkor kellene küldenem mondjuk azt hogy 1 és 127 (utolsó 3bit a címe a beállítandó kimenetnek, a 127 meg a kimenet értéke lenne illetve a LDAC és LOAD-ra lefutó él) mondjuk ez így elküldve 16bit.

Vagy a soros interfészt itt ugy kell használni mint mondjuk a TPIC6C595 shift regiszternél?
(#) watt válasza proksa1 hozzászólására (») Szept 16, 2014 /
 
Szia! Én azt próbálnám ki, hogy a LOAD-ot használnám CS-nek. Mindegyikbe befutna egy csomag, de csak azt tölteném be, amelyiknek szántam. Elvileg a következő sorozat kitolja a fel nem használt előzőt. Érdemes lenne kipróbálni úgy, hogy két csomagot elküldesz, de csak a másodikat töltöd be. Ha csak a második teljesül, akkor működik...
(#) zenetom válasza watt hozzászólására (») Szept 16, 2014 /
 
Én is ezt akartam írni, de ejj, megelőztél. Egyébként szerintem biztosan CS funkcióként működik a LOAD láb. Fogadni mernék rá.
(#) watt válasza zenetom hozzászólására (») Szept 16, 2014 /
 
Igen, de fura, mert egy normális SPI nem fogad biteket addig, amíg nincs a CS engedélyezve.
(#) proksa1 válasza watt hozzászólására (») Szept 16, 2014 /
 
Ha megjön a nyák már próbálom is ki, addíg is köszönöm a segítséget. De az a rész akkor jó lehet hogy mivel az spi is 8 bitet küld akkor két byteot küldök ki neki? máshogy hogy tudok egy spivel 12 bitet küldeni?
(#) watt válasza proksa1 hozzászólására (») Szept 16, 2014 /
 
Azt próbálnám ki, hogy 2x8 bitet kiküldök úgy, hogy a végére shiftelem a 12 bitet. Az első 4 bit bármi lehet, remélhetően kihullik. Ez a DAC egyébként nem SPI-s, csak soros illesztésű, de ettől még jó lehet...
A hozzászólás módosítva: Szept 16, 2014
(#) proksa1 válasza watt hozzászólására (») Szept 16, 2014 /
 
Azt irja a TI honlapja hogy "serial SPI". TLV5628 TI
(#) watt válasza proksa1 hozzászólására (») Szept 16, 2014 /
 
Az - Adatlapban - nem szerepel az SPI meghatározás.
(#) proksa1 válasza watt hozzászólására (») Szept 16, 2014 /
 
Valóban nem, de sajnos semmi olyan sem ami támpontot adna.
(#) matheattila válasza proksa1 hozzászólására (») Szept 16, 2014 /
 
Ha tényleg SPI lenne akkor a Daisy-Chan lenne a legjobb megoldás rá (Bővebben: Link), de mivel ez egy egyszerű soros kommunikáció amely a LOAD láb alacsony szintjére betölti az adatokat ezért nem biztos, hogy fog működni a dolog.
Csak akkor működhet a dolog ha új adat érkezésekor felülírja a régit ha nem volt LOAD jel, de erre nem találtam utalást az adatlapban ahogy átfutottam rajta
(#) watt válasza proksa1 hozzászólására (») Szept 16, 2014 /
 
Próbáld ki, baja nem lesz, legfeljebb nem fog menni, akkor áttérsz szoftveresre.
(#) icserny válasza proksa1 hozzászólására (») Szept 17, 2014 /
 
Idézet:
„De az a rész akkor jó lehet hogy mivel az spi is 8 bitet küld akkor két byteot küldök ki neki?”
Az adatlap 3. és 4. ábrája szerint igen.
(#) zenetom hozzászólása Szept 21, 2014 /
 
Sziasztok!
18F2550.
Nagy menyiségű ASCII adatot hogyan lehet berakni a programmemóriába?
A DB utasítás és társai egyszerre csak kb. 190byte-ot tárolnak rendesen, utána kiírja a sorra, hogy "Warning[209] : Missing quote". Bár lefordul, de nem kerül bele a programmemóriába minden érték.
Így tárolnám le:
  1. label1 db "macska, kutya, elefánt..."

Csak persze sokkal több (kb. 300) karakterrel. És több ilyen labellal (sorral).
Nézegettem a súgót, de más megoldást nem nagyon találtam.
Van még a RETLW-s dt direktíva, de jó lenne tábla utasításokkal dolgozni.
A hozzászólás módosítva: Szept 21, 2014
(#) Hp41C válasza zenetom hozzászólására (») Szept 21, 2014 /
 
Használd a db "macska, kutya, elefánt..." sorokat, de minden sorban páros számú karakter legyen, különben 0 kóddal kitoldja.
Egymás után több sort is írhatsz.
Ha retlw utasításokat akarsz a szövegből, addor dt "macska, kutya, elefánt..." sorok kellenek.
(#) zenetom válasza Hp41C hozzászólására (») Szept 21, 2014 /
 
Köszönöm a választ.
Idáig világos, mint a Nap. Viszont ha egy sorban kb. 190-nél több karakter van, akkor azt írja a fordító, hogy "Warning[209] : Missing quote".
Na mindegy, akkor 190 karakterenként lesz egy sor.
(#) zenetom válasza zenetom hozzászólására (») Szept 21, 2014 /
 
Na meg is oldottam.
(#) gacserus hozzászólása Szept 27, 2014 /
 
Sziasztok,

MPLAB, XC8 környezet, PIC12f1840 és egy 24aa512 memória között próbálok összehozni egy I2C kapcsolatot. A lenti program (egy Byte írás és egy Byte olvasás) lefut ugyan de a visszatérő adat (FF) nem egyezik a beírttal (0x2A).

i2c frekvencia: 125khz


Rengetegszer átméztem de nem találom a hibát.
gacserus
  1. ..........................
  2.  
  3. #include "mcc_generated_files/mcc.h"
  4. #include "MyProcedures.h"
  5. #define _XTAL_FREQ  4000000
  6.  
  7. /*
  8.                          Main application
  9.  */
  10. void main(void)
  11. {
  12.     // initialize the device
  13.     SYSTEM_Initialize();
  14.  
  15.     // Enable the Global Interrupts
  16.     //INTERRUPT_GlobalInterruptEnable();
  17.  
  18.     // Enable the Peripheral Interrupts
  19.     INTERRUPT_PeripheralInterruptEnable();
  20.  
  21. //**********************************************************************************
  22. //*****************   main routine   ***********************************************
  23. //**********************************************************************************
  24.  
  25.  
  26.     unsigned int eeprom_array[20];
  27.     unsigned int i;
  28.     volatile unsigned int eeprom_data,incoming_data;
  29.     volatile unsigned int block_address, word_address;
  30.     unsigned int ACK_bit;
  31.  
  32.    
  33.     __delay_ms(10); // let everything settle.
  34.  
  35.  
  36.    // ******************************************************************************
  37.     // ***********  write a single byte of data to address 0x00   *******************
  38.     //*******************************************************************************
  39.  
  40.     block_address = 0x00;  
  41.     word_address = 0x00;    
  42.     eeprom_data = 0x2A;     //beírandó adat
  43.  
  44.     //EUSART_Write(83); //S
  45.     Send_I2C_StartBit();                    
  46.     __delay_ms(10);
  47.     EUSART_Write(49); //1
  48.     Send_I2C_ControlByte(block_address,0);
  49.     __delay_ms(10);
  50.     EUSART_Write(50); //2
  51.     Send_I2C_Data(word_address);
  52.     __delay_ms(10);
  53.     EUSART_Write(51); //3
  54.     Send_I2C_Data(eeprom_data);
  55.     __delay_ms(10);
  56.     EUSART_Write(52); //4
  57.     Send_I2C_StopBit();  
  58.  
  59.        // ************************ polling loop ***************************************************
  60.     block_address = 0x00;
  61.  
  62.     ACK_bit = 1;          
  63.     while(ACK_bit)          
  64.     {
  65.         Send_I2C_StartBit();
  66.         Send_I2C_ControlByte(block_address,0);
  67.         ACK_bit = SSP1CON2bits.ACKSTAT;  
  68.     EUSART_Write(67); //C
  69.  
  70.     }
  71.     // ******************************************************************************************
  72.  
  73.  
  74.     // ******************************************************************************
  75.     // ********* Now read back a single byte of data from address 0x00   ************
  76.     //*******************************************************************************
  77.  
  78.     block_address = 0x00;
  79.     word_address = 0x00;
  80.  
  81.     Send_I2C_StartBit();                    
  82.     EUSART_Write(48); //0
  83.     Send_I2C_ControlByte(block_address,0);
  84.     EUSART_Write(49); //1
  85.     Send_I2C_Data(word_address);            
  86.     EUSART_Write(50); //2
  87.     Send_I2C_StartBit();
  88.     EUSART_Write(51); //3// send start bit
  89.     Send_I2C_ControlByte(block_address,1);
  90.     EUSART_Write(52); //4
  91.     incoming_data = Read_I2C_Data();        
  92.     EUSART_Write(53); //5
  93.     Send_I2C_NAK();
  94.     EUSART_Write(54); //6//
  95.     Send_I2C_StopBit();
  96.     EUSART_Write(55); //7/
  97.    EUSART_Write(incoming_data);
  98.  
  99.     while (1); //just sit here
  100.  
  101. }
  102.  
  103. *******
  104. Eljárások: MyProcedures.c
  105. #define device_control_code  0b1010 //
  106. #define _XTAL_FREQ  4000000
  107. #include <xc.h>
  108. #include "C:\Users\User\MPLABXProjects\I2C5.X\mcc_generated_files/eusart.h"
  109.  
  110. void Send_I2C_Data(unsigned int databyte)
  111. {
  112.     PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  113.     SSP1BUF = databyte;              // send databyte
  114.     while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  115. }
  116.  
  117. unsigned int Read_I2C_Data(void)
  118. {
  119.     PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  120.     SSP1CON2bits.RCEN=1;         // set the receive enable bit to initiate a read of 8 bits from the serial eeprom
  121.     while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  122.     __delay_ms(10);
  123.     return (SSP1BUF);            // Data from eeprom is now in the SSP1BUF so return that value
  124.    }
  125.  
  126. void Send_I2C_ControlByte(unsigned int BlockAddress,unsigned int RW_bit)
  127. {
  128.     PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  129.  
  130.     // Assemble the control byte from device code, block address bits and R/W bit
  131.     // so it looks like this: CCCCBBBR
  132.     // where 'CCCC' is the device control code
  133.     // 'BBB' is the block address
  134.     // and 'R' is the Read/Write bit
  135.  
  136.     SSP1BUF = ((device_control_code << 4) | (BlockAddress <<1)) + RW_bit;  // send the control byte
  137.     while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  138. }
  139.  
  140. void Send_I2C_StartBit(void)
  141. {
  142.     PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  143.     SSP1CON2bits.SEN=1;          // send start bit
  144.     while(!PIR1bits.SSP1IF);    // Wait for the SSPIF bit to go back high before we load the data buffer
  145.    
  146. }
  147.  
  148. void Send_I2C_StopBit(void)
  149. {
  150.     PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  151.     SSP1CON2bits.PEN=1;          // send stop bit
  152.     while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  153. }
  154.  
  155. void Send_I2C_ACK(void)
  156. {
  157.    PIR1bits.SSP1IF=0;          // clear SSP interrupt bit
  158.    SSP1CON2bits.ACKDT=0;        // clear the Acknowledge Data Bit - this means we are sending an Acknowledge or 'ACK'
  159.    SSP1CON2bits.ACKEN=1;        // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
  160.    while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  161. }
  162.  
  163. void Send_I2C_NAK(void)
  164. {
  165.     PIR1bits.SSP1IF=0;           // clear SSP interrupt bit
  166.     SSP1CON2bits.ACKDT=1;        // set the Acknowledge Data Bit- this means we are sending a No-Ack or 'NAK'
  167.     SSP1CON2bits.ACKEN=1;        // set the ACK enable bit to initiate transmission of the ACK bit to the serial eeprom
  168.     while(!PIR1bits.SSP1IF);    // Wait for interrupt flag to go high indicating transmission is complete
  169. }


Használd a kód gombot!
-moderátor-
A hozzászólás módosítva: Szept 27, 2014
(#) icserny válasza gacserus hozzászólására (») Szept 27, 2014 /
 
Az alábbi sor biztosan rossz, mert nem Block Address, hanem a hardveresen beállított cím (A0, A1, A2 lábak állapota) az, amit be kell illeszteni a vezérlő bájtba! (Az csak hab a tortán, hogy a beillesztés módja is rossz, mert nem maszkoltad ki a három bitet).
  1. SSP1BUF = ((device_control_code << 4) | (BlockAddress <<1)) + RW_bit;  // send the control byte


Ha az említett A0,A1, A2 lábak földre vannak kötve, akkor e három címbit nulla, elhagyható a beillesztés.

Mivel nálad most a Block Address éppen nulla, a fenti hiba jelenlegnem okoz gondot, de később meglepetés érhet, ha magasabb címekre próbálsz írni.
-------
A WP lábat hová kötötted? Az adatlap szerint magas szintre kell húzni, hogy az írás ne legyen letiltva. Ha pedig a WP láb földre van kötve, akkor az írás tiltott.
(#) gacserus válasza icserny hozzászólására (») Szept 27, 2014 /
 
OOOOOOOoooooooooooooohhhhhhhh.....
a WP rosszul volt bekötve.
kösz,

Gacserus
(#) pajti2 hozzászólása Okt 4, 2014 /
 
Összetalálkoztam egy olyan problémával, hogy pic-et és atmegát kötni össze spi-vel. Amennyire adatlapokból össze tudtam vadászni az infó:

-atmega.DORD=0
-atmega.CPHA=1,
-pic.CKE=1
-pic.SMP=1
-atmega.CPOL=pic.CKP (akár 1, akár 0)

és így legalább a jel fázis egyezni tud. Ha valaki futott már ebbe bele, csekkolja le nekem plz, ugyanezt csinálta-e?
Következő: »»   1184 / 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