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   1116 / 1123
(#) Szemmy válasza Hp41C hozzászólására (») Ápr 9, 2020 /
 
Még éppen elég volt a láb. Az a A portból hagytam ki RA4-et az SLC SDA is szabadok, jumper-el terveztem a nyákra. 10k-os ellenállásokat raktam rá. Van 1 Pickit2 Clonom az látja az 24LC-t
Jobb lenne programból, de ha meglehet csinálni külön a rutinokat, és belőle a hex-t azt rátudnám tölteni.
(#) Rolend89 válasza Peter65 hozzászólására (») Ápr 10, 2020 /
 
Szervusz!
Köszönöm a hozzászólásod, magyarázatod!
Részletesen leírtad, mi mitől függ. Valahol olvastam hasonló dolgokat, talán a PIC PID Library fórumban. Olyan mélységig biztosan nem kell mennem, az már szakdolgozat szint lenne szerintem.
Magamat inkább PLC és robotika iránt érdeklődő gépésznek tartom. Ebből vonatkoztatva az analóg elektronikából vannak sötét foltok, csak úgy mint jelenleg a C programnyelvből is.
Még egyszer köszönöm Mindenki a hozzászólást, segítséget!
Ha bajom van jövök és "hisztizek". De próbálkozásból és küzdésből tanul az ember.
(#) menyus hozzászólása Ápr 12, 2020 /
 
Sziasztok!

Megint elakadtam, szeretnék segítséget kérni. 10 éve nem programoztam, régebben írtam olyan rutint amikor egy regiszter értékét növeltem aztán összehasonlítást csináltam és a kiértékelés során az eredménytól függően volt egy elágazás. Ez a rutin 20x be kéne billentse a PORTA0 át és a végén bekapcsolja a PORTB1 en lévő LED et majd kikapcsolja és kezdődik előlről. Nos, most próbálgatom és nem megy sehogy sem. Mi lehet a gond? Egy 16f877 el próbálkozom, az van próbapanelen.

  1. BANK1
  2.  
  3.        MOVLW   B'00000000'
  4.        MOVWF   TRISA
  5.        MOVLW   B'00000000'
  6.        MOVWF   TRISB
  7.  
  8.         BANK0
  9.  
  10. R       
  11.         CLRF     REF1       ; REF1 regiszter törlése
  12.  
  13. R1      
  14.         CLRF     PORTB     ;PORTB törlése
  15.                                
  16.                                
  17.         CALL     DELAY22
  18.         BSF      PORTA,0
  19.         CALL     DELAY22
  20.         BCF      PORTA,0
  21.         INCF  REF1,F         ;REF1 regiszter értékének növelése 1 el
  22.  
  23.         MOVLW 0X14         ;Dec 20 beírása a W be
  24.         SUBWF REF1,W      ;REF1 kivonása a W értékéből
  25.         BTFSS STATUS,2   ;REF1 = W ?
  26.         GOTO  R1              ;Még nem, ugrunk vissza
  27.                        
  28.         BSF      PORTB,1     ;Igen, átugorjuk a GOTO R1  Et és PORTB1 "H"
  29.         CALL  DELAY22
  30.  
  31.                
  32.         GOTO  R1               
  33.  
  34.         END
A hozzászólás módosítva: Ápr 12, 2020
(#) menyus válasza menyus hozzászólására (») Ápr 12, 2020 /
 
32. sorban hiba van, az "GOTO R" nek kellene legyen mert így nem törli a REF1 regisztert. Javítottam de így sem megy.
(#) kissi válasza menyus hozzászólására (») Ápr 12, 2020 /
 
Szia!

A BANK macrók és a DELAY22 biztos jó ? Maga a működése, ill. nem túl rövid, hogy a felvillanást lásd ? Próbáld ki szimulátorral, nekem így próba nélkül jónak tűnt ez a részlet... !
(#) bbalazs_ válasza menyus hozzászólására (») Ápr 12, 2020 /
 
A bank1-et nem veszi cimkének, így a sor elején?
A fordító kiad egy .lst filet is, ott ellenőrizheted.
(#) nedudgi válasza menyus hozzászólására (») Ápr 13, 2020 /
 
Nézz utána a BANKSEL makrónak.
Neked a programírás közben nem kellene foglalkozni azzal, hogy melyik bankban van egy bizonyos változó/regiszter, azt megoldja a fordító (assembler és linker).
Hacsak nincs otthon egy marék PIC16F877, anyagilag jobban jársz, ha PIC16F887 kontrollert használsz.
(#) menyus válasza bbalazs_ hozzászólására (») Ápr 13, 2020 /
 
A fórum motor jelenítette meg így a tabulátor miatt szerintem, nálam nincs a sor elején. Meg akkor fordításkor hibát dobna az MPLAB.
(#) menyus válasza nedudgi hozzászólására (») Ápr 13, 2020 /
 
Rendben, utána nézek köszi. Nincs csak ez az egy F877 esem sajna, még 16F690, meg F628 és 648 van de azok ugye jóval kisebbek és nem csereszabatosak.
(#) menyus válasza kissi hozzászólására (») Ápr 13, 2020 /
 
Minden jó, mert egy futófény programmal ha tesztelem ugyan ezt a hardvert ugyan ezekkel a késleltető rutinokkal és bank váltás macrókkal akkor működik, láthatóak a port billentések. Az INI ben van még pár dolog amit átállítok csak azt nem tettem be a példakódba. Pl az ADCON1 nél minden láb digitális.. stb. Nem értem miért nem megy. Még arra gondolok hogy a REF1 regiszter lehet másik program lapra esne? (PAGESEL1 ?) De ahhoz nagyon rövidke ez a program hogy átessen a másik lapra, és fordításkor hibát is jelezne. A REF1 lett utoljára deklarálva a 7 lefoglalt regiszter közül, de ha elsőnek deklarálom akkor se jó. Összesen 7 változót deklaráltam, "org 0x0c" től. Szerintem jó mert a teszt futófénynél is így múködik.
(#) menyus válasza menyus hozzászólására (») Ápr 13, 2020 /
 
Helyesbítés:

cblock 0x0c
.
.
.
.
.
.
.


ENDC

;----------------

org 0x00
org 0x04 ; int

korán van még...
(#) menyus válasza nedudgi hozzászólására (») Ápr 13, 2020 /
 
Utána olvastam az általad említett BANKSEL makrónak. Ha jól értelmezem, akkor a banksel használatakor a bankváltásokra ugyanúgy ügyelnem kell, csak éppen arra nem kell odafigyelnem hogy a bankváltás melyik bankból melyik bankba történik mert ezt végzi el helyettem. Ez is nagy segítség mert így nem kell az adatlapot böngészni hogy melyik regiszter melyik bankban van, vagy éppen mindegy és nem is kell bankot váltanom mert bármelyik bankból elérhető (pl STATUS reg) ..stb. Jól értem?
(#) nedudgi válasza menyus hozzászólására (») Ápr 13, 2020 /
 
Igen.
(#) ktamas66 válasza menyus hozzászólására (») Ápr 13, 2020 / 1
 
0x0C-nél még a PIC regiszterei vannak, a szabad helyek 0x20-tól kezdődnek.
(#) Hp41C válasza menyus hozzászólására (») Ápr 13, 2020 / 1
 
Ez a memória foglalás csak a 16C83, 16C84, 16F84, 16F84A esetén működik.
(#) oregharcos hozzászólása Ápr 13, 2020 /
 
Sziasztok! Mivel C-nyelvvel eddig még nem foglalkoztam, most több időm van, a YouTube-on találtam jó oktatóvideókat. ITT Eddig 10-videó alapján készítettem programot, a Proteusban jól működnek. Most viszont a 11-filmnél nem boldogulok. Már több napja szenvedek vele, a C-compiiler kiakad, tehát nem csinál HEX-fájlt. Már tízszer átnéztem, hogy mi a baj, de nem találok különbséget a filmben levő kód és amit kiszedtem kód között. Minden ugyanaz mint a filmben, szofwer: microC PRO for PIC, ver.6.0.0. A PIC-ugyanaz és úgy konfiguráltam ahogy írva van Minden úgy csinálok mint Józsi /jedles/, nála működik, nálam sajnos nem.
  1. //Nyomógombbal vezérlés
  2.   //PIC18F877A
  3.   //10_3 ora alprogram
  4.   //balról jobbra
  5.   //jobbról balra
  6.   //oda vissza
  7.   //szerteszét
  8.  
  9.  
  10.  
  11. #define LED PORTD
  12. #define nyg PORTB.F0
  13.  
  14.  
  15. char i;
  16. char jatek=0;
  17. bit gomb;
  18.  
  19. void nygfigy()
  20. {
  21.   if(nyg!=1 && gomb !=1)
  22.   {
  23.   gomb=1;
  24.   jatek++;
  25.   }
  26.  
  27.   if(nyg!=0 && gomb !=0)
  28.   {
  29.   gomb=0;
  30.   }
  31.  }
  32. void Delay_nyg(int ido)
  33. {
  34.    int tmp;
  35.    for(tmp=0;tmp<ido;tmp++)
  36.    {
  37.    Delay_nyg(1);
  38.    nygfigy();
  39.    }
  40.  }
  41.  
  42. void BalrolJobbra()
  43. {
  44.      LED=1;
  45.      Delay_nyg(150);
  46.      for(i=0;i<7;i++)
  47.      {
  48.      LED=LED<<1;
  49.      Delay_nyg(150);
  50.      }
  51.  
  52. }
  53. void JobbrolBalra()
  54. {
  55.  
  56.      LED=128;
  57.      Delay_nyg(150);
  58.      for(i=0;i<7;i++)
  59.      {
  60.      LED=LED>>1;
  61.      Delay_nyg(150);
  62.      }
  63. }
  64.  
  65. void OdaVissza()
  66. {
  67.      LED = 1;
  68.     Delay_nyg(150);
  69.      for(i=0;i<7;i++)
  70.      {
  71.      LED = LED << i;
  72.      Delay_nyg(150);
  73.      }
  74.      for(i=0;i<6;i++)
  75.      {
  76.      LED = LED >> i;
  77.      Delay_nyg(150);
  78.      }
  79. }
  80.  
  81. void SzerteSzet()
  82. {
  83.      LED = 8;
  84.      Delay_nyg(150);
  85.      for(i=0;i<4;i++)
  86.      {
  87.      LED = LED >> 1;
  88.      Delay_nyg(150);
  89.      }
  90.      LED = 16;
  91.      Delay_nyg(150);
  92.      for(i=0;i<4;i++)
  93.      {
  94.      LED = LED << 1;
  95.      Delay_nyg(150);
  96.      }
  97. }
  98.  
  99.  
  100. void main()
  101. {
  102.    TRISD = 0b00000000;
  103.    TRISB = 0b11111111;
  104.    //ANSEL = 0;
  105.    //ANSELH = 0;
  106.  
  107.    while(1)
  108.    {
  109.    nygfigy(2120);
  110.    
  111.    switch (jatek)
  112.    {
  113.       case 0: BalrolJobbra(); break;
  114.       case 1: JobbrolBalra(); break;
  115.       case 2: OdaVissza()break;
  116.       case 3: SzerteSzet(); break;
  117.       default: jatek=0;
  118.  
  119.      }
  120.  
  121.    }
  122.  
  123. }


Legyetek szívesek ránézni!
Segítségeteket előre is köszönöm!
A hozzászólás módosítva: Ápr 13, 2020
(#) benjami válasza oregharcos hozzászólására (») Ápr 13, 2020 /
 
A 19. sorban paraméter nélküli függvényként van létrehozva az nygfigy(), te meg a 109. sorban paraméterrel szeretnéd meghívni.
(#) ktamas66 válasza oregharcos hozzászólására (») Ápr 13, 2020 /
 
A Delay_nyg önmagát hívja meg.
(#) menyus válasza Hp41C hozzászólására (») Ápr 14, 2020 /
 
Jogos, egy F84 re írt asm et írtam át és benne hagytam ezt az értéket. Köszi a megoldást mindkettőtöknek!
(#) menyus válasza proli007 hozzászólására (») Ápr 14, 2020 /
 
Szia!

Volna egy kérdésem, az lcd-4bit.asm példakódoban (az LCD kezeléshez küldted) az érdekelne hogy az alábbi rutinban a 8 és 9. sorban a "goto $+1 " sornál a +előtt álló karakter az mi?. Mintha rémlene hogy a decimális számértéknek megfelelő sorral ugrik előre(+) vagy hátra(-)? Tehát az adott sor azt jelenti "ugorj egy sorral előre, azaz a következő sorra", aztán még egyszer ugyan ez. Akkor miért nem helyettesíthető ez esetben két NOP al ez a két sor? Nekem nekem ez az oldal a "bibliám" de erről nem találok ott semmit, vagy rossz helyen keresem... Tehát kérdésem, hogyan kell alkalmazni ezt a címzés módot?

  1. ;----- DELAY rutin ----------------------------------
  2.  
  3. ;       A rutin késleltetése 10xN mikrosec, ahol az N a W regiszterben van.
  4.  
  5. DELAY10
  6.  
  7.          movwf  wtreg0     ; Ciklus számláló feltöltése (1usec de csak egyszer)
  8. DLY1     goto       $+1                 ; késleltetés 2usec (fosc/4 * 2ütem)
  9.          goto   $+1                 ; Megint 2usec       
  10.          nop                         ; 1usec
  11.          decfsz wtreg0,f   ; Ciklus számláló csökkentése (2usec)
  12.          goto   DLY1                ; Ugrás vissza, ha még nem telt le (2usec)
  13.          RETURN                   ; Kész (2usec de csak egyszer)
  14.  
  15. ;===================================================
A hozzászólás módosítva: Ápr 14, 2020
(#) Hp41C válasza menyus hozzászólására (») Ápr 14, 2020 / 1
 
A Microchip Assembler nyelven a $ annak az utasításnak a címe, amit épen fordítás alatt van (az aktuális PC). A goto $+1 (12 és 14 bites szóhosszúságú kontrollereken) a következő utasításra ugrik, de pontosan kétszer annyi ideig tart, mint a nop. 16 bites szóhosszúságú kontrollereken goto $+2 (két szó, 2 ciklus) vagy bra $+2 (1 szó, 2 ciklus) utasításokat lehet használni.

Ötlet: egy címkét tenni a return utasítás elé, azt call -lal hívni: 1 utasítás 4 ciklus.
A hozzászólás módosítva: Ápr 14, 2020
(#) proli007 válasza menyus hozzászólására (») Ápr 14, 2020 / 1
 
Anno ezt egy mintaprogramnak írtam, aminek nem csak az LCD vezérlése volt a cél, hanem más információk megértése is. Pld. a futásidő számítás, mert abban is vannak érdekességek, és néha fontos mi mennyi idő alatt fut le. Tehát nem a hatékonyság/rövidség volt az elsődleges. Tehát így kell rá tekinteni..
(#) menyus válasza Hp41C hozzászólására (») Ápr 14, 2020 /
 
Köszönöm a részletes magyarázatot.
(#) menyus válasza proli007 hozzászólására (») Ápr 14, 2020 /
 
Nem kritikának szántam a kérdésemet, ez a kód is számomra egy etalon. Mintha régebben olvastam volna hogy ez a kérdéses módszer "kerülendő vagy legalábbis nem elegáns"? Olyasmi mint a GOTO amit sokan kerülnek lehetőség szerint ha jól tudom. De lehet rosszul emlékszem. Mint korábban is említettem ez a kód számomra nagyon hasznos, mivel sok érdekes megoldás van benne ami nekem(!) új. Mint pl ez a dolog is amire rákérdeztem. A futásidő kiszámítása is érdekelne, mert pl van hogy meghatározott ideig várakozni kell az LCD esetében is a következő utasítás küldése előtt. A futásidő (azaz esetemben a várakozás rutin hossza, már ha futásidő alatt egyről beszélünk...) késleltetésének a számítása érdekelne, ami különböző órajel frekvenciák miatt nem állandó. Illetve kiszámolni nyilván ugyan úgy kell de más értékkel. Pl a Te kódod 4MHz es órajelre íródott, esetemben viszont 6MHz es kvarcot használok. Azaz az ídők rövidebbek lesznek ezért lehet változtatnom kell majd a rutinokon. Még nem foglalkoztam azóta az LCD felélesztésével, de majd kiderül a gyakorlatban számít e ez a 2 MHz különbség az órajel esetében és mennyit.Az LCD esetében ha jól tudom az egyes késleltetések minimumra vonatkoznak, azaz hosszabbak lehetnek csak rövidebbek nem. De mivel eleve 4 biten használom, lassabb lesz a működése mint 8 biten ami lehet számítani fog. Ha jól emlékszem egy utasításciklus 4 órajel periódus alatt zajlik le, ahogy ezt Hp41C is megerősítette. Van erre valami egyszerű/általános számítási képlet mondjuk NOP ciklusokkal múködő késleltetés rutin esetében? Mert gondolom nem csak a NOP ok futás ideje számít hanem a rutinban használt többi utasításé is. Hogyan számítható ki "egyszerűen(?)" egy ilyen késleltetés rutin valós késleltetési ideje, xMHz es órajelre vonatkoztatva?
A hozzászólás módosítva: Ápr 14, 2020
(#) kissi válasza menyus hozzászólására (») Ápr 14, 2020 /
 
Szia!

Bocs, hogy beleszólok, de szerintem használd a szimulátort...Beállítod az órajeled frekvenciáját és hajszálpontosan megmondja, mennyi az annyi !
Kiszámolni sokszor nyűgös, mert a program erre megy vagy arra megy, de ha leszimulálod, akkor a választott irányodnak megfelelően adja az időértéket!

Fontos dolgok: Watch, StopWatch, BreakPoint, Stimulus, ezeket nézd meg vele kapcsolatban!
(#) menyus válasza kissi hozzászólására (») Ápr 14, 2020 /
 
Köszönöm az ötletet, akkor ideje a szimulátorral összebarátkoznom mert soha az életben nem használtam még... Ehhez elég a Relase - t Debug ra állítani? vagy van erre valami ikon a menüsorban? Tudom, nézzem meg. És gondolom van valami tutorial video is erről a youtub on... Újabb házi feladat.
(#) kissi válasza menyus hozzászólására (») Ápr 14, 2020 / 1
 
Idézet:
„Ehhez elég a Relase - t Debug ra állítani?”
anélkül is megy az MPLAB SIM.

Milyen IDE-t használsz? Sima MPLAB ( nem X-es ?!)?! Akkor Debugger --> Select Tool --> MPLAB SIM.
Ezután látsz majd újabb ikonokat ( majd rájössz, melyik mire jó, ha nem olvasol !), Debugger menüpont alatt fontos elsőkörben a StopWatch és a Settings, View menüpont alatt a Watch!
Használd utána az F7, F8 billentyűket ( persze fordítás után!).
Rengeteg beállítása van, valóban olvasni, videókat nézni és kérdezni, próbálgatni !

Sok sikert, megéri az erőlködés !

szerk.: csatoltam két leírásomat egy kis segítségként !
A hozzászólás módosítva: Ápr 14, 2020
(#) proli007 válasza menyus hozzászólására (») Ápr 14, 2020 / 1
 
Ez így van, lehet használni a szimulátort, brake pontok lerakásával megadja az időket. persze a kavics frekit is kell közölni vele. Normális programban a fordítóval van kiszámítva az időzítés a freki alapján. (Mert az számolni is tud, majd konstansként deklarálja. De nem magától, hanem számodra, tőled.)
Az utasítás táblában ott van a végrehajtási ciklusszám. Könnyű elrontani (főleg ha számít), mert pld. egy elágazásnál nem mindegy melyik ág hajtódik végre. De kiszámolod, szimulátorban meg ellenőrzöd.
Igen, a minimális időket kell tartani, hosszabb lehet. Adatátvitel kezelésénél ott a busy jelzés, csak mindenki lusta vele foglalkozni..
(#) menyus válasza kissi hozzászólására (») Ápr 14, 2020 /
 
A régi "fapados" MPLAB Ver. 8.40000. Ez az X es eclipse kinézetű MPLAB nekem nem jön be.
(#) menyus válasza kissi hozzászólására (») Ápr 14, 2020 / 1
 
Hálás köszönetem a supportért Uram!
Következő: »»   1116 / 1123
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu