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   174 / 1211
(#) doup válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Valami hasonló példaprogi nincs véletlen mert még timert sem használtam soha ez így nagyon nehéz lesz.
(#) vicsys válasza doup hozzászólására (») Nov 13, 2011 /
 
Mert hiányoznak az alapok és kapkodsz. :yes:
(#) doup válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Ha valaki ezt meg tudja csinálni szerintem ez egy hatalmas lépés mert akkor már elég összetett feladatokat is meg lehetne oldani.
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
Már megint miért kapkodok?
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
Mert van egy progim amit tovább szeretnék fejleszteni! Amit még nem csinált az ember és szeretne vele megismerkedni azt kapkodásnak hívod?
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
És akkor mond már meg hogy azokat a híres alapokat hol lehet megtanulni?
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
A hiba az ön készülékében van... A programod az MpLab szimulátor szerint azt csinálja, amit terveztél...
(#) vicsys válasza doup hozzászólására (») Nov 13, 2011 /
 
Nem most kapkodsz, hanem általánosan. Nem bántásként mondom, hanem azért mert nincs alapozásod, de te már a tetőn lévő réz szélkakast építed. Igenis az alapoktól kell kezdened, nem kitapasztalni a dolgokat. Miért kell a ledvillogtatással kezdeni? Azért, hogy meg tudd csinálni megszakítással, minden késleltetés nélkül és ezáltal megértsd a timerek (és a többi periféria) működését, konfigurálását. Igyekszem segíteni, de ez így egyet előre, kettőt hátra.
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
Ez így rendben is van. Fogalmam sem volt a timerek fontosságával mert eddig mindig csak késleltetéseket használtam és a legtöbb példaprogramban a led blinking delay-el van megoldva és ezért én is ezzel csináltam mint kezdő ha ők úgy csinálták akkor biztos az a jó.
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
De nagyon szivesen megtanulom ezeket a dolgokat csak mondjatok valami értelmes magyar nyelvű leírást ami minroc-ben szemlélteti a példákat mert assambly-hez egy mukkot sem értek.
(#) doup válasza vicsys hozzászólására (») Nov 13, 2011 /
 
Sajnos ilyen könyvet vagy e-bookot sehol nem találtam.
(#) Hp41C válasza doup hozzászólására (») Nov 13, 2011 /
 
Szia!
- A programodat írd át úgy, hogy az idő kijelzés megszakításosan 1 másodpercenként történjen. Segítség: a timer2 felprogramozható periódusos megszakításkérésre, de sokkal gyorsabb (sajnos), mint az 1 megszaítás/másodperc. A programbe felvéve egy belső változót, adott számú timer2 megszakítás kérés után kell csak a kijelzőt frissíteni.
- Minden percben adott másodperc után írja ki a hőmérsékletet 10 másodpercre.
- stb.

Egy 20MHz -es 16F628A a propeller órában számolja az időt, vezérli a kijelzést, méri egy fordulat idejét, dekódolja az infra parancsokat, és mozgatja a kijelzőn a szöveget, menti a beállításokat egy I2C RTC -be... A Wand órában egy 20MHz -es 16F886 ezen kívül méri a hőmérsékletet, a páratartalmat, a tekercs áramát, vezérli a LED -ek fényerejét és soros vonalon kapcsolatot tart a PC -vel.
(#) doup válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Úgy gondolom erre gondolsz
  1. unsigned short cnt;
  2.  
  3. void interrupt() {
  4.   if (TMR2IF_bit) {
  5.     cnt++;                    // increment counter
  6.     TMR2IF_bit = 0;           // clear TMR2IF
  7.     TMR2 = 0;
  8.   }
  9. }
  10.  
  11. // main
  12. void main() {
  13.   cnt = 0;                    // initialize cnt
  14.   ANSEL  = 0;                 // Configure AN pins as digital
  15.   ANSELH = 0;
  16.   C1ON_bit = 0;               // Disable comparators
  17.   C2ON_bit = 0;
  18.   PORTB = 0xFF;               // Initialize PORTB
  19.   TRISB =   0;                // PORTB is output
  20.   T2CON = 0xFF;               // Timer2 settings
  21.   TMR2  =   0;                // Initialize Timer2 register
  22.   TMR2IE_bit = 1;             // enable interupt
  23.   INTCON = 0xC0;              // Set GIE, PEIE
  24.  
  25.   while (1) {                 // endless loop
  26.     if (cnt >= 32) {
  27.       PORTB = ~PORTB;         // Toggle PORTB LEDs
  28.       cnt = 0;                // Reset cnt
  29.     }
  30.   }
  31. }

??
(#) Hp41C válasza doup hozzászólására (») Nov 13, 2011 /
 
Pedig, aki keres az talál...
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Örülök neki, hogy Nálad megy. Én beégettem, mértem szkópal, és láss csodát, nem megy. De mivel olyan dolgot írtatok ami számomra érthetetlen,
Idézet:

de a számábrázolást nem előjelesre (unsigned) kellene állítani...”

(vagy csak kezdem elérni a tegnapi idegállapotoma), úgydöntöttem előröl kezdem a PIC tanulást. Vissza az asm alapokhoz, szép nyugottan.
Ja még egy kis adalék, hogy ugyanezt a progit beraktam 16f882-be és ott szépen ment, úgy ahogy Nálad a szimulátorban.
(#) doup válasza doup hozzászólására (») Nov 13, 2011 /
 
Ami még emgem érdekelne hogy a cnt változó ha 32 mivel növeljük honnan tudom hogy mennyi idő alatt éri el a 32-es értéket a cnt változó, így hogy lehet pontos időzéteseket csinálni? Mondjuk nekem egy 1 másodpercenkénti kiolvasásra van szükségem?
(#) icserny válasza doup hozzászólására (») Nov 13, 2011 /
 
Idézet:
„azokat a híres alapokat hol lehet megtanulni?”
Egy részét a honlapomon, például a PICCOLO projektben. Az Időzítők/Számlálók c. fejezetben sok mindent leírtam a Timerek kezelésével kapcsolatban, s a ledswitch_tmr0.c programban arra is látsz példát, hogy hogyan lehet a Timer0 megszakításokat felhasználni a nyomógomb bemenet pergésmentesített kezelésére (mintavételezéssel) és a LED villogtatásához szükséges késleltetések előállítására. A véges állapogépek használatából is kapsz egy kis ízelítőt, s ezzel megvan az eszköztár egy egyszerű többfeladatos alkalmazás összeállításhoz. A példaprogramban a konkurens folyamatok a nyomógomb figyelése és az ennek megfelelő állapotváltás, valamint a LED villogtatása (ha a BLINK állapotban vagyunk).
(#) Hp41C válasza doup hozzászólására (») Nov 13, 2011 /
 
- A TMR2 -be nem kell 0-t írni, maga a timer törli. A programból való törlése elrontja az időzítést!
- A TMR2 megszakítások mindig egyenlő időközönként keletkeznek. A megszakítási rutin számolja a kiszolgálások számát, ha eltelt a megfelelő számú, egy jelzőbittel jelezzen, a számlálót törölje.
- Ha a jelzőbit 1, akkor frissítjük a PORTB -t vagy az időt az LCD -n és töröljük a jelzőbitet.

A változás a PORTB -n vagy az LCD -n pár utasítás végrehajtási idővel késik, sőt nem egyforma még a késések ideje sem, de ez a késés nem halmozódik. Egy 1 másodperces frissítésnél néhány (10 .. 100) us késés nem okoz problémát - főleg, ha ember olvassa le...
Ha a programozott késleltetéssel csinálod az idő méréset, a beállításhoz szükséges utasítások végrehajtásának idejével késik az idő számítása, több állítás ideje halmozódik...
(#) Poostmaster hozzászólása Nov 13, 2011 /
 
Sziasztok.
Remélem nem lövök nagyon mellé, ha itt kérdezem.
Terveztem egy áramkört 877A-val, és szeretném tudni, hogy ez így fog-e működni, vagy hol kell módosítani rajta?
(#) röntgen válasza Poostmaster hozzászólására (») Nov 13, 2011 /
 
Rajz v. program?

......így más. Úgy látom nincs gond vele.
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
Szia!

Mikor aktívak a vezérlőjelek? Most akkor indul, ha a bemenet 0. Nem az történik, hogy az indító bemenet 0, ezért elindul, felmegy 160-ig, megnézi, hogy a leállító bemeneten milyen szint van, az is 0, elindul lefelé, elér 0 -ig és mivel az indító bemenet még mindig 0, így megy egy újabb kört... Van felhúzó elleállás a PORTA 0 bitjén, illetve a PORTB 0. bitjén - avagy ezen a belső felhúzó ellenállást bekapcsoltad.
Szerintem a 16F882 -es verziónál megvan a felhúzás...
(#) kokozo válasza Poostmaster hozzászólására (») Nov 13, 2011 /
 
Lehet hogy nincs igazam de a 8 led 1 lábra nem fogja nagyon melegíteni a picet, ha mind a 8 világít?
(#) Hp41C válasza röntgen hozzászólására (») Nov 13, 2011 /
 
Még 100nF a pic másik pár táp föld lába közé, és a nagy LED áramok miatt 100µF elektrolit is kell a táp csatlakozóhoz. A panel tervezésénél ügyelni a következőkre:
- A pic belső táp és föld összekötésén ne menjen át áram, a pic alatt vezetékkel összekötni.
- A led -ek földáramát külön vezetékkel a táp csatlakozóra kell vezetni.

Sokszor segít a programok beüzemelésénél, ha belső változók értékét, a program állapotát hozzáférhetővé tesszük. A 16F877A debiggolható, de mégis egyszerűbb a következő megoldás. Az uart segítségével a programból a PC -re lehet juttatni állapot információkat (későbbiekben parancsokat lehet fogadni a PC -től). Prototípus esetén érdemes az uart kivezetéseit e célra fenntartani, amig szükséges / lehetséges...
(#) Poostmaster válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Ezt most nekem szántad?
Ha igen, akkor a kérdés: 2 db 100 nanós kerámiát tegyek be?
(#) Poostmaster válasza kokozo hozzászólására (») Nov 13, 2011 /
 
Max. 2 fog egy időben világítani egy lábról.
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Szia.
Igazad volt, és elnézést a sok értetlen kérdésért. A program tökéletesen működik, mint ahogy montad " A hiba az Én gépemben van", vagyis PIC-ben. A PIC volt a ludas, egyszóval kuka. Elővettem egy másik 628-at, és minden mint a karikacsapás.És ezen görcsöltem két napig, a nagy semmiért.
Az érdekes, hogy még a Pickit2 sem szólt, hogy rossz a PIC. A rossz PIC-be raktam egy olyan progit ami a PortB 0-t egybe állítja, az eredményt lemértem műszerrel: 2,34 voltot mértem.
A felhúzó ellenállásokat direkt kapcsoltam be.
Azért sajnálom a szétvert bill.-t

Viszont egy problémám még lenne. Mégpedig, amikor elindítom a progit az első TMR0 túlcsordulás túl későn érkezik, és ez igy nem jó. Hogy tudnám megcsinálni, hogy pontossan ugyan akkor legyen az első túlcsordulás mint a második?
(#) Hp41C válasza Poostmaster hozzászólására (») Nov 13, 2011 /
 
Igen, Neked írtam. Minden táp föld lábpároshoz külön 100nF jár! Ha 18 pár lesz egy nagyobb pic -en, akkor 18 darab kell. Nem véletlenül vezetik ki....
(#) Hp41C válasza szitko hozzászólására (») Nov 13, 2011 /
 
Nem egészen értem, hogyan tud később érkezni. Korábban át tud fordulni, mivel a timer mindig jár, akkor is ha a programod vár az indító jelekre. A fel/lefele menet indításakor töröld a TMR0 -t.
Még egy észrevétel: Ha a vonat rendetlenkedik - azaz egy lefelé indítás után lefelé indítás jel érkezik, a programod teljes gázra (246) ról fog visszafelé számolni, és 5 teljes lassulási ciklus után fog megállni. Hasonlóan, ha indítás után ismét indítás következik, 5 ciklus játszódik le.
(#) doup válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Így gondoltad?
  1. unsigned int cnt;
  2.  
  3. void interrupt() {
  4.   if (TMR0IF_bit) {
  5.      cnt++;                   // Increment value of cnt on every interrupt
  6.      TMR0   = 96;
  7.      INTCON = 0x20;           // Set T0IE, clear T0IF
  8.   }
  9. }
  10.  
  11. void main(){
  12.      I2C1_Init(100000);
  13.      PORTB = 0;
  14.      TRISB = 0;
  15.      TRISC = 0xFF;
  16.      Lcd_Init();
  17.      Lcd_Cmd(_LCD_CURSOR_OFF);
  18.      Lcd_Cmd(_Lcd_CLEAR);
  19.      write_ds1307(0,0x80); //Reset second to 0 sec. and stop Oscillator
  20.      write_ds1307(1,0x34); //write min 27
  21.      write_ds1307(2,0x10); //write hour 14
  22.      write_ds1307(3,0x02); //write day of week 2:Monday
  23.      write_ds1307(4,0x12); // write date 17
  24.      write_ds1307(5,0x11); // write month 6 June
  25.      write_ds1307(6,0x11); // write year 8 --> 2008
  26.      write_ds1307(7,0x10); //SQWE output at 1 Hz
  27.      write_ds1307(0,0x00); //Reset second to 0 sec. and start Oscillator
  28.      OPTION_REG = 0x84;       // Assign prescaler to TMR0
  29.      TMR0  = 96;              // Timer0 initial value
  30.      INTCON = 0xA0;           // Enable TMRO interrupt
  31.      cnt = 0;
  32.      do
  33.      {
  34.              if(cnt == 150)
  35.              {
  36.                    sec=read_ds1307(0); // másodperc kiolvasása
  37.                    minute=read_ds1307(1); // perc kiolvasása
  38.                    hour=read_ds1307(2); // óra kiolvasása
  39.                    day=read_ds1307(3); // nap kiolvasása
  40.                    date=read_ds1307(4); // dátum kiolvasása
  41.                    month=read_ds1307(5); // hónap kiolvasása
  42.                    year=read_ds1307(6); // év kiolvasása
  43.  
  44.                    time[0] = BCD2UpperCh(hour);
  45.                    time[1] = BCD2LowerCh(hour);
  46.                    time[2] = ':';
  47.                    time[3] = BCD2UpperCh(minute);
  48.                    time[4] = BCD2LowerCh(minute);
  49.                    time[5] = ':';
  50.                    time[6] = BCD2UpperCh(sec);
  51.                    time[7] = BCD2LowerCh(sec);
  52.                    time[8] = '\0';
  53.  
  54.                    ddate[0] = '2';
  55.                    ddate[1] = '0';
  56.                    ddate[2] = BCD2UpperCh(year);
  57.                    ddate[3] = BCD2LowerCh(year);
  58.                    ddate[4] ='.';
  59.                    ddate[5] = BCD2UpperCh(month);
  60.                    ddate[6] = BCD2LowerCh(month);
  61.                    ddate[7] ='.';
  62.                    ddate[8] = BCD2UpperCh(date);
  63.                    ddate[9] = BCD2LowerCh(date);
  64.                    ddate[10] = '\0';
  65.                    Lcd_Out(1,5,time);
  66.                    Lcd_Out(2,4,ddate);
  67.                    cnt = 0;
  68.               }
  69.               //~
  70.        }while(1);
  71. }
(#) szitko válasza Hp41C hozzászólására (») Nov 13, 2011 /
 
Megint rosszul fogalmaztam, bocsánat.
Idézet:
„Nem egészen értem, hogyan tud később érkezni”

Amikor elindul a program, (mértem szkóppal) a legelső TMR0 túlcsordulas, nem arányos a másodikkal, de a második- harmadik stb.. már mind egyforma. Azt tudom ,hogy a timer mindig jár.
A hardver: 7db nyomógomb és 7 db reedcső. A program úgy fog működni, hogy ha megnyomják az első gombot, elindul a vonat, a PIC figyeli a reedcső adta jelet, ha megérkezik, a vonat megáll és figyeli a második gombot, és így tovább.
Következő: »»   174 / 1211
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