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:
Az RA4-RA5 az OSC1-OSC2 láb külső oszcillátornál. Valami itt nem OK! Én belső 4MHz-t használok.
szerintem a ra4. lábat állítottad bemenetre.
A hozzászólás módosítva: Okt 13, 2013
Szerintem a konfigurációs bitek környékén van a probléma, konkrétan az oszcillátorra vonatkozó részen. Ha belső oszcillátort használsz, akkor az INTOSCIO üzemmód kell az RA4 és az RA5 I/O használatához.
Igen!
gozi megoldotta a "fura" jelenséget. Köszönöm a segítséget, további szép estét mindenkinek!
Sziasztok!
Egy kis segítségre lenne szükségem. Adott egy 16F877A és 2db HD44780 kompatibilis LCD. Egy 2x20 és egy 4x20 charakteres. Összehoztam próbapanelon egy kis áramkört, hogy leteszteljem, de nem akar elindulni az kiíratás az LCD-re. Az LCD megjelennek az első sorban a kockák, de nem ír ki rá semmit sem. Oshon-os szimulátorban minden működik. Mikropascalban írtam rá progit. Először a B protra kötöttem az lcd-t a vezérlő és adatbiteket is (trisb:=0x00; lcd_init(portB); lcd_out(1,1, ' szöveg') utána megpróbáltam szétosztani az adat biteket a B és D port között, de így is semmi. Órajel 20MHz ezt ellenőriztem az osc2 kimeneten skóppal az szép tiszta. az MCLR lábat 10k-val felhúztam VDD-re. Program beírása után vissza olvastam a pic-ből a progit az ok. Tudna valaki segíteni, hogy mi lehet a hiba, amiért nem akar írni az LCD a PIC? A segítséget előre is köszönöm. Üvd.: Zoli!
Hello! Nekem nincs Pascal-om, de ha csak az első sorban kockák vannak, az azt jelenti, nem történt meg az LCD inicializálása. Vagy a program nem jó, vagy a hardver bekötés, vagy a bekötés nem felel meg a programnak. (4-8 bit üzemmód stb.) Általában az LCD-ről nincs visszaolvasás, így az RW vonalat fixen a GND-re kell kötni. üdv!
Szia
Digitálisra át vannak állítva a lábak? ADCON0 := 0x07; Üdv
Köszönöm a választ. Közben megoldódott a dolog. A próba panelban volt a hiba. Szakadás volt benne az egyik oldalon, amit nem láttam, mivel be van öntve és csak a jelöléseket figyeltem. Egyébként meg egy 8 zónás lakás riasztó prigiját írtam és előtte le akartam próbálni az lcd.
Üdv.: Zoli
Hali! Nem állítottam át a portot az LCD miatt, mivel az adatlap szerint a B port alapból digitális, csak kimenetnek állítottam. Viszont közben akadt még1 kisebb gondom a beépített eeprommal. Kiolvasni az eeprom_read-del ki tudom az eeprom adott byte-ját viszont írni valahogy nem igazán akarja eeprom_write-al (eeprom_write($01, 0x04). Az adatlap szerint van benne 256byte eeprom. A segítséget előre is köszönöm.
Üdv.: Zoli
Szia
Ha jól emlékszem nekem is volt hasonló problémám. Próbálj betenni egy kis késleltetést az írás elé. delay_ms(100); Üdv
Köszi a választ. Tettem be várakozást, mivel a mikropascal is írta, hogy 20ms-re szükség van írás előtt, de így csinálja meg az írás. Arra gondoltam még, hogy esetleg nem-e kell beállítani valami kapcsolót még a project elején és nem a default-ot kellene használni. Gondolok itt (WRT_ENABLE_ON vagy OFF).
Köszönöm a segítséget. Üdv.
Tudnátok segíteni?
Az alábbi kód egy 16F628A PIC-re küldene RS232-n karaktereket. Adott karakternél, egy relét kellene behúzni a PIC RB4 lábán. Ha a kikommenterezett részt engedélyezem, akkor az RA0 lábon lévő nyomógombbal tudom működtetni a relét. PC-ről küldött karakterrel viszont nem csinál semmit. A PC-nek visszaküldött karakter (UART1_Write(uart_rd)) helyesen jelenik meg a monitoron.
A hozzászólás módosítva: Nov 7, 2013
Nem pascal kód volt a hiba oka. Egy elkötés miatt nem működött.
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. |
Bejelentkezés
Hirdetés |