Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1318 / 1319
(#) KoblogPerGyok hozzászólása Nov 2, 2023 /
 
Üdv!

Vannak fejlemények, de sajnos nem jók. Egyszerűen nem jó az ADC. Timer3-interruptban hívnám meg és mérnék. Elvileg ez meg is történik, de az adatok nem jók. Ennek a 12 bite módnak vannak sample A és sample B bitjei. Ha az ALTS-t 0-ra állítom, akkor a legjobb eredmény az, hogy 1 minta jó, a másik 4095, majd megint jó, megint 4095. Na ekkor jutott eszembe, hogy ok, szándékosan legyen ALTS=1,hogy váltakozzon a sample A és a sample B között. Ekkor, ha definiáltam a CH0SA-t és CH0SB-t is, pozitív és negatív pinekkel mindennel, akkor a legjobb eredményem a következő volt:
1 mérés, legyen a sampl A, kiadja a szinuszt, de csak fele minavétellel. A sample B is kiadja a szinuszt, de 180 fokos fázistolással, szintén fele mintavétellel.

Hol lehet a hiba? DMA máshogy tölti fel? Időzítési probléma? Van valaki akinek ez sikerült rendesen? dsPIC128MC802.

  1. void init_ADC_1( void )
  2. {
  3.      TRISAbits.TRISA4=1; //Analóg jel ide jön be, input
  4.     //ADPCFGbits.PCFG4=5; //adc low láb??
  5.    
  6.     //dsPIC33FJ32MC302, dsPIC33FJ64MC202/802 and dsPIC33FJ128MC202/802 devices only:
  7.     //00101 = Channel 0 positive input is AN4
  8.  
  9.     //00010 = Channel 0 positive input is AN2
  10.     //00001 = Channel 0 positive input is AN1
  11.     //00000 = Channel 0 positive input is AN0.
  12.     AD1CHS0bits.CH0SA=0b00100;
  13.     //CH0NA: Channel 0 Negative Input  for Sample A bit
  14.     //1 = Channel 0 negative input is AN1
  15.     //0 = Channel 0 negative input is VREF      
  16.     AD1CHS0bits.CH0NA=0; //channel 0 negatív ref VREF- láb
  17.    
  18.    
  19. //    AD1CHS0bits.CH0SB=0b00100;
  20. //    //CH0NB: Channel 0 Negative Input  for Sample B bit
  21. //    //1 = Channel 0 negative input is AN1
  22. //    //0 = Channel 0 negative input is VREF      
  23. //    AD1CHS0bits.CH0NB=0; //channel 0 negatív ref VREF- láb
  24.    
  25.     AD1CON1bits.FORM = 0; // Data Output Format: integer//Signed Fraction (Q15 format)
  26.     AD1CON1bits.SSRC = 0; // 000 = Clearing sample bit ends sampling and starts conversion
  27.     AD1CON1bits.ASAM = 0; // ADC Sample Control: Sampling begins immediately after conversion
  28.     AD1CON1bits.AD12B = 1; // 12-bit ADC operation SINGLE Chanel
  29.     //AD1CON1bits.SIMSAM =0; // 10-bit ADC operation
  30.     AD1CON2bits.CHPS = 0b00; // Only CH0
  31.     AD1CON2bits.CSCNA = 0; // Do not scan inputs
  32.    
  33.     AD1CON2bits.ALTS = 1; // Alternálás, Sample A és Sample B között!!!
  34.    
  35.     //bit 15-13 VCFG<2:0>: er Voltage Reference Configuration bits
  36.     //VREFH VREFL
  37.     //000 AVDD AVss
  38.     //001 External VREF+(3) AVss
  39.     //010 AVDD External VREF-(3)
  40.     //011 External VREF+(3) External VREF-(3)
  41.     //1xx AVDD AVss    
  42.  
  43.     AD1CON2bits.VCFG=0b11;
  44.     AD1CON2bits.BUFM = 0; // Always start filling at buffer 0
  45.     //    If ADRC = 0
  46.     //ADC Clock Period (TAD) = TCY ? (ADCS + 1)
  47.     //If ADRC = 1
  48.     //ADC Clock Period (TAD) = TADRC
  49.     AD1CON3bits.ADRC = 0; // ADC Clock is derived  Systems Clock
  50.     AD1CON3bits.ADCS =15; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*16 = 200ns (0.4Mhz)
  51.    
  52.    
  53.     AD1CON3bits.SAMC = 4; // Auto Sample Time = 0*Tad
  54.    
  55.  
  56.     // ADC Conversion Time for 10-bit Tc=12*Tab = 900ns (1.1MHz)
  57.     AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
  58.     AD1CON2bits.SMPI = 0; // SMPI must be 0, interrupt az els? minta után. Elvileg 16 bufferbe is tölthet
  59.  
  60.     AD1CON4bits.DMABL = 0; // Only 1 DMA buffer for each analog input
  61.  
  62.     //AD1CHS0/AD1CHS123: A/D Input  Register
  63. //    AD1CHS0bits.CH0SA = 0; // MUXA +ve input ion (AIN0) for CH0
  64. //    AD1CHS0bits.CH0NA = 0; // MUXA -ve input ion (Vref-) for CH0
  65. //Az MC802-nél nincs külön analóg bemenet negatívra lehet?ség, a ref- haszálhatom    
  66. //01 = CH1, CH2, CH3 negative input is VREF-
  67. //00 = CH1, CH2, CH3 negative input is VREF-  
  68.    
  69. //    AD1CHS123bits.CH123NB = 0; // MUXA -ve input ion (Vref-) for CH1, CH2,CH3
  70.    
  71. //CH123SB: Channel 1, 2, 3 Positive Input  for Sample B bit
  72. //If AD12B = 1:
  73. //1 = Reserved
  74. //0 = Reserved
  75. //If AD12B = 0:
  76. //1 = CH1 positive input is AN3, CH2 positive input is AN4, CH3 positive input is AN5
  77. //0 = CH1 positive input is AN0, CH2 positive input is AN1, CH3 positive input is AN2
  78. //Mert az analg jel AN4-re csatlakozik    
  79.     //AD1CHS123bits.CH123SB = 1; // MUXA +ve input ion (AIN0) for CH1
  80.  
  81.     IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
  82.     IEC0bits.AD1IE = 0; // Do Not Enable A/D interrupt
  83.  
  84.     AD1CSSLbits.CSS4 = 1; //Scan  AN4 only
  85.    
  86.  
  87.     AD1PCFGLbits.PCFG4 = 0; //Only AN4 in analog input mode
  88.  
  89.     AD1CON1bits.ADON = 1; // Turn on the A/D er
  90. }
  91.  
  92. unsigned int readADC(void) {
  93.    
  94.     // Start conversion
  95.     //Manuális módban a SAMP -nak változnia kell és meg is kell várni
  96.     AD1CON1bits.SAMP = 1;//Start sampling
  97.     while(!AD1CON1bits.SAMP); //Ameddig megy a mintavétel
  98.     //AD1CON1bits.SAMP = 0;   //Meg kell mondani, hogy vége, kezdődhet a álás
  99.     while(AD1CON1bits.SAMP);
  100.     while(!AD1CON1bits.DONE);  //Míg kész nincs a konvertálás,addig várni kell  
  101.    
  102.    
  103.     return ADC1BUF0;
A hozzászólás módosítva: Nov 2, 2023
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 2, 2023 /
 
Itt van két kép. Mindegyikben csak a_van definiálva, az egyikben az ALTS=1, ekkor a van adat, 4095, van adat, 4095 stb látszódik. Ha ALTS=0, akkor csak a SampeleA van, de kaotikus az eredmény. Most jöttem rá, hogy ez ugyanaz az eset, mintha a sample B-t is beállítanám és ALTS=1 lenne. Azaz a kép olyan, mintha két mérés lenne egymáshoz képest 180 fokkal eltolva.
A hozzászólás módosítva: Nov 2, 2023
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 2, 2023 /
 
Excelből az adatok, ha ALTS=1 és

AD1CHS0bits.CH0SA=0b00100;
AD1CHS0bits.CH0NA=0; //channel 0 negatív ref VREF- láb
AD1CHS0bits.CH0SB=0b00100;
AD1CHS0bits.CH0NB=0; //channel 0 negatív ref VREF- láb

Valamint, hogy el legynek különítve minden második adatból 10000 ki van vonva. Így látszik pontosan a fázistolás is. Lehet máshol van a gond? Idő elcsúszik és éppen úgy mintavételezne, hogy épen 180 fok tolás lenne? De ekkor sem értem mi a baj. Az input 500Hz. A mintavétel 5000/s, a timer_3 interrupja jó időben van. Igaz memóriába is írok SPI-n, de azt kimértem, bele kell férnie a t3 interrupton belül.

Időzítés hibáraazért isgondolok, mert 500Hz jel esetén, 5000 minta/s mellett, 100 mintánál 10 periódusnak kellene lennie, de csak 7 van, ha jól látom. Ez az időcsúszás éppen 500Hz egész és egy fél periódus lenne? Mert ugye N=0,1,2 stb és egy fél esetén lenne éppen ekkora az időcsúszás. 1/500 =2 ms. Ha jól sejtem, akkor 0.5, 1.5, 2.5, 3.5 stb ms csúszés okoz éppen ilyen eltolást kapnék. De ekkorát késne az ADC?
A hozzászólás módosítva: Nov 2, 2023
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 2, 2023 /
 
Vagy éppen alul van mintavételezve? 16 Buffere van, lehet 16x mér egy helyett? De akkor a timer3 interrupt is komolyan nem menne. Nem értem én ezt, miért nem jó. Egyszerően 1 db csatornét kell mintavételeznem 5000 minta/s -el, a jel az AN4-en van, a referencia feszültségek pedig a Vref-, Vref+-on vannak, az input negatívja meg legyen Vref-. Ez nem akar összejönni. Kicsit körülményesebb, mint az analogread() arduino-ban!
(#) asch válasza KoblogPerGyok hozzászólására (») Nov 2, 2023 / 1
 
A PC-re átküldés tuti, hogy tökéletes? Nem írja esetleg felül a következő mérési kör az értékeket miközben csorognak az adatok UART-on át?
(#) Hp41C válasza KoblogPerGyok hozzászólására (») Nov 2, 2023 /
 
A dsPIC33F/PIC24H Family Reference Manual Section 16. Analog-to-Digital Converter (ADC) szerint:
Idézet:
„For devices with DMA, the ADC module is connected to a single-word result buffer. However, multiple conversion results can be stored in a DMA RAM buffer with no CPU overhead when DMA is used with the ADC module. Each conversion result is converted to one of four 16-bit output formats when it is read from the buffer”
(#) KoblogPerGyok válasza asch hozzászólására (») Nov 2, 2023 /
 
Szia!

Nem, mert az uart csak akkor fut le, ha már megtörtént 100 mintavétel. A RAM-ból azután történik a kiolvasás és küldés UART-on. SPI-n megy elég gyorsan minden, lemértem a timer3-al a konverziót is, a végén UART-on ki tudom küldeni azt is. Átírtam a kódot úgy is korábban, hogy csak 1 mintát vesz és a timer tick értékeit kiküldi uarton. Ebbe simán belefér.
(#) KoblogPerGyok válasza Hp41C hozzászólására (») Nov 2, 2023 /
 
Szia!

Ezt nem értem. Gondoltam ilyesmi hibára is, de nem tudom ilyenkor hol is van a hiba pontosan? A sample A-ban kiolvasott jó, a sample B-ből már nem. (Mindkét megoldás lehetséges, azaz az ALTS=1, és a AD1CHS0bits.CH0SA=0b00100; AD1CHS0bits.CH0SB=0b00100; stb is lehet ugyanazon a bemeneten, de nem értem ekkor mit, hogyan értelmezve kell kiolvasnom a sample B esetén. Nekem az a megoldás is jó,ha az ALTS=0, és csak az A-ra van konfigurálva.

Kérlek áruld el, hol a hiba pontoan, mert belebolondulok!

Idézet:
„Minden konverziós eredmény a négy 16 bites kimeneti formátum egyikére konvertálódik, amikor kiolvassák a pufferből.”


De ezt állítom be a formátummal ha jól értem.
AD1CON1bits.FORM = 0; // Data Output Format: integer//Signed Fraction (Q15 format)

Idézet:
„„DMA-val rendelkező eszközök esetén az ADC modul egyszavas eredménypufferhez csatlakozik. Azonban több konverziós eredmény is tárolható egy DMA RAM pufferben CPU többletterhelés nélkül, ha DMA-t használunk az ADC modullal.”


Máshol vannak a helyes sorrendű adatok? Ugye 16Buffer van. Ha sample B-t keresem, akkor esetleg az a ADC1BUF1;-ben lenne? Azt meg nem érem el... Legalábbis eddig nem sikerült, mert hibára futott az MPLAB.

A tárolás miatt ilyen?
return ADC1BUF0;
Ebbe keveredik össze valahogy? Azt hittem ide másolódnak az eredmények minden esetben, ha csak 1 csatornát használok. A sample A ALTS=0 esetén ide íródik minden esetben nem? Vagy a BUF1- stb is bekavar kicsit? Rossz helyről olvasom az eredményeket?
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 3, 2023 /
 
Naná, hogy nem itt volt a hiba!!!

Persze minden regisztert végignéztem, megtanultam, kiagyaltam magam, erre hol a hiba? Na hol? Hát a timer3 init-ben overflow esemény.... Hát kész. 1 perc sem volt átírni, erre 2 nap ment el. Bár legalább lassan az ADC-ben expert leszek. Fejből nyomom már az összes regiszert lassan...

Mert szebbé tettem a kódot... Hát sikerült elálítanom. Erre rájöhettem volna, mert a jel nem megfelelő időközönként volt mintavételezve. Persze most már állíthatom ahogy akarom, megy minden variációban....
A hozzászólás módosítva: Nov 3, 2023
(#) icserny válasza KoblogPerGyok hozzászólására (») Nov 3, 2023 / 1
 
A problémádhoz nem tudok hozzászólni, de a readADC() függvényben az
  1. AD1CON1bits.SAMP = 1; //Start sampling

után tegyél be egy NOP-ot, mielőtt tesztelni kezdenéd a bitet, mert az okosok szerint némi időbe telik, amíg a bit ténylegesen törlődik! Bővebben: Link
(#) KoblogPerGyok válasza icserny hozzászólására (») Nov 3, 2023 /
 
És még betettem egy AD1CON1bits.DONE=0; sort is elé, mert a leírás szerint ez nem törlődik automatikusan, mert most manuálisan van indítva.
(#) KoblogPerGyok hozzászólása Nov 4, 2023 /
 
Ok, egy gyors kérsés, biztos ami biztos, mielőtt élesben kipróbálnám.

A Vref+, és Vref- lébak között van kondenzátor már, de nem tudom, hogy kell-e ilyenkor áram korlátozó ellenállás, vagy direktben mehet rájuk? Nem szeretném elföstölni, még akkor sem, ha elvileg nem kell, azaz több helyen azt mondták, hogy nem kell. Vagy kell-e valami plusz beállítás a dsPIC33Fj-ben, azaz a pint megfelelően konfigurálni kell-e ekkor. A másik, hogy az analóg bemenet A4 lenne, de ekkor oda is kell korlátozó ellenállás, nem?

Nem foglalkoztam eddig analóg lábakkal, csak digitáliskkal, ott kell ere figyelni. 2mA körülire korlátoztam mindegyik digitális lábat. (lehet mindegyikben eleve van korlátozó ellenállás, de nem vagyok biztos benne)

Köszönöm!
(#) Bakman válasza KoblogPerGyok hozzászólására (») Nov 4, 2023 / 1
 
Felesleges az ellenállás, csak ront a pontosságon (vagy lassítod az ADC mérést). Adatlap tartalmazza, maximum milyen (belső) ellenállású lehet a forrásfeszültség. PIC18F27Q43 esetében pl. 10 kΩ az ajánlott maximális ellenállás, de hasonló értékre emlékszem több adatlapból is.
(#) KoblogPerGyok válasza Bakman hozzászólására (») Nov 4, 2023 /
 
Szia!

Köszönöm! Erre jutottam én is, mert átgondoltam, a mintavétel/tartó kondenzátornak sem jó, ha nagy az ellenállás, meg szórt kapacitásokkal nagy ellenállás szűrhet. Végül rákötöttem, van eredmény, de nem túl jó. A jel bejön, de nem jó, bár látszódik a szinusz jel, de frekiben sem jó, meg a megjelenítő programomban is van hiba még.

De!
A szimuláció megint nincs összhangban a valósággal. Rákötöttem a Pickit-3-at, debug, és megáll.... Minden megy, tesztkódok, amik RAM-ba írnak, olvasnak, stb, de itt
while (!AD1CON1bits.DONE);-nál megáll. Legalábbis az én kódomban. Másik példával nem áll meg, de akkor a szimulációban van hiba az adatokban.
A valóság és a szimuláció között van némi defekt.
(#) KoblogPerGyok válasza KoblogPerGyok hozzászólására (») Nov 5, 2023 /
 
A szimuláció és a valóság közötti szakadék volt megint a hiba. Kicsit megkerültem a dolgot, mert interrupt-ok összeakadnak, és a DONE bit soha nem lesz 1. A kód valójában működik, csak a szimulációban is ment, míg a valóságban nem. De ennek más oka volt. Most már sebességet is lehet mérni, miden jó.

Hát ebből is lehet tanulni, de nekem ráment pár hajszálam, és a szókincsem is bővült kicsit.
(#) Jani_80 hozzászólása Jan 1, 2024 /
 
Sziasztok! Én jó ideje a PIC16F877-es típust használom (CCS-C fordítóval MPLAB IDE v8.9-el és PIC kit2-vel), de itt tudtam meg, hogy ennek a 18F -es leváltója (teljesen lábkompatibilis elvileg) a PIC18F45K22. Ha minden igaz akkor ezt így fogom tudni használni: CCS-C fordítóval, MPLAB IDE v8.9-el és PIC kit3-al vagy ICD2-vel, ebben meg tud valaki erősíteni hogy ezekkel használható?

Másik kérdésem az lenne, hogy valaki tudna nekem küldeni ehhez a PIC18F45K22 -hez 18F45K22.h header fájlt? (Nem ASM-hez hanem C-hez, konkrétan CCS-C fordítót használok). Sajnos nem találtam sehol 20perc keresgéléssel sem. Illetve amit találtam az ez 18LF45K22.h, elképzeklhető hogy ez is jó hozzá?

Köszi szépen! És BUÉK!
(#) ha8lls hozzászólása Jan 10, 2024 /
 
Sziasztok!
PIC16F18446 (curiosity), I2C host mode, MSSP1 hardveres megszakítással, DS3231 RTC modullal.
Problémám a következő. Ha írok az RTC-be I2C1_Write(clientAddr, transmitData, writeLength) utasítással vagy olvasok I2C1_WriteRead vagy I2C1_Read utasítással akkor szépen működik. Azonban ha a I2C1_Write után bármelyik (WriteRead vagy Read) utasításokat használom akkor a Write-ot végrehajtja, STOP-ot kiküldi, SCL és SDA vonalakat elengedi és "elfelejti" a következő utasítást (WriteRead vagy Read) végrehajtani. Azonban ha a Write után teszek 10msec-nál hosszabb késleltetést akkor szépen működik, csakhát, az időveszteség...
Találkozott már valaki ezzel a problémával?
(#) Bakman válasza ha8lls hozzászólására (») Jan 10, 2024 / 1
 
Nem értem a logikát, miért jó azonnal olvasni egy RTC IC-t közvetlen írás után, de talán nem ez a lényeg.

Az "I2C1_Write", "I2C1_WriteRead" vagy "I2C1_Read" utasítás tulajdonképpen egy utasítás csoport, ami mögött húzódhat bármi, azok ismerete nélkül még tippelni is nehéz.

Gyaníthatóan az "I2C1_Write" makróból akkor tér vissza a program, amikor az I2C modul még elfoglalt valamivel, valószínűleg a Stop végrehajtásával. A makró utasítja az I2C modult, hogy küldje ki a Stop folyamatot, de nem várja meg, hogy az be is fejeződjön. Azonnal ugrik a "Read" makróba, abban pedig van vizsgálat, szabad-e az I2C modul. Mivel nem, mert még nem fejezte be az előző feladatot, a koplett utasítássort kikerüli egy feltételes vizsgálat miatt. Ez "külső" szemlélőnek úgy tűnhet, hogy nem hajtja végre a parancsokat (makróban lévő utasításokat). Ez leginkább akkor tettenérhető, ha az I2C 100 kHz-en ketyeg, de a CPU-t 32 MHz-en járatod.

Könnyen kideríthető a dolog egy logikai analizátorral, ha van szabad láb.

I2C1_Write(....);
LATAbits.LATA0=1; //pl. RA0 láb H szintre billentése
I2C1_Read(....);

Ha a kimenet előbb vált magas szintre, mint ahogy az I2C modul végezne az adással, akkor az a helyzet, amit vázoltam, remélhetőleg érthetően.
A hozzászólás módosítva: Jan 10, 2024
(#) ha8lls válasza Bakman hozzászólására (») Jan 12, 2024 /
 
Való igaz, lehet, hogy nem "életszerű" az írás utáni közvetlen olvasás. Hardveres MSSP-t nem használtam/konfiguráltam még és kíváncsi voltam, jelen esetben mennyire "sikerült" megoldania a gyártónak. Előtte 16F690-nel próbálkoztam, de ott sok helyen azt írták, hogy a hardveres MSSP kezelés nem igazán sikerült a Microchipnek és a szoftvereset ajánlják azon. Kiprópáltam 16F18446-on és egyből "belenyúltam" egy általam vélt hibának. (...mert nem tudom még lekezelni )

Logikai analizátorom van, 32 csatornás. ...csak 300km-rel "arrébb".

Egyébként a buszt 100kHz-en hajtom és 4MHz-en 2-es osztóval. Azért alacsony az órajel mert fontos a minél kisebb áramfelvétel. Terepi működés 3db AA-s elemről.

Köszönöm a tippet, megnézem majd.
(#) Bakman válasza ha8lls hozzászólására (») Jan 12, 2024 /
 
Idézet:
„mennyire "sikerült" megoldania a gyártónak.”
Van itt egy-két dolog. Az, hogy egy előre megírt funkciót használsz és az nem felel meg az igényeidnek, nem biztos, hogy a gyártó hibája. Ha egyedi igényeid vannak, akkor írnod kell magadnak MSSP kezelő funkciót, amiben ez a hiba (már ha annak nevezzük) kezelve van. Nem egy nagy durranás, hétvégén tudok neked feltölteni élő, működő példákat, azon majd látni fogod, mennyire nem éri meg ilyen alap dolgok kezelését másra bízni.

Egy rakás ilyen problémával lehet találkozni pl. Ardunio környezetben is. Előre, más által megírt könyvtárak, amelyek nem mindenkinél működnek úgy, ahogy azok használója szeretné.
(#) Bakman válasza ha8lls hozzászólására (») Jan 12, 2024 /
 
Erről a kódról beszéltem korábban:

  1. void i2c_start(void) {
  2.     SSP1CON2bits.SEN = 1;
  3.     while (SSP1CON2bits.SEN == 1);
  4. }
  5.  
  6. void i2c_restart(void) {
  7.     SSP1CON2bits.RSEN = 1;
  8.     while (SSP1CON2bits.RSEN == 1);
  9. }
  10.  
  11. void i2c_stop(void) {
  12.     SSP1CON2bits.PEN = 1;
  13.     while (SSP1CON2bits.PEN == 1);
  14. }
  15.  
  16. void i2c_ack(void) {
  17.     SSP1CON2bits.ACKDT = 0;
  18.     SSP1CON2bits.ACKEN = 1;
  19.     while (SSP1CON2bits.ACKEN == 1);
  20. }
  21.  
  22. void i2c_nack(void) {
  23.     SSP1CON2bits.ACKDT = 1;
  24.     SSP1CON2bits.ACKEN = 1;
  25.     while (SSP1CON2bits.ACKEN == 1);
  26. }
  27.  
  28. void i2c_writebyte(uint8_t data) {
  29.     SSP1BUF = data;
  30.     while (SSP1STATbits.R_nW == 1);
  31.  
  32. }
  33.  
  34. uint8_t i2c_readbyte(void) {
  35.     SSP1CON2bits.RCEN = 1;
  36.     while (SSP1STATbits.BF == 0);
  37.     return SSP1BUF;
  38. }

Ebben a program futása akkor tér vissza a funkcióból, ha az adott feladatot letudta az I2C (MSSP) modul. DS3231 idő kiolvasása:

  1. i2c_start();
  2. i2c_writebyte(0b11010000); //DS3231 címe + írás bit
  3. i2c_writebyte(0x00); //DS3231 0x00 regiszter
  4. i2c_restart();
  5. i2c_writebyte(0b11010001); //DS3231 címe + olvasás bit
  6. sec=i2c_readbyte(); //sec változóba a 0x00 regiszter tartalma
  7. i2c_ack();
  8. min=i2c_readbyte(); //min váltzóba a 0x01 regiszter tartalma
  9. i2c_ack();
  10. hour=i2c_readbyte(); //hour változóba a 0x02 regiszter tartalma
  11. i2c_nack;
  12. i2c_stop;

Ennyi, ez van az adatlapban is, lásd melléklet. Az IC automatikusan növeli íráskor vagy olvasáskor a belső mutatót (hogy éppen melyik regisztert írod vagy olvasod), azzal neked külön nem kell foglalkoznod. Ezt nem mindig és minden IC végzi el, adatlapot kell megnézni. Viszont, olvasás előtt be kell állítani, honnan is kezdődjön az olvasás, a restart előtti részen látható a dolog. Természetesen nem kötelező az "elejétől" olvasni az IC-t, ha a 3. sorban lévő nulla értéket kicseréled a neked tetszőre (pl. 0x0E: Control regiszter), akkor az olvasási folyamat onnan kezdődik.
A hozzászólás módosítva: Jan 12, 2024
(#) enree hozzászólása Feb 24, 2024 /
 
Tiszteletem minden PIC értő mesternek!
Adott az alábbi projekt amit már sok éve egyszer megépítettem, hibátlanul működik azóta is a régi autómban. Most újra összeraktam, ugyanarra a nyákra, ugyanolyan LCD-vel. Sajnos azt csinálja, hogy 7,4V-ig normálisan méri a feszültséget, a fölött a képek szerinti bolondulás van. Lehet, hogy az eBay-es PIC hamisítvány, amit most rendeltem? Bár ez elég fura lenne, hogy x szintig jól mér az adc, fölötte meg nem? Előre is köszi ha van valami tippetek.
Amit idáig mértem; stabil a PIC-en a tápfesz, az ADC nem kap többet, mint 5V.
(#) Bakman válasza enree hozzászólására (») Feb 24, 2024 /
 
Próbáld meg a kijelzőhöz tartozó vezetékeket széthúzni egymástól, a kijelző táplábaira pedig rakj egy 4.7 - 10 µF-os, valamint egy 100 nF-os kondenzátort.
(#) enree válasza Bakman hozzászólására (») Feb 24, 2024 /
 
Ok, holnap csekkolom, köszi. A PCB-n rommá van szűrve minden 100n-val, de hátha. Beszámolok majd, hogy mi lett.
(#) icserny válasza enree hozzászólására (») Feb 25, 2024 /
 
Próbáld meg maszkolni az ADC eredmény 10.-15. bitjeit! Múltkor futottam be egy ilyen hülyeségbe, hogy fél feszültség fölött a nem használt bitek mind 1-be álltak.
(#) enree válasza enree hozzászólására (») Feb 25, 2024 /
 
Sajnos nem segített.
(#) enree válasza icserny hozzászólására (») Feb 25, 2024 /
 
Ok, lehet az lesz, csak amit nem értek, hogy hogy a bánatba működött ez a hex 10 évvel ezelőtt hibátlanul, ugyanezzel az égetővel, ugyanezen a nyákon, minden ugyanaz. Még a nyákon lévő alkatrészek is ugyanazok, akkor kettőt építettem belőle, de csak az egyik kapott lcd-t és pic-et, a másik azóta egy dobozban pihent idáig. Most meg az őrületbe kerget...
(#) KoblogPerGyok válasza enree hozzászólására (») Feb 25, 2024 /
 
Szia!

Szerintem az áramkörnek is vannak kisebb hibái, jobban mondva másik PIC-nél kicsit más megoldásokat javasoltak, de ha ezzel is mennie kellene, akkor ok.

Elektrolit kondik 10 év alatt nem mentek gallyra? Forrasztások is mindenhol jók? A teszteket hogyan végzed? Kell ide közös föld? 10 évvel ezelőtt nem történhetett meg, hogy másik program került rá?

A PIC teljesen ugyanolyan? Mármint 16F864 -A/B/C akármi?
(#) majkimester válasza enree hozzászólására (») Feb 25, 2024 /
 
Ebben a postban van egy forrás, nem tudom, hogy ezt használod-e:

  1. Res1   CON 20000                ; Top Resistor of Voltage Divider
  2. Res2   CON 10000                ; Bottom Resistor of Divider
  3. ...
  4. Volts      VAR WORD
  5. VDD    CON 50                   ; VDD voltage
  6. ...
  7. RT     CON Res1 + Res2          ; Total Divider Resistance
  8. ...
  9. ReadVoltage:
  10.     ADCIN 3, RawBattery
  11.     Volts=RawBattery * Rt
  12.     Volts=DIV32 Res2
  13.     Volts=Volts * VDD
  14.     Volts=DIV32 1023


RawBattery a 10 bites ADC értéke, 0..1023 között
A WORD típus előjel nélkül 2 byte. 0...65535 amit tárolni tud.

Volts=RawBattery * Rt = max értéke 1023 * 30000 = 30 690 000

Ez már régen nem fér bele a Volts-ba, de picbasicben (nem értek hozzá, csak most olvastam ITT), hogy a szorzás után közvetlen végrehajtott DIV32 nem a Volts-ban tárolt alsó 16 bittel, hanem az előtte lévő szorzás teljes 32 (helyett valójában 31) bittel számol. Ez jól működik, ha nincs közötte IT, de itt nincs letiltva az IT a művelet idejére. Ez okozhat problémát. (A főprogramban nem látok IT-t de valamelyik include-ban ettől használhat, mert egy helyen már letiltja/engedelyezi.)

Próbáld ki az alábbiak közé tenni a számítás ezen részét, ahol DIV32-ot használ:

  1. GIE=0                               ; disable interrupts
  2.        
  3.     ADCIN 3, RawBattery
  4.     Volts=RawBattery * Rt
  5.     Volts=DIV32 Res2
  6.     Volts=Volts * VDD
  7.     Volts=DIV32 1023
  8.  
  9.     GIE=1


És a többi helyen is a szorzást és az azt követő DIV32-őt tedd GIE=0 majd GIE=1 közé.
(#) enree válasza majkimester hozzászólására (») Feb 26, 2024 / 1
 
Sziasztok!
Köszönöm mindenkinek, aki próbált segíteni, a megoldás egyszerű; vegyél eredeti PIC-et, ne gagyit az eBay-ről, mint én. Egyből ment normálisan a régi HEX-el, mindenféle ráolvasás, esőtánc és egyéb nélkül.
Következő: »»   1318 / 1319
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