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   177 / 1210
(#) AZoli válasza icserny hozzászólására (») Nov 16, 2011 /
 
Köszönöm, igen minden áron meg akartam mondani. Így megy:
  1. unsigned int __attribute__ ((address(0x7FF000))) _EEDATA(2) Digit_illum_eeprom1 [8] = {0x0C, 0x30, 0x30, 0x0C, 0x0C, 0x0C, 0x8C, 0x16};
(#) Robotsyte hozzászólása Nov 16, 2011 /
 
Sziasztok
Engem az érdekelne, hogy a PIC-ekben van ez az alacsony fogyasztású SLEEP mód. Ebből felébreszteni MCLR-el lehet, vagy ha túlszalad a WDT. Ez a túlszaladás mennyi idő lehet? Illetve azt nem lehet, hogy ki kapcsolom a WDT-t és akkor csak MCLR-re éled fel?
Előre is köszönöm a válaszokat!
(#) Poostmaster válasza Robotsyte hozzászólására (») Nov 16, 2011 /
 
Az alacsony fogyasztású módból külső megszkítás zökkentheti ki a csipet. pl. egy gombnyomás, adat érkezése, vagy hasonló. Az adatlapban le van írva, hogy melyikben mi ébresztheti. Az mclr használata erre a célra botorság lenne, mert akkor minden kezdődik elölről. Akár ki is kapcsolhatnád.
(#) Robotsyte válasza Poostmaster hozzászólására (») Nov 16, 2011 /
 
Ez logikusnak tűnik, akkor utána nézek, melyik lábra kell kötni valamit, a wake-up -hoz.
Esetleg be tudnátok linkelni valamit, ami pontosan leírja, hogyan miket kell beírni a programba a SLEEP helyes használatához?
(#) szitko válasza Robotsyte hozzászólására (») Nov 16, 2011 /
 
(#) Hp41C válasza Poostmaster hozzászólására (») Nov 16, 2011 /
 
Van külön jelzőbit, hogy a reset bekapcsolási reset volt-e vagy sem...
(#) svandras0404 hozzászólása Nov 16, 2011 /
 
Köszönöm szépen mindenkinek a segítséget.
Minden tippet alaposan át fogok nézni.
A tanulni valóra nem ültem rá csak óra cserék miatt az októberi órák elmaradtak és ezt most novemberben az elmaradtal eggyütt ránk verték.
A másik hasonló műsor az lett, hogy Architektúrát ami korábban 3 félév volt most beszorították 1 félévre, de a követelmény nem csökkent.
A tanárnő már említette a társaságnak hogy komoly elszámolási gondok lesznek a vizsgán.
Mégegyszer köszönök mindent.
(#) doup hozzászólása Nov 16, 2011 /
 
Sziasztok ismerkedek az interruptok világával. A projectem lényege az lenne hogy egy led folyamatosan ég míg egy másik véletlenszerűen villog. A feladatom az az lenne hogy miközben villog a led egy gomb segítségével a másik folyamatosan világító ledet egy gomb segítségével ki be kapcsolgassam. Amit most csinál a program hogy egyszerre mind a két ledet ki be kapcsolja de nem tudom miért és mind a kettő csak világít egyfolytában.

  1. //--- Változók deklarációja
  2. int cnt = 0, delay = 0, gomb = 0;
  3. //~
  4.  
  5. //--- Megszakítások
  6. void interrupt()
  7. {
  8.      if (TMR1IF_bit)
  9.      {
  10.         cnt++;                    // increment counter
  11.         TMR1IF_bit = 0;           // clear TMR0IF
  12.         TMR1H = 0x80;
  13.         TMR1L = 0x00;
  14.      }
  15.        
  16.      if(INTCON.INTF)
  17.      {
  18.             if(GP2_bit == 0)
  19.             {
  20.                 gomb++;
  21.                 INTCON.INTF = 0;
  22.             }
  23.      }
  24. }
  25. //~
  26.  
  27. //--- Alapbeállítások
  28. void InitMain()
  29. {
  30.      OPTION_REG = 0x84;
  31.      CMCON  = 7;                 // Comparatorok kikapcsolása
  32.      TRISIO0_bit = 0;
  33.      TRISIO1_bit = 0;
  34.      TRISIO2_bit = 1;
  35.      T1CON = 1;                  // Timer1 bekapcsolása
  36.      TMR1IF_bit = 0;             // törlés TMR1IF
  37.      TMR1H = 0x80;               // Timer1 register inicializálása
  38.      TMR1L = 0x00;
  39.      TMR1IE_bit = 1;             // Timer1 interrupt engedélyezése
  40.      INTCON = 0xC0;              // Beállít GIE, PEIE
  41.      INTCON.GIE = 1;
  42.      INTCON.INTE = 1;
  43.      INTCON.INTF = 0;
  44.      INTCON.PEIE = 0;
  45.      OPTION_REG.INTEDG = 1;
  46.      GP1_bit = 1;                // Működés visszajelző led bekapcsolása
  47. }
  48. //~
  49.  
  50. //--- Main
  51. void main()
  52. {
  53.      InitMain();
  54.      do
  55.      {
  56.          if (cnt >= delay)
  57.          {
  58.               GP0_bit = ~GP0_bit;
  59.               cnt = 0;
  60.               delay = rand() % 10 + 1;
  61.          }
  62.          if(gomb % 2)
  63.          {
  64.               GP1_bit = 0; //Visszajelző kikapcsolása
  65.          }
  66.          else
  67.          {
  68.               GP1_bit = 1; //Visszajelző bekapcsolása
  69.          }
  70.      }
  71.      while(1);
  72. }
  73. //~
(#) Robotsyte válasza szitko hozzászólására (») Nov 16, 2011 /
 
Köszönöm itt megtaláltam amit kerestem!
(#) Hp41C válasza doup hozzászólására (») Nov 17, 2011 /
 
Szegény kontroller ... Csak dolgozik feleslegesen:
  1. INTCON = 0xC0;

Ez már beállítja a GIE és PEIE biteket - de az okok közül az RBIF biztosan nincs még törölve...
Eztán
  1. INTCON.GIE = 1;

Ez még egyszer beállítja a GIE -t.
  1. INTCON.PEIE = 0;

Ez még a nagy gonddal beállított a PEIE -t törli.
Ettől aztán nem jon a timer megszakítás.
Ez jól optimalizáló fordítóval egy andlw, de lehet osztás is
  1. if(gomb % 2)

Nem egyszerűbb a (gomb & 1), ami mindig egy andlw...

Amit ajánlanék:
A projectben állítsd be a MpLab Simulátort és próbáld a programodat abban futtatva megnézni mit is csinál...
(#) doup válasza Hp41C hozzászólására (») Nov 17, 2011 /
 
Köszönöm válaszodat átírtam amiket írtál már csak annyi a gondom vele hogy a timer-es rész csak akkor fut az első gombnyomás után ha nyomvatartom a gombot de mihelyt felengedem nem működik a random villogás

  1. //--- Változók deklarációja
  2. int cnt = 0, delay = 0, gomb = 0;
  3. //~
  4.  
  5. //--- Megszakítások
  6. void interrupt()
  7. {
  8.      if (TMR1IF_bit)
  9.      {
  10.         cnt++;                    // increment counter
  11.         TMR1IF_bit = 0;           // clear TMR0IF
  12.         TMR1H = 0x80;
  13.         TMR1L = 0x00;
  14.      }
  15.        
  16.      if(INTCON.INTF)
  17.      {
  18.             if(GP2_bit == 0)
  19.             {
  20.                 gomb++;
  21.                 INTCON.INTF = 0;
  22.             }
  23.      }
  24. }
  25. //~
  26.  
  27. //--- Alapbeállítások
  28. void InitMain()
  29. {
  30.      OPTION_REG = 0x84;
  31.      CMCON  = 7;                 // Comparatorok kikapcsolása
  32.      TRISIO0_bit = 0;
  33.      TRISIO1_bit = 0;
  34.      TRISIO2_bit = 1;
  35.      T1CON = 1;                  // Timer1 bekapcsolása
  36.      TMR1IF_bit = 0;             // törlés TMR1IF
  37.      TMR1H = 0x80;               // Timer1 register inicializálása
  38.      TMR1L = 0x00;
  39.      TMR1IE_bit = 1;             // Timer1 interrupt engedélyezése
  40.      INTCON = 0xC0;              // Beállít GIE, PEIE
  41.      INTCON.INTE = 1;
  42.      INTCON.INTF = 0;
  43.      OPTION_REG.INTEDG = 1;
  44.      GP1_bit = 1;                // Működés visszajelző led bekapcsolása
  45. }
  46. //~
  47.  
  48. //--- Main
  49. void main()
  50. {
  51.      InitMain();
  52.      do
  53.      {
  54.          if (cnt >= delay)
  55.          {
  56.               GP0_bit = ~GP0_bit;
  57.               cnt = 0;
  58.               delay = rand() % 10 + 1;
  59.          }
  60.          if(gomb&1)
  61.          {
  62.               GP1_bit = 0; //Visszajelző kikapcsolása
  63.          }
  64.          else
  65.          {
  66.               GP1_bit = 1; //Visszajelző bekapcsolása
  67.          }
  68.      }
  69.      while(1);
  70. }
  71. //~
(#) Harry hozzászólása Nov 18, 2011 /
 
Kedves fórumtársak. Egyszerű kérdésem lenne:

Timer1 tud külön működni a CCP1-től? Egyszerre lehet használni a kettőt külön?

Timer1-en szeretnék egy 32768-as kristályt számoltatni, CCP1-en pedig szeretném egy DCF77 óra megszakítását fogadni.
A Timer0-án már van egy 8MHz-s kvarc.
CCP2-t nem tudom HW megszakításként beállítani, mert ott a Timer1 órajelének a kivezetése van. (PIC16F887)
Előre is köszi
(#) Hp41C válasza Harry hozzászólására (») Nov 18, 2011 /
 
A Timer1 tud működni a CCP modulok nélkül, de a CCP modulok csak PWM üzemmódban tudnak működni a Timer1 nélkül.
(#) Harry válasza Hp41C hozzászólására (») Nov 18, 2011 /
 
köszi :s
(#) Firefighter1 hozzászólása Nov 18, 2011 1 /
 
Igaz másik topikban van, de kérlek aki ráér és ért a pichez az nézzen erre rá.
Pic programozás és nem igazán találok rá jó megoldást
Előre is köszönöm
(#) Poostmaster válasza Firefighter1 hozzászólására (») Nov 18, 2011 1 /
 
Ugye *

* Azt hiszem, ez nem épp a te dolgod lenne .
(#) LAC001 hozzászólása Nov 19, 2011 /
 
Sziasztok!
Egy 3,3 V-os tápfeszt igényelő PIC-et szeretnék működtetni két db AA-s elemről. Kérdésem az lenne, hogy milyen tápstabilizátort vagy boostert tennétek elé. Amiket nézegettem az mind SMD tokozásban van, így macerás lenne az itthoni forrasztása, valamilyen PDIP-es vagy TO-s tokozás kellene nekem. Meg ugye egy elem az 1,5V gondolom ez a valóságban 1,2 vagy 1,3, tehát 2,6 V állna rendelkezésre. Egy RGB ledet szeretnék meghajtani vele, meg egy zümmert. Annyit csinálna, hogy 30 sec-ig világítana pirosan, majd 10 sec zöld. Szóval nem lesz nagy fogyasztása.
Segítségeteket előre is köszi!
Üdv
LAC
(#) potyo válasza LAC001 hozzászólására (») Nov 19, 2011 /
 
Ha csak piros és zöld szín kell, akkor én bizony nem tennék semmi stabilizátort a kontroller elé, hanem hajtanám közvetlenül a két elemről. Fogsz egy valami LF típust, ami működik már 2V-ról is, neked nagy sebesség sem kell, így a tápfeszültség nem limitálja az órajelet. 2,5V táphoz már bőven lehet méretezni előtétellenállást piros és zöld ledhez is. Más lenne a helyzet, ha kék vagy fehér szín is kellene, mert azoknak kellene legalább 4V táp, hogy egy kis tartalék is maradjon.
(#) LAC001 válasza potyo hozzászólására (») Nov 19, 2011 /
 
Jó. Akkor nem bonyolítom túl a dolgot. Megy rá direktbe, aztán kész. Köszi a segítséget.
(#) bbalazs_ válasza LAC001 hozzászólására (») Nov 20, 2011 /
 
Azt meg szabad kerdezni, hogy ehhez minek rgb led?
Vannak sima ketszinu, baromi olcso piros/zold ledek...
(#) icserny válasza bbalazs_ hozzászólására (») Nov 20, 2011 /
 
Elég nyomós indok lehet pl. az, ha már megvan...
(#) matheattila hozzászólása Nov 20, 2011 /
 
Sziasztok, az lenne a problémám, hogy van egy PIC16F628A típusu mikrovezérlőm ami nem működik, azt hiszem, hogy véletlenül nagyobb feszültség került rá (12V). A program nem fut rajta, mert a lábain nem jön ki semmi jel, ha beteszem a PICKIT2-be akkor felismeri, a programot ki tudja olvasni belőle, ha ugyanazt a programot írom bele akkor beleírja, ha törlöm a memoriáját akkor azt írja, hogy sikeresen törölve, de ha utána kiolvasom akkor meg mindig benne van, ha meg más programot akarok bele programozni akkor hibát ad ki,
ezt: Programming failed at Program Memory address 0x000000.
Dobhatom el a PIC-et, vagy még van rá valami megoldás, hogy életre keltsem?
Köszönöm előre is!
(#) bbalazs_ válasza matheattila hozzászólására (») Nov 20, 2011 /
 
Probald meg LVP modban programozni.
Tul sok remeny nincs, ha az sem megy, akkor kuka.
Legkozelebb jobban vigyazol.
(#) Hp41C válasza matheattila hozzászólására (») Nov 20, 2011 /
 
Mekkora a programozás alatt a Vdd tápfeszültség? A 16F628A teljes törléséhez minimum 4.7V kell.
(#) matheattila válasza Hp41C hozzászólására (») Nov 20, 2011 /
 
Köszönöm a válaszokat, megpróbálom LVP-ben is, majd megmérem a Vdd-t is, mert nem tudom mekkora.
(#) glaci hozzászólása Nov 21, 2011 /
 
Most kezdtem el PIC-elni és egy működő programon keresztül próbálok értelmezni dolgokat, mit miért csinált a programozó és most elakadtam egy részletnél kérlek benneteket segítsetek!

A kérdésem az, hogy az alábbi utasítás mit takar?
movlw LOW SINE_TABLE_RAM

A SINE_TABLE_RAM egy előre definiált adatregiszter a memória 31h címén. A LOW viszont sehol nincs definiálva, de a LOW SINE_TABLE_RAM sem, így nem értem, hogy ez a konstans hogy áll elő.

Ha nagy butaságot kérdeztem, nézzétek el nekem, de szeretném megérteni.


COPY_TABLE_TO_RAM
BANKSEL SINE_TABLE_RAM
BANKISEL SINE_TABLE_RAM
movlw LOW SINE_TABLE_RAM
movwf FSR
movlw 0X13
movwf TEMP_LOC
clrf TEMP_LOC_1
COPY_AGAIN
movlw HIGHSINE_TABLE
movwf PCLATH
movf TEMP_LOC_1,W
call SINE_TABLE
movwf INDF
INCF TEMP_LOC_1,F
INCF FSR,F
DECFSZ TEMP_LOC,F
goto COPY_AGAIN

movlw LOWSINE_TABLE_RAM ;FSR POINTS TO THE STARTING OF THE TABLE
movwf FSR
RETURN
(#) Hp41C válasza glaci hozzászólására (») Nov 21, 2011 /
 
A low() egy beépített függvény az argumentumának alsó 8 bitjével leírható számot adja vissza. ld. még high() a bit 15..8 , és az upper() pedig a 23..16 bitekkel leírható számot adja vissza. MpLab Asm Help...
(#) icserny válasza glaci hozzászólására (») Nov 21, 2011 /
 
MPASM dokumentációjában nézd meg a "Low, High, Upper operands" cím alatt! Egy memóriacím 8-bites értékekre történő szeletelésére szolgálnak. A műveleteket a fordító fordítási időben végzi el.
(#) glaci válasza icserny hozzászólására (») Nov 21, 2011 /
 
Köszönöm mindkettőtöknek a gyors választ. Tudok továbblépni.
(#) pagaby hozzászólása Nov 21, 2011 /
 
Sziasztok!

Az MPLAB-ban ezt a hibaüzenetet kapom: Error [1300] stack frame too large
Itt vannak a hibakódok.
Mit jelent? Elfogyott a RAM?
Következő: »»   177 / 1210
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