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   764 / 1210
(#) ludus hozzászólása Márc 21, 2016 /
 
Sziasztok!
Nem pont ide való de segítséget kérnék: lenne itt valaki aki feltudna nekem programozni egy 18F4550-et szerdán Pesten? Van ebayes K150-es programozóm de nem tudja megírni sajna...
Köszönöm!
Laci
(#) Bakman válasza Zso839 hozzászólására (») Márc 21, 2016 /
 
Nem voltam egyértelmű. Úgy gondoltam (igaz, én nem szeretem a multiplexelést), hogy minden egyes kijelzőnek jut egy regiszter és egy UDN2981. Nem is 12 szegmensre, hanem 12 kijelzőre gondoltam, nekem soknak tűnik multiplex vezérléshez.

Az ULN tranzisztormező közös anódos kijelzőhöz jó (nyitott kollektoros), az UDN pedig közös katódos kijelzőhöz (nyitott emitteres). Tranzisztormező mindkettő, a belső felépítésüket hasonlítsd össze, látni fogod a különbséget. Egyszerűen leírva: A ULN a testre húz le, az UDN pedig tápfeszültséget ad ki.
(#) icserny válasza Zso839 hozzászólására (») Márc 21, 2016 /
 
Vannak erre kitalált IC-k, mint pl. a MAX7219. Gyakorlatilag ugyanúgy felfűzhető, és SPI-vel betölthető, mint a 74HC595, emellett beépített áramkorlátozással és programozható fényerősséggel vezérel, s egy IC max. 8 számjegy x 8 szegmens vezérlésre (7 szegmens + DP) alkalmas. Kívánságra a számjegyeket dekódolja is.
(#) zenetom válasza icserny hozzászólására (») Márc 21, 2016 /
 
A MAX7219 nagyon jó kis IC, de engem kicsit zavart, hogy semmiféle reset funkciót nem raktak bele. Szóval ha induláskor valami táp-gebasztól bekattan, akkor még az esély sincs rá, hogy újraindítsuk.
(#) icserny válasza zenetom hozzászólására (») Márc 22, 2016 /
 
Senki sem akadályoz meg abban, hogy a tápfeszültségét le-fel kapcsold egy FET-tel vagy egy engedélyező bemenettel rendelkező tápegységgel, power manager IC-vel.
(#) zenetom válasza icserny hozzászólására (») Márc 22, 2016 /
 
Igen, vannak külső reset áramkörök, csak én hiányoltam az IC-ből, ha már ennyi mindent tud. De félreértés ne essék, én is csak ajánlani tudom ezt az IC-t, akár LED mátrixot is jól lehet vele hajtani.
(#) Elektro.on válasza DJozso hozzászólására (») Márc 22, 2016 /
 
Szia!
Most épp nincs időm végig nézni a kódodat, amúgy sem vagyok C guru. De kb fél éve én is kísérleteztem ezzel az UH modullal. nekem 400cm ig simán mért bár nem túl pontosan.
Mikropascal környezetben csináltam, ha az neked segít itt a kód. Ne zavarjon meg, hogy 3db unitra osztottam az átláthatóság kedvéért.
Fő Unit :
  1. {*   Ultrahangos Távolság mérő
  2.       PIC 16f690    8 MHz belső oszcillátorral
  3.  *}
  4. program UH_Tav_mero;
  5.  
  6. uses MyUnit_meres  , MyUnit_LCD ;
  7.  
  8. { LCD Deklaráció }
  9. var LCD_RS : sbit at RC2_bit;
  10. var LCD_EN : sbit at RC3_bit;
  11. var LCD_D4 : sbit at RC4_bit;
  12. var LCD_D5 : sbit at RC5_bit;
  13. var LCD_D6 : sbit at RC6_bit;
  14. var LCD_D7 : sbit at RC7_bit;
  15.  
  16. var LCD_RS_Direction : sbit at TRISC2_bit;
  17. var LCD_EN_Direction : sbit at TRISC3_bit;
  18. var LCD_D4_Direction : sbit at TRISC4_bit;
  19. var LCD_D5_Direction : sbit at TRISC5_bit;
  20. var LCD_D6_Direction : sbit at TRISC6_bit;
  21. var LCD_D7_Direction : sbit at TRISC7_bit;
  22.  
  23. var tavolsag : dword;
  24. txt : array[4] of char;
  25. var  MertEgyseg , MerCyc : word;
  26.  
  27.  
  28. begin   { Main program }
  29.  
  30.   OSCCON.IRCF0 := 1 ;          // belső oszcillátor 8 MHz
  31.   ANSEL := 0;                  // analóg bemenet tiltása
  32.   ANSELH := 0 ;                // analóg bemenet tiltása
  33.   CM2CON1.T1GSS := 1;          // Porta.4 számláló vezérlő engedélyezése
  34.                                // H színtnél számol.
  35.   T1CON := 193 ;               // Timer 1 számláló beállítása osztó nélkül
  36.  
  37.   trisc := 0;
  38.  
  39.   LCD_init;                   // LCD inicializálása
  40.   CustomChar();               // egyéni karakterek tárolása (á é ) + első sor
  41.  
  42.  
  43.  
  44.   { Végtelen hurok}
  45.  
  46.     Repeat
  47.        // Mértékegység és mérés gyakoriság beállítása
  48.      If PortA.0 = 1 then  MertEgyseg := 50    else MertEgyseg := 5;
  49.      If PortA.1 = 1 then  MerCyc := 200    else MerCyc := 400;
  50.      
  51.    
  52.         // Számláló értékéből távolság számítása
  53.     tavolsag := (meres()* MertEgyseg) div 588;
  54.    
  55.    
  56.     // Számláló tulcsordulástól függően távolság vagy hiba kiírása.
  57.     If Pir1.TMR1IF = 0 then
  58.      begin
  59.        wordtostr(tavolsag, txt);
  60.         ValueToLCD(txt);
  61.      end
  62.      else ErrorToLcd();
  63.  
  64.      // Késleltetés a következő mérés előtt.
  65.     Vdelay_ms(MerCyc);
  66.  
  67.   until false;
  68.  
  69. end.


MyUnit_meres:
  1. {*    -- Mérő függvény --
  2.  
  3.       visszatérési érték a számláló 16 bites értéke, tulcsordulás esetén
  4.        a maximális 65535 érték jelzi a hibás mérést.
  5.        
  6.        *}
  7.  
  8.  
  9. unit MyUnit_meres;
  10.  
  11. function meres() : word;
  12.  
  13. implementation
  14.  
  15. function meres() : word;
  16.   begin
  17.     TMR1L := 0;             //..
  18.     TMR1H := 0;             // Timer1 számláló törlése
  19.     Pir1.TMR1IF := 0;       // Timer1 tulcsordulás flag törlése
  20.  
  21.  
  22.     { Ultrahang indítása minimum 10 us }
  23.      PORTc.0 := 1;
  24.       delay_us(10);
  25.      PORTC.0 := 0;
  26.  
  27.      { Mérés kezdete + meresi idő + UH elhalása
  28.        A mérést indító Trigger jel és a mérést végző Echo jel között
  29.        van kb. 25 ms holtidő amit a HC-SR04 ultrahang adatlapja nem dokumentál.
  30.        a mérés kiolvasásakor erre figyelni kell, nehogy mérés előtt olvassuk a
  31.        "0" ás számlálót!!!}
  32.        
  33.      delay_ms(100);
  34.  
  35.      result := (TMR1H Shl 8)+ TMR1L;
  36.      
  37.    if  Pir1.TMR1IF = 1 Then    // ha Timer1 tulcsordulás miatt kilép a mérésből
  38.      begin                     // A visszatérési érték a maximális Hexa FF FF
  39.        result := 65535 ;
  40.        Pir1.TMR1IF := 0;
  41.      end ;
  42.  
  43.   end;
  44.  
  45. end.

MyUnit_LCD :
  1. unit MyUnit_LCD;
  2.  
  3.  //  Egyedi karakterek tartalma " á, é "
  4.  
  5. const character_aa: array[0..7] of byte = (6,0,14,1,15,17,15,0);
  6.       character_ee: array[0..7] of byte = (12,0,12,18,30,16,14,0);
  7.  
  8. procedure CustomChar();
  9. procedure ValueToLCD(var value : string[4]);
  10. procedure ErrorToLcd();
  11.      
  12. implementation
  13.  
  14. { LCD-be egyedi karakterek beírása, első sorba
  15.    "Mért távolság: " kiírása. }
  16.  
  17. procedure CustomChar();
  18. var i: Byte;
  19.   begin
  20.     Lcd_Cmd(64);
  21.     for i := 0 to 7 do Lcd_Chr_CP(character_aa[i]);
  22.     Lcd_Cmd(72);
  23.     for i := 0 to 7 do Lcd_Chr_CP(character_ee[i]);
  24.  
  25.     Lcd_Cmd(_LCD_CLEAR);
  26.     Lcd_Cmd(_LCD_CURSOR_OFF);
  27.     Lcd_Cmd(_LCD_RETURN_HOME);
  28.     Lcd_Chr_CP('M');
  29.     Lcd_Chr_CP(1);
  30.     Lcd_Out_CP('rt t');
  31.     Lcd_Chr_CP(0);
  32.     Lcd_Out_CP('vols');
  33.     Lcd_Chr_CP(0);
  34.     Lcd_Out_CP('g :');
  35.   end;
  36.  
  37. { Paraméterként kapott mérési érték és RA.0 függvényében a
  38.    mennyiségi egység kiírása a második sorba.}
  39.    
  40. procedure ValueToLCD(var value : string[4]);
  41.  var egys :string[7];
  42.   begin
  43.    Case PortA.0 of
  44.       0: egys := ' cm    ';
  45.       1: egys := ' mm    ';
  46.     end;
  47.    Lcd_Out(2,1,'   ');
  48.    LCD_Out_CP(value);
  49.    Lcd_Out_CP(egys);
  50.   end;
  51.  
  52.  { Nem mérhető, nagy távolság esetén "Mérési hiba !" felirat a 2. sorba.}
  53.  
  54. procedure ErrorToLcd();
  55.  begin
  56.    Lcd_Out(2,2,'M');
  57.    Lcd_Chr_CP(1);
  58.    Lcd_Chr_CP('r');
  59.    Lcd_Chr_CP(1);
  60.    Lcd_Out_CP('si hiba !  ');
  61.  end;
  62.  
  63. end.
(#) DJozso válasza Elektro.on hozzászólására (») Márc 22, 2016 /
 
Köszönöm szépen a kódot. Micropascalba nem vagyok ott, DE!! A regiszterek értékei, a változók szépen értelmezhetők, mint ahogy a program logikája is, csak át kell tüzetesen néznem. Viszont azt had kérdezzem meg, ez is 16f887-re lett írva?
(#) Elektro.on válasza DJozso hozzászólására (») Márc 22, 2016 / 1
 
Nem! A fő Unit elején a kommentben benne van, hogy 16F690 re van írva. Ennek a számlálóját tudom külső (PortA.4 )lábról hardveresen indítani és leállítani. Így magához a számlálóhoz nem kellett megszakítást használnom.
A számláló tulcsordulást jelző Flag -et viszont a hibás , méréshatáron kívüli mérés detektálására használtam. Amit viszont tapasztaltam, szintén benne van a kód kommentjében, hogy a mérés indítása után nem rögtön húzza fel az UH modul a trig lábat hanem késik elég sokat. ezért van benne a 100ms késleltetés a mérés kiértékelése előtt. Amúgy sincs szükség olyan sűrű mérésre..
A hozzászólás módosítva: Márc 22, 2016
(#) DJozso válasza Elektro.on hozzászólására (») Márc 22, 2016 /
 
Oh, ne haragudj. Hogy lehetek ilyen láma?! Elvesztem a sűrűjében... Akkor így viszont az én PIC-em nem tudja ezt a külső timer indítást. De az elvek nálad is hasonlók. A timer indítását nálad hardveresen, nálam szoftveresen a megszakítás szubrutinból kell indítani amikor az "external interrupt" láb aktív, majd leállítani, amint az "echo" jel logikai nullára vált, majd kiolvasni a timer értékét, és kiszámolni a távolságot. Remélem így már a segítséggel sikerülni fog. Köszönöm a segítséget.
A hozzászólás módosítva: Márc 22, 2016
(#) Elektro.on válasza DJozso hozzászólására (») Márc 22, 2016 / 1
 
De igen. Az adatlapján azt látom, hogy nálad az RB.5 ös lábon van a T1G ! És a T1GSS bit -el engedélyezheted.
(#) apromax hozzászólása Márc 22, 2016 /
 
Ez kicsit off kérdés lesz, de mégis itt tenném fel, mert eszközök közti adatátvitelben e sorok olvasója valószínűleg nagy tapasztalattal rendelkezik.
Tehát a kérdés:
Egy páratartalom mérő adatlapjáról kiderül, hogy 14 bites felbontásban kerül a mért adat átvitelre. Ez meglehetősen nagy felbontás (1 / 16384), amit nem is értek, mert az eszköz paraméterei alapján mindez messze nem használható ki:
(Sensing Accuracy: 4.5%; Humidity Range: 0% to 100%)

(ez már egy viszonylag jó szenzor, így arra nem gondolok hogy itt is 14 bitet használnak mint az ezred %RD -t mérni képesnél, amely utóbbi nem is létezik)

De ezen túllépve a kérdésem az volna hogy a megadott képletben (lásd melléklet) miért szerepel a nevezőben a kettővel csökkentett hatványérték?
(#) zenetom válasza apromax hozzászólására (») Márc 22, 2016 /
 
Típus/adatlap?
(#) apromax válasza zenetom hozzászólására (») Márc 22, 2016 /
 
(#) bbalazs_ válasza apromax hozzászólására (») Márc 22, 2016 /
 
Ahogy latod, vannak egyeb szenzoraik is joval nagyobb pontossaggal. Es a kommunikacio mindegyiknel egyforma, tehat NEM kell atirni a szoftvert/firmware-t, ha masikat tesznek be vagy nagyobb pontossagot kivannak hasznalni. Masfelol atlagolassal is novelheto a pontossag.

A hatvanyos dologrol fogalmam sincs, talan hogy tenylegesen elerhesse a szazat.
(#) DJozso válasza Elektro.on hozzászólására (») Márc 23, 2016 /
 
Úgy látom van még mit tanulnom. Viszont megírtam a programot, úgy, ahogy a tied működik. A helyzet ugyanaz. Max 90 cm, amit tud. Szerintem a szenzor ennyit tud. Két mérési különböző elvvel is az eredmény ugyanaz. Már rendeltem egy másik UH szenzort az ebayről. Minden segítséget megköszönök.
(#) Elektro.on válasza DJozso hozzászólására (») Márc 23, 2016 /
 
Én is csak nem túl rég kezdtem neki. Bár a szándék nálam már 20 éve is megvolt, de valahogy sosem maradt rá elég időm.

Lehet, hogy valóban az UH modulod hibás, de ha jól emlékszem mintha lett volna az adatlapjában olyan, hogy kell neki minimum 0,5m2 visszaverő felület.
(#) Elektro.on válasza DJozso hozzászólására (») Márc 23, 2016 /
 
Még valami ami problémát okozhat. Az adatlapon kiemeltem.
Ha túl sűrű a mérés, zárt térben a fennmaradt visszhang is problémát okozhat.
(#) Elektro.on válasza Elektro.on hozzászólására (») Márc 23, 2016 /
 
Na még egyszer..
Kár, hogy a korábbi hozzászolást csak rövid ideig szerkeszthehetem.

Néztem az eredeti kódodat. nem vagyok benne biztos, hogy a problémát ez okozhatja, de a megszakításban az "a" változód típusa "int" Ami C ben -32,768 -től 32,767 -ig tart.
én számláló esetében mindenképp "unsigned int" -et használnék. Az én kódomban azért nem ezt látod mert a pascal -ban "unsigned int" helyett a "word" tipus szerepel ami 0 - tól 65535 - ig tart. A "C" tipusokat csatolom képben.
A hozzászólás módosítva: Márc 23, 2016
(#) usane válasza Lamprologus hozzászólására (») Márc 23, 2016 / 1
 
Nem kell túlbonyolítani. Ez mindkét irányba illeszt, már nem egyszer linkeltük.
Míg a Péter által megadott IC-t a jó ég tudja honnan tudod beszerezni, ezt a fetet szerintem bármelyik sarki elektronikai boltban megapod.
(#) usane válasza usane hozzászólására (») Márc 23, 2016 / 1
 
Javítok, nem a FET-est linkeltem, de az i megteszi. Íme a FET-es.
(#) DJozso válasza Elektro.on hozzászólására (») Márc 23, 2016 /
 
Hát először is azzal kezdeném, éjszaka aludni kell nem ilyesmivel foglalkozni... Persze, hogy úgyan úgy viselkedik a program, ha folyamatosan az eredeti hex filét írom a picbe, nem a módosítottat... (fáradtság). Miután a T1G lábról vezérelt TMR1-el próbálom ki, látszólag rögtön olyan 160-180 cm távolságot mutat. De az öröm nem sokáig tart. A mért távolság kb. dupla mint a valós távolság. Ennek oka (amit találtam), hogy a TMR1 időzítőben te nem használtál osztót, míg az én eredeti kódomban ez 1:2 osztó volt. A te PIC-ed 8Mhz-es belső , az enyém 8Mhz-es külsőről oszcillátorról megy, tehát ez is ugyanolyan.
Ez az "a" változó dolog nekem is eszembe jutott. Próbáltam unsigned int (előjel nélkülivel is), semmi változás. Próbáltam unsigned long változóként is, semmi. Bár elvileg az eredeti váltózóba(int) is bele kellene férni, hisz 400cm*58.82 = 23528.
Abban viszont teljesen igazad van, hogy annak unsigned int-nek kell lenni. Viszont az meglepett, hogy az unsigned short az 16 bites változó típus. Én esküdtem volna, hogy az 8 bites... Jó pap is holtig tanul.
A mérési ciklussal kapcsolatosan én 300ms-1s között néztem, semmin nem változtat. Nem gondolom, hogy itt lehet a hiba. Gondoltam, talán számítási hiba lehet, de miután a timer1 értékét is kiírattam a kijelzőre (hátha ott van valami hiba), kiderült, hogy az pontosan a távolság 58 szorosa. Nekem nincs már több ötletem a dologra, csak annyi, hogy a szenzor ennyit tud.
Viszont szeretném megköszönni a komoly segítséged, hogy időt szakítottál a problémámra. Köszönöm szépen.
(#) Zso839 válasza icserny hozzászólására (») Márc 23, 2016 /
 
Szia icserny!

Ezek szerint, ha MAX7219-t teszek a kapcsolásba, akkor elég lesz 3 port a pic-nél?
Próbáltam lerajzolni,nem tudom mennyire lesz látható.
Valami ilyesmire gondoltál?
A hozzászólás módosítva: Márc 23, 2016

7219b.jpg
    
(#) Lamprologus válasza usane hozzászólására (») Márc 23, 2016 /
 
Köszönöm, valami ilyesmi megoldást kerestem ...
Megmondom őszintén én is kicsit túlzásnak véltem azt az IC-t erre a feladatra ...

A BSS138 helyett valami ami nem SMD?

A tranzisztoros és a FET-es változat is tudja az oda visszát? (3,3V ból 5V és az 5V-ból 3,3V-ot?)
Igaz egyelőre csak egyik irányú átlalakítás kell... de, ki tudja ...

Mi az előnye, hátránya a FET-es ill tranyós megoldásnak?
(#) icserny válasza Zso839 hozzászólására (») Márc 23, 2016 /
 
Igen ilyen kapcsolásra gondoltam.

Szóhasználat: A három "port" valójában csak három digitális kimenet. A port az általában 8 vagy több összetartozó (egy gépi utasítással írható) kimenetet jelent.

A csak félig kihasznált MAX7219-nél inkább az alsó négy számjegyvezérlő kimenetet kellene használni, mert emlékeim szerint a SCAN LIMIT beállításával fentről lefelé haladva lehet letiltani a számjegy kijelzést. Azaz olyan beállítás van, hogy csak Digit 0, 1, 2, 3 él, de olyan nincs, hogy csak Digit 7, 6, 5, 4 él.
(#) Hp41C válasza Lamprologus hozzászólására (») Márc 23, 2016 /
 
BSS92
(#) Bakman válasza Hp41C hozzászólására (») Márc 23, 2016 /
 
Ez P csatornás FET, a rajzon N van.
(#) Hp41C válasza Bakman hozzászólására (») Márc 23, 2016 / 1
 
Bocsánat. Helyesbítve: BS108
(#) usane válasza Lamprologus hozzászólására (») Márc 24, 2016 / 1
 
A BJT-s csak felfelé illeszt, de egy plusz schottky diódával kétirányúvá tehető.
A FET-es kétirányú.

A FET-es előnye, hogy kevesebbet fogyaszt.
Ha nagyon gyors jelkövetés (<10ns) kell akkor a FET-et célszrerű push-pull áramkörrel meghajtani (pl: SD kártya).

Hp41C fórumtárs pedig írta a megfelelő TO-92-es FET-et.
(#) Zso839 válasza icserny hozzászólására (») Márc 25, 2016 /
 
Jah, igen. Bocsánat, csak már siettem a rajzzal, azért volt a felső négy digit meghajtó kimenethez kötve, de már javítottam.
Még egy kérdésem van:
- a szegmens kimenetekhez kell valami szegmens meghajtó áramkör ( pl. udn 2981), vagy mehet direktben a kijelzőkhöz?

7219.jpg
    
Következő: »»   764 / 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