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   1104 / 1140
(#) Tasznka válasza szucsistvan123 hozzászólására (») Dec 26, 2019 /
 
Nekem ez így egy picit furi,hogy mit is szeretnél pontosan . Most ahogy látom,akkor floatot alakítod át string egésszé. ezt kellene visszatolni az eredetibe,de fordítva?.
(#) szucsistvan123 válasza Tasznka hozzászólására (») Dec 26, 2019 /
 
Heló!

Float stringbe (ASCII kóddá az egyes számjegyeket), és a tizedesjegy átalakítása előtt az egész részek sorrendjének megfordítása.
(az egyesek kerülnkek a tömb 0. helyére, tizesek a 1. és így tovább, és a magasabb helyiértékek után jönnének a tizedes részek. Ezért szeretném megfordítani a sorrendet, hogy a legmagasabb helyiérték legyen a 0. tömbelemben, a legkissebb pedig a legutolsóban.)
A hozzászólás módosítva: Dec 26, 2019
(#) szSzilard válasza icserny hozzászólására (») Dec 26, 2019 /
 
Köszönöm!
Ez az!
(#) Tasznka válasza szucsistvan123 hozzászólására (») Dec 27, 2019 / 1
 
Talán ez jó lesz:
  1. str_pointer = str_pointer-tomb_meret;//<----
  2.     for(index = 0; index < (char)(tomb_meret / 2); index ++){ //egesz karakterek csereje
  3.         temp = *(str_pointer + index);
  4.         *(str_pointer + index) = *(str_pointer + tomb_meret - index -1);
  5.         *(str_pointer + tomb_meret - index -1) = temp;
  6.     };//END for
  7.    
  8.     *(str_pointer + tomb_meret) = '\0';//<-----
(#) szucsistvan123 válasza Tasznka hozzászólására (») Dec 27, 2019 /
 
Sikerült!
Az volt a gond amit írtál, hogy vissza kell állítani a pointert a legelejére.
Mostmár minden ok!
Köszi a válaszokat!
(#) szucsistvan123 hozzászólása Dec 29, 2019 /
 
Üdv!

PIC24-ben a belső komparátort lehet használni hiszterézises komparátorként? (megfelelő ellenállásokkal kiegészítve)

Köszi!
(#) icserny válasza szucsistvan123 hozzászólására (») Dec 29, 2019 / 1
 
Meg lehet próbálni. lásd: PIC MCU Comparator Tips 'n Tricks (nem PIC24, de azért, remélem, használható).
(#) szucsistvan123 válasza icserny hozzászólására (») Dec 29, 2019 /
 
Köszönöm!
(#) Golfer hozzászólása Dec 31, 2019 /
 
Hallo!
Ismeri itt valaki a Mach 110-s ic-t?
Esetleges tapasztalatok????

Boldog um évet!!!
(#) Bakman válasza Golfer hozzászólására (») Dec 31, 2019 / 1
 
Nem simerem, csak érdeklődöm. Mit szeretnél egy ilyen régi, forgalomból kivont CPLD-vel?
(#) szucsistvan123 válasza icserny hozzászólására (») Jan 1, 2020 /
 
Sikerült, működik!
BUÉK!
(#) Golfer válasza Bakman hozzászólására (») Jan 3, 2020 /
 
Halló Bakman!

Elöszoris B.U.É.K!
Nos nekem Van egy riasztòm Amiben EZ Van beépitve. Ezt szeretném beüzemelni....
(#) icserny válasza Golfer hozzászólására (») Jan 3, 2020 /
 
Elég reménytelen vállalkozásnak tűnik, én inkább kukáznám. Nem tudom, hogy segít-e rajtad, de itt találtam valami leírást: Programming Tools User Guide - Lattice Semiconductor.
(#) aroxol hozzászólása Jan 13, 2020 /
 
Sziasztok!

Segítségetekre lenne szükségem.
Ha a file regiszterben van 3, két helyiérdekű szám hogy kell összeadni?
Csatolok egy képet.
Pl. az első 3 sort kellene összeadnom, úgy ahogy 040 sorban szerepel.
PIC18F26K22 a kontroller.

pic.jpg
    
(#) pipi válasza aroxol hozzászólására (») Jan 13, 2020 /
 
Hali!
A felső 4 bitet lemaszkolod, vagy kivonsz belőle 30H-t, összeadod (figyelve ha van "átcsordulás",
Az eredményekhez hozzáadod a 30H-t(vagy or 30H)
(#) szucsistvan123 hozzászólása Jan 14, 2020 /
 
Üdv!

Tudom úgy használni a Timer2/3 (32 bites mód) hogy nem csinálok megszakítást hozzá?
Addig eljutottam hogy beállítom a timer-t, és ha a TON bitet 1 be állítom nem indul el. A megszakítást nem engedélyeztem.

A mellékelt teszt kóddal nem akar elindulni a Timer, legalább is a TMR1/2 regiszterek üresek.
Debugoltam is, és végig 0 volt a regiszterek értéke.
Én toltam el valamit, vagy megszakítás nélkül nem működik?

Köszi!

  1. T2CON = 0x0000;
  2.     T3CON = 0x0000;
  3.     TMR2 = 0x0000;
  4.     TMR3 = 0x0000;
  5.    
  6.     T2CON = 0x0008;//be kel kapcsolni
  7.     PR2 = 10;
  8.     PR3 = 0;
  9.  
  10.         T2CONbits.TON = 1;
  11.         __delay_ms(3447);
  12.         T2CONbits.TON = 0;
  13.         buffer = TMR3;
  14.         buffer = buffer << 16;
  15.         buffer |= TMR2;
  16.                
  17.         szam = ((long double)buffer / 10000000);
  18.         num_to_char(szam, string, 3);
  19.         UART_Print(string);
  20.         UART_Print("\r\n");
  21.        
  22.         __delay_ms(1000);
(#) Tasznka válasza szucsistvan123 hozzászólására (») Jan 14, 2020 / 1
 
Szerintem megy az,csak eléggé hamar körbeforog .
(#) szucsistvan123 válasza Tasznka hozzászólására (») Jan 14, 2020 /
 
Köszi a választ.

Közben alakult, működni működik, de még mindíg van valami gáz!
  1. szam = ((long double)buffer / 10000);


A buffer nevű változó uint32_t típusú, a szam double. a programot leegyszerűsítve most csak a Timer 1 et használtam, 100us beállításnál. (1:1; PR1 = 1000; 20MHz kvarckristállyal)
A bufferben benne van, hogy összesen hány 100 us telt el egy esemény óta. (átlagosan 1sec -> 10000us) ha a változót leosztom 10 000 -el akkor meg kellene kapnom az időt sec-ben, de ehelyett 0.00valami -t kapok. A TMR1 elvileg nem csordul túl ennyi idő alatt. (Kikapcsolom a timert ha megtörtént az esemény.) Valami típus konverziós hiba lenne?
Esetleg van valami ötleted?
(#) szucsistvan123 válasza szucsistvan123 hozzászólására (») Jan 14, 2020 /
 
Az érthetőség kedvéért ide másolom a kód egy részét:
A gond ugyan az mint a fenti részben hogy a main 12. sorában a konverzió nem okés. (szerintem) Mert a jelenlegi kódrészlettel az UART-on kiküldött üzenet : 0.000000, holott 1.valami nek kellene lennie. (a komparátortol függ, átlagosan 1 sec van a két esemény között. (hiszterézis komparátor, a 2 komparálási szint elértekor megszakítást generál.))
A komparátor ami a timer 2/3-at kapcsolgatja:
  1. void __attribute__((interrupt (no_auto_psv))) _CompInterrupt(){ 
  2.    
  3.     if(CMSTATbits.C1OUT == 1 && (!done)){
  4.         T1CONbits.TON = 1;
  5.         UART_Print("Be\r\n");
  6.     }
  7.     else if(CMSTATbits.C1OUT == 0 && (!done)){
  8.         T1CONbits.TON = 0;
  9.         buffer = TMR3;
  10.         buffer = buffer << 16;
  11.         buffer |= TMR2;
  12.         TMR2 = 0x0000;
  13.         TMR3 = 0x0000;
  14.         done = 1;
  15.         UART_Print("Ki\r\n");
  16.     }
  17.     CM1CONbits.CEVT = 0;
  18.     IFS1bits.CMIF = 0;
  19. }


A timer:
  1. void T32_Initialize(){   
  2.    
  3.     T2CON = 0x0000;
  4.     T3CON = 0x0000;
  5.     TMR2 = 0x0000;
  6.     TMR3 = 0x0000;
  7.    
  8.     T2CON = 0x0008;//be kel kapcsolni
  9.     PR2 = 1000;//1;
  10.     PR3 = 0x0000;
  11.    
  12.     //IPC2bits.T3IP = 6;
  13.     //IFS0bits.T3IF = 0;
  14.     //IEC0bits.T3IE = 1;
  15.  
  16. };


A main:
  1. int main() {
  2. /**************************|Periferiak inicializalasa|*************************/   
  3.     Port_Initialize();
  4.     PPS_Setup();
  5.     UART_Initialize();
  6.     Comparator_Init();
  7.     T32_Initialize();
  8. /******************************************************************************/
  9.    
  10.     while(1){
  11.         while(!done);               
  12.         szam = (double)((long double)buffer / 10000);
  13.         num_to_char(szam, string, 6);
  14.         UART_Print(string);
  15.         UART_Print("\r\n");
  16.         done = 0;
  17.         //__delay_ms(1000);
  18.     }
  19.    
  20.     return 0;
  21. }//END main
A hozzászólás módosítva: Jan 14, 2020
(#) szucsistvan123 hozzászólása Jan 14, 2020 /
 
Itt véletlenül benmaradt a T1CONbits.TON az T2CONbits.TON akat lenni mind 2 helyen, átjavítva csak randomnak tűnő értékek jelennek meg, (amelyek 1 nél kissebbek).KÉP
Javítva:
  1. void __attribute__((interrupt (no_auto_psv))) _CompInterrupt(){ 
  2.    
  3.     if(CMSTATbits.C1OUT == 1 && (!done)){
  4.         T2CONbits.TON = 1;
  5.         UART_Print("Be\r\n");
  6.     }
  7.     else if(CMSTATbits.C1OUT == 0 && (!done)){
  8.         T2CONbits.TON = 0;
  9.         buffer = TMR3;
  10.         buffer = buffer << 16;
  11.         buffer |= TMR2;
  12.         TMR2 = 0x0000;
  13.         TMR3 = 0x0000;
  14.         done = 1;
  15.         UART_Print("Ki\r\n");
  16.     }
  17.     CM1CONbits.CEVT = 0;
  18.     IFS1bits.CMIF = 0;
  19. }
(#) benjami válasza szucsistvan123 hozzászólására (») Jan 14, 2020 / 1
 
Én nem tennék a timer interruptba UART_Print-et (legfeljebb ha pufferelve van és úgy biztosan nem tart millisec nagyságrendű ideig a lefutása). A másik, hogy te ugyan tudod hogy milyen mikrovezérlőt is használsz, de mások nem tudják. Miből gondolod, hogy így lehet értelmes választ adni?
(#) Tasznka válasza szucsistvan123 hozzászólására (») Jan 14, 2020 / 1
 
Talán sokkal osztasz .
Tegyél a megszakításokba változó(kat),és azt állítsd be,és a főprogramban írasd ki az uarton keresztül.

"benjami : Igen,nem jó dolog megszakításban sok mindent csinálni."
(#) szucsistvan123 válasza benjami hozzászólására (») Jan 15, 2020 /
 
Üdv!

PIC24FJ256GA702 a mikrovezérlő. Az UART_Print csak debugolás céljábol van ott hogy lássam ha van megszakítás. Az UART Bufferébe tölti az adatokat. (De ki fogom venni! )
@Tasznka
Hogy érted hogy sokkal osztok?
1 sec / 100 us = 10 000 -> 1 sec alatt 10 000 lesz a buffer értéke, ez osztva 10K-val az a másogpercket adja vissza. Vagy rosszul gondolom?
(#) Tasznka válasza szucsistvan123 hozzászólására (») Jan 15, 2020 / 1
 
A kis érték miatt gondolom. Osszál kevesebbel,és nézd meg,hogy mennyi jön.
De ha csak az kell,hogy mennyi idő alatt jött meg a megszakítás,akkor egyszerűbb lenne timer-megszakításban változó.
(#) benjami válasza szucsistvan123 hozzászólására (») Jan 15, 2020 / 1
 
Az UART buffere az adatlap szerint 4. Ha ez üres a küldés kezdetekor akkor éppen beleférnek ezek az üzenetek (remélhetően a lezáró nullát nem küldi ki a függvény). Amúgy az ilyen futási időket remekül le lehet mérni, ha a küldés előtt egy szabad lábat bebillentesz, a végén meg visszabillented (a lábra persze rá kell akasztani egy szkópot, vagy a pár dolláros logikai analizátort).
(#) szucsistvan123 válasza benjami hozzászólására (») Jan 15, 2020 /
 
Köszi a válaszokat!
Sikerült megoldani, a timer megszakításba raktam egy countert, azzal minden rendben megy!
(Így nem a TMR2/3 regiszterekből olvasom ki az értéket, hanem a counter minden megszakításkor egyel nő.) Igen a buffer az 4, +1 amit éppen kiküld, szóval ha úgy nézzük 5!
Szkóp az jelenleg nincs kéznél, szóval csak hirtelen így tudtam megoldani, de már nincs benne a kódban.
(#) benjami válasza szucsistvan123 hozzászólására (») Jan 15, 2020 / 1
 
Aliéktól kereken 5 dollárért már beszerezhető a kis 8 csatornás logikai analizátor. Minden mikrovezérlővel foglalkozónak ajánlom akinek még nincs. Ezekkel a kulcsszavakkal lehet rákeresni: "USB Logic Analyzer 8CH"
(#) aroxol válasza pipi hozzászólására (») Jan 15, 2020 /
 
Szia!
Köszönöm, megoldottam a segítségeddel.
(#) aroxol válasza aroxol hozzászólására (») Jan 15, 2020 /
 
Most még egy problémám lenne.
GPS koordinátákat kellene google formátumba átalakítani.

ddmm.mmmmm formátumról dd.mmmmmm-ra.

Tudom hogy 60-al el kell osztanom az első kettő kivételével, de pic-ben nem tudom hogy lehetne megoldani?
(#) asch válasza aroxol hozzászólására (») Jan 15, 2020 /
 
Osztást lehet úgy csinálni, hogy a reciprokával szorzol úgy, hogy a reciprokot fix pontos reprezentációban adod meg például úgy, hogy egy 32 bites szám felső 16 bitje az egészek, az alsó 16 bit pedig a törtek. Így végül fixpontos bináris törtben kapod meg az eredményt.

Miben programozod a PIC-et? ASM, vagy C? Mert C-ben tudtommal van osztás megvalósítva. A bináris szám decimálisra visszaalakításához is kelleni fog 10-zel osztás. Vagy meg lehet csinálni levonogatós módszerrel is, összesen max 5*10 levonogatós lépésben meg lesz a 6 tizedesjegy.

Tehát:

* A ponttól jobbra lévő részt binárissá alakítod (ASCII->bináris szám, hozzáadás, 10-zel szorozgatás jobbról balra)
* A ponttól balra lévő részt is binárissá alakítod (ugyanúgy)
* Előre kiszámolod, hogy melyiket mennyivel kell szorozni, hogy egy bináris fixpontos ábrázolásban a jobboldalinak megfelelő értéket kapd. (pl: 2^X/60 -> ahányadik bittől kezdődő fixpontosban akarod megkapni az értéket 60-nal osztva) Azzal beszorzod (32 bites szorzás bináris fixpontos ábrázolásban)
* Összeadod az egészeket és a törteket a bináris fixpont ábrázolásban
* Kerekítés miatt hozzáadsz felet (bináris fixpontos ábrázolásban fél ugye, ennek hatása az lesz, hogy a croppolás rendes kerekítésként fog működni)
* croppolod a bináris számot (shiftelés jobbra)
* bináris -> decimális konverzió: osztogatással, vagy levonogatással lehet megcsinálni

Nem lehet a konverziót másik gépre tolni, ahol van nagyobb pontosságú lebegőpontos számkezelés például?
Következő: »»   1104 / 1140
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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