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:
Valaki meg tudná mondani, hogy a timer1 időzítőt hogyan kell helyesen használni?
Hiába próbálom a leírások alapján, nem akar sikerülni a t1 változó számlálása.
Sikerült megoldanom. Így működik:
A hozzászólás módosítva: Nov 22, 2013
Timer0 osztásával van viszont további problémám. Hiába állítom 0-ról 1-re a ps2, ps1, ps0 értékeit, az intrerruptban lévő számláló értéke ugyanolyan sebességgel növekszik. Mi hiányzik még a kódból?
Sziasztok!
Egy kis segítséget szeretnék kérni, mert nem értem az I2C folyamatát egy PIC 16F887 -ben. A célom az lenne, hogy egy Raspberry PI -t I2C master-ként, folyamatosan lekérdezek értékeket egy PIC16F887 -es IC-ről. Találtam egy MicroC -ben megírt példaprogramot, amit átírtam MikroPascal nyelvre. Jelenleg most úgy működik, hogy ha az eszközre írok egy adatot, azt a PORTB -re kirakja. Ha beolvasok adatokat, akkor meg a programban megadott 234-es értéket kellene vissza kapnom! Ez így működik is, csak annyi a szépséghibája, hogy olvasásnál a regiszter címzést a PORTB-re íratja ki. Raspberry kódok: bus.read_byte_data(DEVICE,0x00) // Olvasom az adott eszközről a 0x00 -ás regiszterben lévő adatot bus.write_byte_data(DEVICE,0x00,0x20) // Írok a 0x00 regiszterbe 0x20 -as értéket A DEVICE változó a 0x34, amit a definiáláskor megadtam. A Raspberryben a fent leírt két módon szoktam adatot olvasni és írni. Hasonló megoldást szeretnék eléni, mint pl. az MCP23017 -es IC-nek van. Azt szeretném elérni, hogy ha mondjuk a PIC 0x20 -as címére ráírok egy bármilyen értéket, akkor a PORTB -n jelenjen meg. Ha 0x30 -as címére írok rá, az meg a PORTD-re kerüljön ki. Ugyan így olvasásnál. 0x20 -nál a PORTB értékét tudjam beolvasni, 0x30-nál pedig a PORTD értékét. Természetesen lenne még két regiszter, ahol a portok olvasását/írását tudnám beállítani, de ezzel elbűvészkedek én is ![]() Az lenne a kérdés, hogy a megszakításnál hol, milyen módon és mit kell összehasonlítani, hogy a fent említett megoldás megszülessen? A válaszokat előre is köszönöm
A hozzászólás módosítva: Dec 1, 2013
senkinek semmi ötlete a timerrel kapcsolatban?
Szia, pont most botlottam bele:
Gert van Loo wrote: If you have a choice then don't use I2C for the connection as the Pi has a bug in its I2C interface. Topic A serial nem jó?
Szia!
Picit elvesztettem a fonalat, mivel először egy relé működtetéséről beszéltél, utána jött a Timer1, majd később a Timer0... Most akkor miről is van szó? Ha Timer0 ban elakadok, először mindig a példaprogramot veszem elő! A te kódodban nem látom a következő sor egyik részét INTCON := 0x20; // Set T0IE, clear T0IF Itt azt írják helyesen, hogy a T0IE -t 1-re húzzák, amivel vissza állítják a túlcsordulást engedélyező bitet, (Bár nem tudom, hogy egyáltalán ez a Bit túlcsordulásnál megváltozik-e) majd a T0IF -et viszont 0-ra húzzák, hogy a túlcsordulási zászló alaphelyzetbe álljon. A példaprogramban még egy osztó is található a fő program részben, ahol még egy számláló segít a lassításban. Ennyi ötletem lett hirtelen
Szia!
Furcsa, hogy ezt írják, hisz eddig nem nagyon találkoztam I2C hibával. Nagyon sokáig teszteltem egy másik projektemben az MCP23017 -es IC-t, remekül működik a mai napig. Az én esetemben most reléket kellene rákötni egy 16F887-es IC-re, amit I2C -n keresztül vezérelve ki-be kapcsolgatok, és ez mellett 3db DS18B20 -as hőmérséklet IC-t is hozzá kellene csatolnom az IC-hez. A példaprogramból amúgy addig jutottam, hogy a megszakítást a SSPBUF telítettségi értéke indítja el a megszakítást, és a megszakítás eléggé gyorsan lefut. Tehát elméletileg, ha megjön az első érték, ami írásnál, vagy olvasásnál a regiszter címet mondja meg, azt kellene először összehasonlítanom az előre definiált értékkel, majd a következő megszakításnál egy, a regiszter címhez írt rutint kellene végrehajtania? Vagy esetleg, ha bejön mind a két adat (írásnál a regiszter és az adat), akkor utána kell valami feltételben definiálni? És akkor itt a másik kérdés, hogy az eszköz ID-ját ki, vagy mi ellenőrzi? A sotfvware, vagy a hardware? Hisz a program legelején SSPADD := Addy; beadjuk az address-t és pont.
Valójában az összes időzítővel szenvedek valamilyen hibával.
Maradjunk a timer0-nál egyenlőre. A INTCON := 0x20; szerintem azért felesleges az interrupt-ba, mert a INTCON.T0IF:= 0; nullára állítja a T0IF bitet, a T0IE bit értéke pedig az inicializáláskor már 1-re lett állítva. A counter változó számlálásával valóban lehetséges a késleltetés, viszont szeretném megérteni a timer teljes működését, amiben az OPTION_REG.PSA PS2..PS0 bitekkel lehetne megoldani a problémát. És ezt nem sikerül működésre bírnom.
Próbáld ki az alábbi programot, és hasonlítsd össze a kapott eredményt a saját programkódoddal:
http://www.libstock.com/projects/view/398/timer-calculator
Szia.
Ezzel a minimális kiegészítéssel próbáltam, és jól működik. (Proteus szimulátor PIC16F877A) Mindent úgy állítottál be, ahogy kell.
A hozzászólás módosítva: Dec 4, 2013
Köszönöm mindenkinek a segítséget!
Úgy gondolom, hogy három hibát vétettem egyszerre. - Az első, hogy az option_reg és intcon regisztereknek nem minden bitjét állítottam be, így alapértelmezetten azok 1-es értéket vettek fel. - A második, hogy az interrupt-ban számlált változó értékét a PORTB lábakra kötött LCD-n írattam ki, így ez bezavarhatott a portok megszakítás engedélyezésébe. - A harmadik hiba, hogy változóból próbáltam átadni inicializáláskor a PSA, PS2, PS1, PS0 értékeit, és a változóknak ugyanezeket a neveket adtam. Míg procedure-ban deklaráltam ezeket a változókat, addig nem is panaszkodott a fordító, csak amikor globális változók közzé helyeztem át őket. Én nem szeretem hexa értékkel beállítani a regisztereket, mert akkor nem látom a forrásban világosan, hogy mely bitek hogyan is állnak. Így készítettem el az inicializáló részt, ami végre működik sebességosztással is:
A kommentekben remélem nem írtam nagy hülyeségeket. Próbáltam magyarul megfogalmazni, melyik bit mire is jó. A hozzászólás módosítva: Dec 4, 2013
Szia! A Counter tényleg nem szükséges, ellenben, mikor a timer -eket nézegettem, nem volt oszcilloszkópom, és váltig állítottam, hogy a 20MHz-es kvarc remek lesz
Igen, akkor, ha komolyabb munkába akarok fogni. Nálam akkor a LED counter nélkül világított, illetve vibrált. Akkor én is próbálgattam az osztókat ![]() Mégvalami! Nekem nagyon tetszett az, mikor a goolge-ban rákerestem egy Timer kalkulátorra. Ott ha jól emlékszek, beadom, hogy milyen kvarc-om van, és hogy mit szeretnék vissza kapni, és a kis webes program kidobta a beállításokat ![]() PIC Timer Calculator Közben látom, hogy gozi is belinkelt egy kalkulátoros linket A hozzászólás módosítva: Dec 4, 2013
Igen ismerem a programot.
Hiányolom belőle a regiszterek összes bitjének beállítását. Próbáltam a segítségével órát készíteni egy 16F628A PIC-re. 4Mhz-es belső oszcillátorral. A program által megadott beállításokkal 1ms-os megszakításokat kellett volna kapnom 1:4 osztó (PSA := 1 mellett) és TMR0 := 6 beállításával. Sajnos nagyon pontatlan lett a végeredménye. Ha a TMR0-át 60-ra állítom akkor már közelít a valósághoz, de abban az esetben is 10 percen belül 3mp-es késéssel működik. Az interrupt részben így számolom az időt:
Nem tudom, hogy az oszcillátor ennyire pontatlan, vagy a kódban van-e hiba. A hozzászólás módosítva: Dec 5, 2013
Szia!
Linux oldalon miben programozol? Csak érdeklődés képen, mert nekem is itt van az asztalomon egy PI, ha lenne időm én is foglalkoznék vele egy kicsit. Nekem egy Lazarus van rajta egyenlőre.
Ha mindenárom timer0 -val szeretnéd megoldani: Bővebben: Link
Timer2 -vel egyszerűen lehet 4MHz -es órajelből 1ms, 10ms -os periódikus megszakításkérst előállítani.
Timer2-t hogyan kell paraméterezni egy pontos órához?
Timer0-val hiába próbálkozok, csak közelítőleg pontos időt kapok vissza. Proteusban tesztelem a kapcsolást, így a PIC kristály pontatlanságát kizárom mint hibalehetőséget. Azt tapasztalom, hogy az LCD-re kiíratott idő, mintha néha, kb 3-4 mp-ként később váltaná a mp-et. Az interrupt-ot szinte teljesen kiürítettem, csak egy számláló, meg a működéséhez szükséges TOIF és TMR0 beállítások vannak benne.
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.
Í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.
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
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
Most kiírva hardwarre 2 mp-et siet 1 percen belül.
A hozzászólás módosítva: 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
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.
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:
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
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
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
Sajnos úgy sem jó.
Van valakinek erre biztosan működő példa programja pascalban?
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?
A hozzászólás módosítva: Dec 9, 2013
Csatoltam a kapcsolási rajz képét is...
|
Bejelentkezés
Hirdetés |





Hisz a program legelején SSPADD := Addy; beadjuk az address-t és pont. 






