Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1299 / 1319
(#) cross51 válasza usane hozzászólására (») Okt 18, 2018 /
 
Én Eddig MX-et akkor használtam amikor elkezdtem 32 bitezni mert abból volt DIP-es aztán azóta csak MZ-ket használok azon kívül hogy nem megy rá kvarc más nem nagyon akasztott ki benne.
Jó az ADC-t ha pontos mérésre akarjuk használni lehet felejtős, bár mostani projektben PT100-is kifejezetten pontosan mér és feszültséget is sima 1%-os osztóval is pontosan mérek vele, bár nincs rá igény.

Az MZ nem feltétlen a nagy periféria készlete miatt szoktam használni hanem egy kicsit a kényelem miatt, sokáig míg assembly-ztem és assembly-c átmenetbe voltam nagy optimalizálás őrült voltam, de elmúlt

Amit a harmony-ból használtam Timer, SYS_TMR service-ek, ADC_HS, UART, I2C, USB, RESET, SYS_DMA (nagyjából ezek)

És elkezdeni nem volt egyszerű bár a c++ segített rajta, mert ahogyan érzékeltem a library elég erősen objektum orientáltságra hajtottak (persze valós hiba kezelés nélkül).

Van egy két hely ahol ki jön hogy más más ember csinálta a libary-t szerint az I2C és UART API része jobban eltér mint ahogyan kellene.

Viszont ami nagy előny volt az egészben hogy semmivel nem kellet nagyon szenvedjek
(persze eltekintve míg fel nem fogtam, hogy hogyan épülnek fel a library-k)
és az összes library non-blocking-ra konfigolható tehát könnyen fűzhető hozzájuk más (és RTOS-hoz is jó).

Azt vettem észre, hogy egész jól használhatóak c++-al együtt is (bár a harmony még nem erre van kitalálva - kicsit szenvedős ezen a téren)

Lezárásként az eddig itt hallottakból egy fél-egy éves használat után pozitív csalódást hozott.
Valamint amit egyre fontosabbnak tartok az elnevezési konzekvencia - itt kifejezetten jól sikerült
(#) usane válasza cross51 hozzászólására (») Okt 19, 2018 /
 
Az MZ-ket nem nagyon néztem, mert nem kellett az a sebesség, na meg kell a periféria, bár főleg kommunikációs. Most is olyanon töröm a fejem amihez minimum 1 IIC, 2 SPI és 2 UART kell, (teszthez 3 UART). Illetve a v1 már kész van, de dolgozom a v2-n. Meg úgy gondoltam az MX-ek jobban kiforrtak már, de úgy nézem amit egyszer kiadnak az úgy marad. A minap böngésztem ehhez a projekthet az MX-eket és nem nagyon találtam olyat amiben megvolt az összes szükéges periféria és ne lett volna hibás valamelyik. Némelyik megkerülhető, de vannak nagyon durvák is.
(#) pajti2 válasza usane hozzászólására (») Okt 19, 2018 /
 
Az MX-eket azért nem fejlesztik tovább, mert ha el tudják adni a havi díjas (!) MZ fordítót, az sokkal többet hoz a konyhára. Még nem eldöntött játék, tényleg nyerik-e azt a meccset, vagy csak átkergetik a teljes közösségüket másik gyártóhoz. Egyenlőre úgy tűnik, nem a tapasztaltabbik irányban haladnak a lejtőn.
(#) marcellus96 hozzászólása Nov 1, 2018 /
 
Sziasztok!
20 ms-onként szeretnék 1->500 us-ig változtatható kitöltési tényezőjű jelet előállítani.
Ehhez beállítottam a TMR1 megszakítást 20 ms-ra a TMR2-őt pedig 1 us-ra. TMR1-ből indítom TMR2 megszakítást 20 ms-onként. A rendszer órajelem 32 MHz. Ilyen módon a kimeneten mért jelet nem sikerült 4,5 us alá vinnem. (Ekkor a megszakításban csak egy kimenet állítás van, meg az interrupt flag törlése.) Így megpróbáltam egy olyan variációt is, hogy a 20 ms-os megszakításba tettem egy szoftveres késleltetést (tudom, hogy nem szép dolog), így 270 ns-ig képes voltam lecsökkenteni a kimeneti jel magas szintjének idejét. (A felhasznált PIC 16F18857 típusú)
Ezt a feladatot továbbra is időzítőkkel szeretném megoldani, van valami ötletetek esetleg?
A válaszokat előre is köszönöm!
A hozzászólás módosítva: Nov 1, 2018
(#) icserny válasza marcellus96 hozzászólására (») Nov 2, 2018 /
 
1 us megszakítás helyett nem lehetne valami haladottabb módon előállítani az impulzust, pl. az adatlap 29.5.5 SOFTWARE START ONE-SHOT MODE alfejezete szerint?
(#) marcellus96 válasza icserny hozzászólására (») Nov 2, 2018 /
 
Ez annyit csinál, hogy minden túlcsordulás után törli az engedélyező bitjét nem? Tehát mindig engedélyeznem kell a 20 ms-os megszakításban. Egy láb magas szintbe állítását viszont így is a TMR2 megszakításban kellene elvégeznem nem?
(#) icserny válasza marcellus96 hozzászólására (») Nov 2, 2018 / 1
 
"Tehát mindig engedélyeznem kell a 20 ms-os megszakításban."
Nekem úgy tűnt, hogy igen.

Idézet:
„Egy láb magas szintbe állítását viszont így is a TMR2 megszakításban kellene elvégeznem nem?”
Pont azt szeretném elérni, hogy erre ne legyen szükség.
De ennek részleteit az adatlapból kell kisilabizálni. Futólag olvasva ott volt olyasmi, hogy PWM-mel kell kombinálni, hogy kiadja az impulzust. De nem merültem el a részletekben, mert nem használok ilyen mikrovezérlőt (és a jövőben sem szeretnék).
(#) marcellus96 válasza icserny hozzászólására (») Nov 2, 2018 /
 
Rendben köszönöm! Most egyébként az NCO-t és a TMR2-t hoztam össze CLC modul segítségével (S-R tárolóként használva). Egész jó úton haladok így is, de próbálkozok még a one-shot móddal is.
(#) tothtechnika2 hozzászólása Nov 15, 2018 /
 
Sziasztok!

Adott a PIC32MM0256GPM028 32bites pic. Sajnos a fordító nem engedi beincludolni a plib.h-t mert hiányol valami megszakítást.

Szeretnék pár bájt adatot letárolni a flash-be, hogy kikapcsoláskor ne veszítse el, hogy következő bekapcsolásnál visszatölthessem. A dee_emulation_pic32-t hívtam segítségül, de ez is a plib.h-t akarja beölteni. Megnéztem milyen függvényeket használ, NVMUnlock,NVMWriteRow,NVMWriteWord,NVMErasePage,NVMProgram. Ezeket megkerestem neten, beletettem. A program lefordul, de nem működik. Nem tárolja el az adatokat, és kiolvasni sem tudja.

  1. void nvm_save(uint16_t x) {
  2.     char buf[10];
  3.     int e;
  4.     DEEdata = x;
  5.     if(e=DataEEWrite(DEEdata,DEEaddr)) {
  6.         sprintf(buf, "e%d", e);
  7.         disp_write_str2(1,40,  buf, 1, font8x8);
  8.        }
  9. }
  10.  
  11. int nvm_read(void){
  12.     char buf[10];
  13.     int e;
  14.     int value;
  15.     if(e=DataEERead(&value, DEEaddr))  {
  16.          sprintf(buf, "r%d", e);
  17.          disp_write_str2(32,40,  buf, 1, font8x8);
  18.        }
  19.     return value;
  20. }


Ezeket az egyszerű függvényeket írtam. Sajnos írásnál is 6-os hibakóddal tér vissza.
A DataEEWrite függvény leírásában a hatos hibakód : Value 6 for page corrupt status.
Erről a sorról van szó:
  1. if(((e=DataEERead(&dataRead,addr)) != 0) && (dataEEFlags.val >1))
  2.     {
  3.         return (6); //error condition
  4.     }


Itt is az e-> 6, tehát a DataEERead is 6-os hibakóddal tér vissza. Itt ez Value 6 for page corrupt status.-t mond. Van valakinek valami tippje mi lehet ez?

Elküldöm mellékletbe a saját dee_emulation fájlomat. Nagyon hálás lennék, ha valaki tudna segíteni, más nagyon sok órám ráment erre az egészre.
A hozzászólás módosítva: Nov 15, 2018
Moderátor által szerkesztve
(#) Wezuv válasza tothtechnika2 hozzászólására (») Nov 16, 2018 /
 
A DataEEInit -et lefuttatod a függvények futtatása előtt?
(#) tothtechnika2 válasza Wezuv hozzászólására (») Nov 16, 2018 /
 
Nem, az kimaradt De most pótoltam, és a hiba pontosan ugyanaz sajnos.
(#) tothtechnika2 válasza tothtechnika2 hozzászólására (») Nov 16, 2018 /
 
Az init 7-es hibakóddal tér vissza: Value 7 for write error.
(#) cross51 válasza tothtechnika2 hozzászólására (») Nov 16, 2018 /
 
Gyors átfutásból azt látom, hogy a NVMWriteWord-ot nem lesz jó ehhez a PIC-hez.
Idézet:
„The memory
can be programmed by rows or by two 32-bit words,
called double-words.”


Az NVMDATA0/1 nem egy 32 bites upper lower half hanem 64 bites regiszterpár.

Ez biztos, hogy az egészet fel fogja borítani, de csak így használható ezen a PIC-en.
  1. unsigned int NVMWriteDoubleWord (void* address, unsigned int upperWord, unsigned int lowerWord){
  2.     unsigned int res;
  3.     // Load data into NVMDATA register
  4.     NVMDATA0 = lowerWord; // lower word
  5.     NVMDATA1 = upperWord; // upper word
  6.     // Load address to program into NVMADDR register
  7.     NVMADDR = (volatile unsigned int) address;
  8.     // Unlock and Write Word
  9.     res = NVMUnlock (0x4010);
  10.     // Return Result
  11.     return res;
  12. }
(#) tothtechnika2 válasza cross51 hozzászólására (») Nov 16, 2018 /
 
Megoldottad a problémámat! Nagyon köszönöm!
(#) DRoland válasza DRoland hozzászólására (») Nov 21, 2018 /
 
Sikerült megcsinálni, gondoltam megosztom veletek. A választott PIC végül a PIC18F4620 lett. Egy ideig félre raktam a dolgot, de kb 1 hete megint előszedtem.
8. pontként írhattam volna még ezt is:
PIC16: MOVFW SET_FREQ_2
PIC18: MOVF SET_FREQ_2,W
mivel nem így csináltam ezért sok minden nem is működött
Azt egyébként nem is írtam, hogy először PIC18-on nem is sikerült az EEPROM-ba menteni. Amikor kézi hangolás után el akartam menteni az adott csatornát, a szükséges 7 byte-ból mindig csak az elsőt mentette le. Nem is tudtam mire vélni a dolgot. Úgy sikerült megcsinálni, hogy az írási műveletek között várok pár száz msec-et.
Kép
A hozzászólás módosítva: Nov 21, 2018
(#) pipi válasza DRoland hozzászólására (») Nov 21, 2018 /
 
Hali! Nekem ez működik 4620-on mplabc18\v3.38\
  1. void Write_b_eepr( unsigned char badd,unsigned char bdata )
  2. {
  3.         static BYTE inter;
  4.         inter=INTCONbits.GIEH;
  5.        
  6.         EECON1bits.WREN = 1;
  7.         INTCONbits.GIEH=0;      //interrupt dis
  8.         INTCONbits.GIEH=0;      //interrupt dis
  9. //      INTCONbits.GIEL=0;      //interrupt dis
  10.         EEADR = badd;
  11.         EEDATA = bdata;
  12.         EECON1bits.EEPGD = 0;
  13.         EECON1bits.CFGS = 0;
  14.         EECON2 = 0x55;
  15.         EECON2 = 0xAA;
  16.         EECON1bits.WR = 1;
  17.         Nop();
  18.         while(EECON1bits.WR);
  19.        
  20.         INTCONbits.GIEH = inter;
  21.         INTCONbits.GIEH = inter;
  22.         EECON1bits.WREN = 0;
  23. }
  24.  
  25. /*void Busy_eep ( void )
  26. {
  27.         while(EECON1bits.WR);
  28. }
  29.  
  30. */
  31. unsigned char Read_b_eepr( unsigned char badd )
  32. {
  33. static BYTE deee;
  34. static BYTE inter;
  35.         inter=INTCONbits.GIEH;
  36.         INTCONbits.GIEH=0;      //interrupt di
  37.         INTCONbits.GIEH=0;      //interrupt di
  38.         EEADR = badd;
  39.         EECON1bits.CFGS = 0;
  40.         EECON1bits.EEPGD = 0;
  41.         Nop()//ld. errata
  42.         Nop();
  43.         Nop();
  44.         Nop();
  45.  
  46.         EECON1bits.RD = 1;
  47.         Nop();
  48.         Nop();
  49.         Nop();
  50.         Nop();
  51.         deee= EEDATA;
  52.         INTCONbits.GIEH=inter;  //interrupt en/di (int0)
  53.         INTCONbits.GIEH=inter;  //interrupt en/di (int0)
  54.         return (deee);              // return with read byte
  55. }
(#) DRoland válasza pipi hozzászólására (») Nov 21, 2018 /
 
Köszi, hogy megmutattad! Az enyém pedig így néz ki:
  1. EP_READ
  2.         BCF     EECON1,EEPGD
  3.         BCF     EECON1,CFGS
  4.         BSF     EECON1,RD
  5.         MOVF    EEDATA,W
  6.         RETURN
  7. EP_WRITE
  8.         MOVWF   EEDATA
  9.         BCF     INTCON,GIE
  10.         BCF     EECON1,EEPGD
  11.         BCF     EECON1,CFGS
  12.         BSF     EECON1,WREN
  13.         MOVLW   55h
  14.         MOVWF   EECON2
  15.         MOVLW   0AAh
  16.         MOVWF   EECON2
  17.         BSF     EECON1,WR
  18.         BCF     EECON1,WREN
  19.         CALL    IDOZIT_EEPROM
  20.         RETURN
  21. EP_ADDRESS
  22.         MOVWF   EEADR
  23.         CLRF    EEADRH
  24.         RETURN 
  25. IDOZIT_EEPROM
  26.         MOVLW   D'10'
  27.         RCALL   DELAY_PROG
  28.         RETURN
  29. DELAY_PROG
  30.         CLRF    WAIT1
  31.         CLRF    WAIT2
  32.         CLRF    WAIT3
  33.         MOVWF   WAIT3
  34.         CLRWDT
  35. IDE
  36.         DECFSZ  WAIT1
  37.         BRA             IDE
  38.         DECFSZ  WAIT2
  39.         BRA             IDE
  40.         DECFSZ  WAIT3
  41.         BRA     IDE
  42.         RETURN
A hozzászólás módosítva: Nov 21, 2018
(#) Hp41C válasza pipi hozzászólására (») Nov 21, 2018 /
 
Olvasáshoz nem kell tiltani a megszakítást.
PIC18F2620 -on jól működik:
  1. void EE_WriteByte(unsigned char byte_address, unsigned char write_byte)
  2. {
  3.     unsigned char interrupts_on;
  4.  
  5.     EEADR  = byte_address;
  6.     EEDATA = write_byte;
  7.     EECON1 = 0;
  8.     EECON1bits.WREN = 1;
  9.  
  10.     interrupts_on = INTCON & 0xC0;
  11.     INTCONbits.GIEH = 0;                // uninterruptable routine
  12.     INTCONbits.GIEL = 0;
  13.  
  14.     EECON2 = 0x55;
  15.     EECON2 = 0xAA;
  16.     EECON1bits.WR = 1;
  17.  
  18.     INTCON |= interrupts_on;    // turn interrupts back on if enabled.
  19.  
  20.     while (EECON1bits.WR);      // wait for write to complete
  21.         EECON1bits.WREN = 0;
  22. }
  23.  
  24. unsigned char EE_ReadByte(unsigned char byte_address)
  25. {
  26.     EEADR  = byte_address;
  27.     EECON1 = 0;
  28.     EECON1bits.RD = 1;
  29.     Nop();
  30.     return EEDATA;
  31. }
A hozzászólás módosítva: Nov 21, 2018
(#) pipi válasza DRoland hozzászólására (») Nov 21, 2018 /
 
Mert ezt kihagytad: while(EECON1bits.WR); ehelyett várakozol időtlen ideig
pic adatlap: At the completion of the write cycle, the WR bit is
cleared in hardware and the EEPROM Interrupt Flag
bit, EEIF, is set. The user may either enable this
interrupt, or poll this bit. EEIF must be cleared by
software.
érdekes hogy a mintapéldában sincs benne csak szövegesen felette...
A hozzászólás módosítva: Nov 21, 2018
(#) pipi válasza Hp41C hozzászólására (») Nov 21, 2018 /
 
Hali!
Szerintem se, de valami bajom biztos volt vele, ha beleraktam rég volt
(#) DRoland válasza pipi hozzászólására (») Nov 21, 2018 /
 
Köszi a tippet, működik várakozás nélkül! Látszik, hogy nem vagyok egy nagy programozó
  1. EP_WRITE
  2.         MOVWF   EEDATA
  3.         BCF     INTCON,GIE
  4.         BCF     EECON1,EEPGD
  5.         BCF     EECON1,CFGS
  6.         BSF     EECON1,WREN
  7.         MOVLW   55h
  8.         MOVWF   EECON2
  9.         MOVLW   0AAh
  10.         MOVWF   EECON2
  11.         BSF     EECON1,WR
  12.         BCF     EECON1,WREN
  13. BACK
  14.         CLRWDT
  15.         BTFSC   EECON1,WR
  16.         BRA     BACK
  17.         RETURN
(#) cross51 hozzászólása Dec 8, 2018 /
 
Nem akarok semmit mondani.
  1. #ifndef int8_t
  2. typedef __int8_t        int8_t;
  3. #define int8_t          __int8_t
  4. #endif
  5. #ifndef uint8_t
  6. typedef __int8_t        uint8_t;
  7. #define uint8_t         __uint8_t
  8. #endif

XC32 v1.44 "xc32installdir\pic32mx\include\lega-c\machine\types.h"
(#) cross51 válasza cross51 hozzászólására (») Dec 8, 2018 /
 
Ugyanez "pic32mx\include\Cpp\c\stdint.h" alatt is.
(#) cross51 válasza cross51 hozzászólására (») Dec 8, 2018 /
 

még egy helyen hiba volt
ezen a 3 helyen találtam hibát
"C:\Program Files (x86)\Microchip\xc32\v1.44\pic32mx\include\lega-c\machine\types.h"
"C:\Program Files (x86)\Microchip\xc32\v1.44\pic32mx\include\Cpp\c\stdint.h"
"C:\Program Files (x86)\Microchip\xc32\v1.44\pic32mx\include\Cpp\c\machine\types.h"
(#) cross51 hozzászólása Feb 17, 2019 /
 
Sziasztok!

Szerintetek bennem van a hiba?

PIC320256GPM064-et próbálok sleep módban hajtani
(OSCCONbits.SLPEN=1, PWRCONbits.VREGS = 0) doksi-ban a DC61-es paraméternél +25 °C max 30µA-t írnak én az OSC1-es external-os dolgot leszámítva mindent ugyanúgy csináltam de nálam 560µA mutat a multi és mindez ha nem LPRC-ről megy hanem FRC 8MHz akkor nagyobb mint 1 mA miközben a sleep mode-os reference-ben
Idézet:

The oscillator behavior in Sleep mode is as follows:
• If the CPU clock source is POSC, the oscillator is turned OFF in Sleep mode
• If the CPU clock source is FRC, the oscillator is turned OFF in Sleep mode
• If the CPU clock source is SOSC, the oscillator will be turned OFF if the SOSCEN bit is not
set”


Értem én hogy a megadott 30µA csak design kalkuláció, de azért a design és a valóság között csak nem 20 szoros torzítás van.


Lehet inkább egy EFM32 választok ha már úgy is energy micro néven fut...
A hozzászólás módosítva: Feb 17, 2019
(#) sdrlab válasza cross51 hozzászólására (») Feb 17, 2019 /
 
A legegyszerűbb tipikus hibák egyike ilyen jellegű: nincs valahol egy felhúzó ellenállás egy kimeneten, mely alacsony szinten van? )
(#) cross51 válasza sdrlab hozzászólására (») Feb 17, 2019 /
 
Bakker...
Egy Curiosity-t használok épp nem is értem miért nem jutott eszembe hogy van rajta egy csomó felhúzás és azokat szépen a PIC-el drainelem...

Így megszűnt az oscillator-al kapcsolatos hiba most FRC 8MHz-en ugyanannyit mérek mint LPRC-vel.

Viszont ez az ugyanannyi még mindig 100µA.

Érdekesség ha nem nyúlok a TRIS-ekhez és minden bemenet akkor ~260µA-es áramot mérek (lassan áll be az érték) ha a kimenetekre állíthatóak kimenet és '0'-ra vannak állítva akkor 98-100µA-t mérek.
(Bár ez várható emlékeim szerint a digitális cuccok nem szeretnek "lebegni")

Szerinted/Szerintetek mit lehetne még tenni?
Vagy elégedjek meg ezzel mint közép út?
(#) Kovidivi válasza cross51 hozzászólására (») Feb 17, 2019 /
 
Ha az adatlap 35uA-t közöl, akkor annyit tud is a uC. Neked kell felderíteni, hogy merre folyik még áram. Hogy elég-e a 100uA, azt csak te tudhatod.
(#) killbill válasza Kovidivi hozzászólására (») Feb 17, 2019 /
 
Idézet:
„Ha az adatlap 35uA-t közöl, akkor annyit tud is a uC.”
Ha az errata nem mond ettől eltérőt, akkor lehet, hogy tényleg 35uA, de mikrocsip esetén ebben sem kell biztosnak lenni, sajnos.
(#) pipi válasza cross51 hozzászólására (») Feb 17, 2019 /
 
Hali!
A stab kocka áramát is beleméred?
Meg van a panelon még más aktív cucc is...
Következő: »»   1299 / 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