Fórum témák

» Több friss téma
Fórum » MikroPascal kérdések
 
Témaindító: bozsokiandras, idő: Máj 15, 2006
Témakörök:
Lapozás: OK   25 / 29
(#) Hp41C válasza progee hozzászólására (») Dec 6, 2013 /
 
16F628 4MHz órajellel 1us -el lépteti a timereit. A Timer2 1:1, 1:4, 1:16 előosztóval, egy 8 bites programozható osztóval (RR2) és egy 1:1 .. 1:15 utóosztóval rendelkezik. 1ms előállításához a timer2 -nek 1000 -rel kell osztania: 1:4 előosztó, 250 -es programozható osztó és 1:1 utóosztó.
PR2 = 249; T2CON = 5;
A megszakítás kéréséhez PIE1 regiszter TMR2IE bitjét 1 -re, INTCON PEIE bitjét 1 -re, és az INTCON GIE bitjét is 1 -re kell állítani.
(#) progee válasza Hp41C hozzászólására (») Dec 6, 2013 /
 
Így írtam meg a program időzítő részét, de 15másodpercen belül 2 másodpercet késik. Proteus-ban tesztelem a kódot. A begin..End között van még pár sor kód (nyomógombok állapot lekérdezése), de annak az időzítést tudtommal nem kellene zavarnia.
  1. procedure Interrupt;  
  2. begin
  3.  if PIR1.TMR2IF = 1 then
  4.   begin
  5.     inc(t2);
  6.     TMR2  := 0;        //Kezdőértékek
  7.     PR2   := 249;
  8.     PIR1.TMR2IF := 0;
  9.   end;
  10. end;
  11.  
  12.  
  13. Begin
  14.   TMR2   := 0;
  15.   PR2    := 249;
  16.   T2CON  := %00000101 //prescale 1:4
  17.   PIE1   := %00000010 //TMR2IE
  18.   INTCON := %11000000 //GIE, PEIE
  19.  
  20.  
  21.   while true do
  22.   begin
  23.     if t2 >= 1000 then //1mp
  24.     begin
  25.       t2 := 0;
  26.       inc(mp);        
  27.  
  28.       KIIR_IDO;        //LCD_OUT    
  29.  
  30.       if mp = 60 then  //1perc
  31.       begin
  32.         inc(p);
  33.         mp := 0;
  34.         if p = 60 then //1óra
  35.         begin
  36.           inc(o);
  37.           p := 0;
  38.         end;
  39.       end;
  40.     end;
  41. end.
(#) progee válasza progee hozzászólására (») Dec 6, 2013 /
 
Ez egyre jobb!
Ugyanazt a hex fájlt ha futtatom a proteusban ill, kiírom a fizikai pic-re, akkor más-más sebességgel dolgozik. A proteus szimulációban késik, a gyakorlatban pedig egy keveset siet.
A hozzászólás módosítva: Dec 6, 2013
(#) Hp41C válasza progee hozzászólására (») Dec 6, 2013 /
 
A TMR2 -t nem kell írni, a hardware törli... A megszakításban a PR2 írása is felesleges, a beállított érték megmarad benne.
A hozzászólás módosítva: Dec 6, 2013
(#) progee válasza Hp41C hozzászólására (») Dec 6, 2013 /
 
Most kiírva hardwarre 2 mp-et siet 1 percen belül.
A hozzászólás módosítva: Dec 6, 2013
(#) robing16 válasza progee hozzászólására (») Dec 6, 2013 /
 
Szia!

Tapasztalatból mondom, hogy nagyon nehéz egy önálló PIC-el úgy órát készíteni (mondjuk nem csak az órát számolgatja, hanem egyéb más program részek is vannak), hogy az tényleg patentosan pontos legyen!

Én, ha órát fogok használni, a következő két módszert használnám! (BEVÁLT MÓDSZER).
RTC -- link

A DS1307 -es IC-nek konkrétan egyetlen egy feladata van, méghozzá a beállított idő tartása és rendkívül pontos számlálása. Ez az IC egy 32.768kHz - es kvarc -al működik, áramszünet esetén a ráköthető 3V -os (alaplapi elem PL: 2032) tartja, és működteti a számlálót. Ha jól emlékszek, akkor I2C buszon keresztül két vezetékkel könnyen kiolvasható a Regiszter táblákból a pontos idő értékei.

Ha mégis számlálósat szeretnél készíteni, akkor is javaslom, hogy legyen ott ez az IC, ugyanis képes 1s -os impulzusokat kiadni az SQW/OUT lábán. Ebben az esetben csak a megszakítás vezérlő bemenetre kell rákötnöd, és a programban megszakításkor a szmáláót kell növelned. Alaphelyzetben I2C buszon keresztül kell beállítani a pontos időt, majd a belső timer-ét elindítani, és amíg más parancsot nem kap, vagy nem merül le az elem, a pontos időt tartani fogja.

Csak egy ötlet
A hozzászólás módosítva: Dec 6, 2013
(#) robing16 válasza gthomas hozzászólására (») Dec 6, 2013 /
 
Szia!

Raspberry-n nekem a Python programozási nyelv fogott meg, főleg azért, mert sok olyan modulja is van, amit nem kell előre megírni.

OS-nek Raspbian -t raktam fel. Engem nagyon megfogott az I2C kommunikációs busz, és a fentebb leírt módon egy PIC16F887 -el szeretném összekötni.
(#) progee válasza robing16 hozzászólására (») Dec 7, 2013 /
 
Utánaolvastam rengeteg fórumon, és mindenhol a belső oszcillátor pontatlanságát írják.
A proteusz és a valóságban mért időeltérések oka pedig, valószínűleg a PIC hőmérsékletének betudható plusz ingadozás volt.
Próbálom a költségeket alacsonyan tartani, így 32.768KHz-es külső kvarcra próbáltam tesztet készíteni. Mivel itthon nincs ilyenem, így egyenlőre proteusban tesztelem.
Ebben is sikerült zátonyra futnom. Rengeteg kitartás kell a mikrokontrollerhez
Az alábbi módon inicializáltam a timer1-et:

  1. procedure Interrupt;
  2. begin
  3.   if PIR1.TMR1IF = 1 then
  4.   begin
  5.     inc(t1);
  6.     PIR1.TMR1IF := 0;
  7.   end;
  8. end;
  9.  
  10. begin
  11.  
  12.   COMPARATOR_OFF;
  13.  
  14.   T1CON.T1OSCEN  := 1; //Külső oszcillátor
  15.   T1CON.SYNC     := 1; //Nincs szinkronizáció
  16.   T1CON.TMR1CS   := 1; //Külső időzítő T1CKI lábon (RB6-RB7)
  17.   T1CON.TMR1ON   := 1; //Timer1 start
  18.   PIE1.TMR1IE    := 1; //Timer1 megszakítás engedélyezése
  19.   INTCON.GIE     := 1; //Globális megszakítás engedélyezése
  20.   INTCON.PEIE    := 1; //Perifériás megszakítások engedélyezése
  21.  
  22.   while true do
  23.   begin
  24.     if t1 >= 1000 then
  25.     begin
  26.       t1 := 0;
  27.       inc(mp);
  28.      
  29.       if mp >= 60 then
  30.       begin
  31.         inc(p);
  32.         mp := 0;
  33.         if p >= 60 then
  34.         begin
  35.           if o > 23 then o := 0 else inc(o);
  36.           p := 0;
  37.         end;
  38.       end;
  39.      
  40.       KIIR_IDO;  //LCD
  41.     end;
  42.   end;
  43.  
  44. end.


A regiszterek többi bitjét nullára állítottam.
Ennek a kódnak a belső 4MHz-es órára igazított beállításaival tudja számolni az időt, csak ugye pontatlan.
Ezzel a beállítással viszont meg sem moccannak a számok. Mintha az interrupt le sem futna.
Mielőtt kitépném az összes hajamat, valaki tudna adni tippet, mit hagytam figyelmen kívül?
Csatoltam a tesztáramkör rajzát.
A hozzászólás módosítva: Dec 7, 2013

32khz.jpg
    
(#) progee válasza progee hozzászólására (») Dec 8, 2013 /
 
Annyival jutottam közelebb a megoldáshoz, hogy a OPTION_REG.NOT_RBPU := 0; bit-el sikerült engedélyeztetnem a PortB megszakításokat, és így a T1CKI lábra kötött nyomógombbal sikerült külső impulzussal számoltatnom a timer1 interruptot.
Sajnos kvarccal továbbra sem csinál semmit.
A hozzászólás módosítva: Dec 8, 2013
(#) Ktulu válasza progee hozzászólására (») Dec 8, 2013 /
 
Nem vagyok teljesen meggyőződve róla, hogy a Proteus képes külső oszcillátort szimulálni.
Nagyon javaslom, hogy inkább a valóságban próbáld ki.
Óra kvarcot találsz bármilyen ócska vacak kínai órában, (pl. csipogós ébresztős) karórában stb.
Bővebben: Link
(#) progee válasza Ktulu hozzászólására (») Dec 8, 2013 /
 
Sajnos úgy sem jó.
Van valakinek erre biztosan működő példa programja pascalban?
(#) progee válasza progee hozzászólására (») Dec 9, 2013 /
 
Csináltam egy teljesen lebutított demot. Csatoltam a pascal kódot és a proteus szimulációs fájlt.
Tudná valaki tesztelni? Ha a T1CON.TMR1CS-t nullára állítom, akkor a belső óráról működik a timer1 számlálás, ha 1-re állítom, akkor nem megy külső kvarcról. Mi hiányozhat még belőle?
  1. program timer_teszt;
  2.    
  3. var LCD_RS : sbit  at RB4_bit;
  4. var LCD_EN : sbit  at RB5_bit;
  5. var LCD_D4 : sbit  at RB0_bit;
  6. var LCD_D5 : sbit  at RB1_bit;
  7. var LCD_D6 : sbit  at RB2_bit;
  8. var LCD_D7 : sbit  at RB3_bit;
  9.  
  10. var LCD_RS_Direction : sbit at TRISB4_bit;
  11. var LCD_EN_Direction : sbit at TRISB5_bit;
  12. var LCD_D4_Direction : sbit at TRISB0_bit;
  13. var LCD_D5_Direction : sbit at TRISB1_bit;
  14. var LCD_D6_Direction : sbit at TRISB2_bit;
  15. var LCD_D7_Direction : sbit at TRISB3_bit;
  16.  
  17. var t1: integer;
  18.     s: string[10];
  19.  
  20. procedure Interrupt;
  21. begin
  22.   if PIR1.TMR1IF = 1 then
  23.   begin
  24.     inc(t1);
  25.     TMR1H       := 0;      
  26.     TMR1L       := 0;
  27.     PIR1.TMR1IF := 0;
  28.   end;
  29. end;
  30.  
  31. procedure timer1_init;
  32. begin
  33.   TMR1H          := 0;      
  34.   TMR1L          := 0;
  35.   t1             := 0;
  36.  
  37. //  OPTION_REG.NOT_RBPU := 0;    
  38.  
  39.   T1CON.T1CKPS1     := 0;      
  40.   T1CON.T1CKPS0     := 0;
  41.   T1CON.T1OSCEN     := 1;      
  42.   T1CON.NOT_T1SYNC  := 1;      
  43.   T1CON.TMR1CS      := 1;      
  44.   T1CON.TMR1ON      := 1;      
  45.  
  46.   PIR1.EEIF         := 0;      
  47.   PIR1.CMIF         := 0;      
  48.   PIR1.RCIF         := 0;    
  49.   PIR1.TXIF         := 0;      
  50.   PIR1.CCP1IF       := 0;      
  51.   PIR1.TMR2IF       := 0;    
  52.   PIR1.TMR1IF       := 0;    
  53.  
  54.   PIE1.EEIE         := 0;      
  55.   PIE1.CMIE         := 0;      
  56.   PIE1.RCIE         := 0;    
  57.   PIE1.TXIE         := 0;    
  58.   PIE1.CCP1IE       := 0;      
  59.   PIE1.TMR2IE       := 0;      
  60.   PIE1.TMR1IE       := 1;      
  61.  
  62.   INTCON.GIE        := 1;      
  63.   INTCON.PEIE       := 1;      
  64.   INTCON.T0IE       := 0;      
  65.   INTCON.INTE       := 0;      
  66.   INTCON.RBIE       := 0;      
  67.   INTCON.T0IF       := 0;      
  68.   INTCON.INTF       := 0;      
  69.   INTCON.RBIF       := 0;      
  70. end;
  71.  
  72. begin
  73.   CMCON := %00000111;
  74.  
  75.   Lcd_Init();
  76.   delay_ms(100);
  77.   Lcd_Cmd(_LCD_CURSOR_OFF);
  78.   Lcd_Out(1, 1, 'T1:');
  79.  
  80.   Timer1_init;
  81.   delay_ms(100);
  82.  
  83.   while true do
  84.   begin
  85.     bytetostr(t1, s); ltrim(s);
  86.     Lcd_Out(1, 7, s);
  87.   end;
  88. end.
A hozzászólás módosítva: Dec 9, 2013
(#) progee válasza progee hozzászólására (») Dec 9, 2013 /
 
Csatoltam a kapcsolási rajz képét is...
(#) progee válasza progee hozzászólására (») Dec 9, 2013 /
 
Na apránként csak felrakok minden szükséges fájlt
A HEX lemaradt...
(#) Ktulu válasza progee hozzászólására (») Dec 9, 2013 / 1
 
Az RB7-re köss egy külső oszcillátort a kvarc helyett, és működni fog. (Generator Mode - DCLOCK frekvenciát állítsd 32768Hz -re)
A valóságban inkább 2 darab 15pF kondit használj 33 helyett.
A hozzászólás módosítva: Dec 9, 2013
(#) progee válasza Ktulu hozzászólására (») Dec 9, 2013 /
 
Egy DCLOCK nevű eszközt találtam proteusban, és azzal valóban működik.
De miért van ez?
Valóságban is összeállítottam a kapcsolást, és úgy sem működött kvarcal. Rossz kvarcot találtam volna? Egy régi alaplapból forrasztottam ki.
(#) Ktulu válasza progee hozzászólására (») Dec 9, 2013 /
 
Lehetséges, hogy az 14.3MHz -es kristály.
(#) progee válasza Ktulu hozzászólására (») Dec 9, 2013 /
 
Biztosan nem. 32768 van ráírva.
Most szereztem még 4db használtat. Estére újra tesztelem ezekkel élőben.
Sajnos rendelésre 5-7 nap mire újhoz jutok.
A proteust viszont továbbra sem értem.
(#) progee válasza Ktulu hozzászólására (») Dec 9, 2013 /
 
Nagyon köszönöm a segítséget!
Sikerült pontosan beállítani.
(#) Ktulu válasza progee hozzászólására (») Dec 9, 2013 /
 
Szívesen, örülök hogy sikerült.
A nyákon majd a lehető legközelebb tedd a kvarcot és a 2 kondit a mikrovezérlőhöz. (a vezetékek a testhez a kondenzátoroktól is a lehető legrövidebbek legyenek a nagyobb pontosság eléréséhez)
(#) Prendick válasza progee hozzászólására (») Dec 11, 2013 /
 
Azért nem megy a kvarc, mert nem állítottad be rendesen az RB6-7 portokat. Egy kvarc önmagában nem oszcillál, csak ha oszcillátor kapcsolásba van kötve. Lehet látni jól a rajzon, hogy az RB6 ebben a kapcsolásban T1OSO. Vagyis kimenet. Az RB7 meg T1OSI, bemenet. Ezek között rezeg majd a kvarc. Alapból a TRISB mindent bemenetre állít. Két bemenetttel meg nincs kvarc.
A TRISB6_bit-et 0-ra kell állítani, a TRISB7_bit-et meg 1-re.
Szerintem ezután a Proteus is felismeri a szándékot és szimulálja a kvarcot.
A hozzászólás módosítva: Dec 11, 2013
(#) progee válasza Prendick hozzászólására (») Dec 11, 2013 /
 
A legelső próbálkozásaim egyike a portb lábak beállítása volt, de úgy sem működött. Most újra kipróbáltam és ismételten nem megy proteusban.
Próbapanelon összeállítva viszont az áramkört, a portb lábak állítgatása nélkül is működik szépen.
A hozzászólás módosítva: Dec 11, 2013
(#) user hozzászólása Dec 14, 2013 /
 
Sziasztok!

Ebbe a hőmérős programba szeretném beleilleszteni az lcd kiiratást,de a kijelzőn semmi nem jelenik meg.Tudna segíteni valaki abban hogy hogyan kell konfigurálni az lcd kijelzőt?
A kód mikropascal pro 6.0.0-ban lett megírva, és a "picplc6_ds1820.mpas"-ban nem jelenik meg semmi az lcd-n, a "MyProject.mpas"-ban jól működik a kiiratás.

Köszönettel
user
(#) progee válasza user hozzászólására (») Dec 15, 2013 /
 
Nem olvastam végig az egész mpas fájlt, de ilyen nálam akkor fordult elő,amikor külső belső oszcillátort szerettem volna használni, de a mikropascal alapértelmezett, külső, HS oszcillátorával fordítottam le.
A másik ami még ilyet okozott, hogy az LCD_INIT(); után nem várakoztattam a programot egy delay_ms(100); -al, így nem volt idő az LCD inicializálásra, annak használatbavételéig.
(#) progee válasza progee hozzászólására (») Dec 15, 2013 /
 
" külső belső "
Korán van még. Tehát amikor belsőt szerettem volna használni.
(#) user válasza progee hozzászólására (») Dec 15, 2013 /
 
szia

A mikropascalban XT külső oszcillátor van beállítva és egy 4megás külső kvarcot használok, szerintem ez jó.
Kipróbáltam,amit írtál de nem segít a Delay_ms(100); sem sajnos. Az lcd világít, és a felső sorban végig tömör fekete négyzetek jelennek meg, az alsó sorban semmi.
Azt nem értem hogy a "myproject"-ben meg jó.
(#) progee válasza user hozzászólására (») Dec 15, 2013 /
 
Próbáld ki azért, hogy a belső kvarcal is ugyanezt csinálja-e.
Ha jól látom, a 16F886-nál a külső kvarcot a 9-10 (RA6-RA7) lábakra kell kötni, Te pedig a TRISA -t 255-re állítottad. Szerintem az nem jó, hogy mindkét láb bemenetre van állítva.
A hozzászólás módosítva: Dec 15, 2013
(#) user válasza progee hozzászólására (») Dec 15, 2013 /
 
Kipróbáltam, HS-el is ugyanaz a helyzet sajnos.
Egy 16F877-est használok a "picplc6_ds1820.mpas"-ban, a kvarc a 13-14-es lábon van.
(#) progee válasza user hozzászólására (») Dec 15, 2013 /
 
Nem HS-el, hanem belső oszcillátorral: INTOSC oscillator ...
(#) progee válasza user hozzászólására (») Dec 15, 2013 /
 
Az UART1_Init(9600);-et az LCD_Init után hívd meg, és mindkét init után tegyél egy 100 ms-os várakoztatást.
Következő: »»   25 / 29
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