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   11 / 29
(#) gthomas hozzászólása Dec 30, 2009 /
 
Először is kellemes ünnepeket mindenkinek!

DS1621 próbálnék szólongatni szoftveres i2c-n, de mindig 255 a visszatérési érték:

Soft_I2C_Start();

Soft_I2C_Write(0xEE); // indítok egy konverziót
Soft_I2C_Stop();
Delay_ms(1000);
Soft_I2C_Start();
Soft_I2C_Write(0xAA); // kérek 2 bájtot
Soft_I2C_Stop();
Soft_I2C_Start();
Temp1 := Soft_I2C_Read(1); // itt jön az első
Temp_1 := Soft_I2C_Read(0); // itt a második

Delay_ms(100);
Soft_I2C_Stop();
Delay_ms(100);


Temp1, és Temp_1 egyaránt 255. Mit csinálok rosszul?
(#) icserny válasza gthomas hozzászólására (») Dec 30, 2009 /
 
  1. Soft_I2C_Write(0xAA);
  2. Soft_I2C_Stop();
  3. Soft_I2C_Start();
  4. Temp1 := Soft_I2C_Read(1);

Nem ismerem a DS1621 lelkivilágát, de ez a sorrend így biztosan nem jó. I2C esetén Start után tudtommal egy parancsnak kell jönnie, ami érvényes címet és R/~W=1 bitet tartalmaz.
(#) levii válasza gthomas hozzászólására (») Dec 30, 2009 /
 
Szia!
Én készítettem mikropascallal, AVR el és DS1621el hőmérőt.
  1. procedure Start_Conversion();
  2.   begin
  3.   TWI_Start();
  4.   TWI_Write(144);
  5.   TWI_Write($EE);
  6.   Delay_ms(1000);
  7.   TWI_Write($22);
  8.   TWI_Stop();
  9.   end;


Ez a procedure arra jó hogy a hőmérő mérést végezzen. A címzési lábak A0,A1,A3 a földre vannak húzva.

  1. procedure Read_Temperature();
  2.    begin
  3.     TWI_Start();
  4.     TWI_Write(144);
  5.     TWI_Write($AA);
  6.     TWI_Start();
  7.     TWI_Write(145);
  8.     MSB:= TWI_Read(1);
  9.     TWI_Read(0);
  10.     TWI_Stop();
  11.     if MSB < 126  then
  12.     read:=MSB;
  13.     if MSB > 125 then
  14.     read:= 255 - MSB ;
  15.     if MSB > 125 then
  16.     elojel:=1;
  17.     if MSB < 125 then
  18.     elojel:=0 ;
  19.     end;


Ez a procedure pedig a mért hőmérséklet kiolvasása az ICből.

A TWI helyett értelemszerűen mindenhova Soft I2C kell.

Ha pontosabban akarod olvasni akkor a második bájtot is ki kell olvasni és akkor a 10. sorban lévő TWI_read(0) helyett változó := TWI_read(0) kell.


Üdv!
(#) Qka válasza gthomas hozzászólására (») Dec 30, 2009 /
 
Szervusz gthomas !

Én DS1820+ -t használok. Elsőre nekem sem működött.
Elfelejtettem az I2C - portját digitálisra állítani .
PIC16F877 - nél alapból analóg I/O. Nálam az adcon1:=$06; segített.


Üdv / BUÉK !

Qka
(#) gthomas válasza levii hozzászólására (») Dec 31, 2009 /
 
Köszi a válaszokat, csak elindult a kommunikáció.
Annyi a bajom, hogy a kijelző 28 °C-ot mutat, a falon levő termosztát pedig 21,5-öt, biztos ennek van igaza. Hőforrás nincs a közelben, a 1621 a próbapanel jó messze van mindentől. Lehet ezzel valamit kezdeni, vagy rossz lenne a 1621?

Üdv!
(#) icserny válasza gthomas hozzászólására (») Dec 31, 2009 /
 
Ha túl gyakran olvasod ki, akkor belülről fűtöd a hőmérődet.
(#) gthomas válasza icserny hozzászólására (») Jan 2, 2010 /
 
Most kb. fél percenként olvasom ki, mégis 29°C
(#) m.joco válasza gthomas hozzászólására (») Jan 2, 2010 /
 
Mikropascalban van 1wire unit direkt ds1820-hoz. Én azzal működésre tudtam bírni a hőmérő ic-t.
Üdv.
(#) gthomas hozzászólása Jan 10, 2010 /
 
Sziasztok!

Vettem egy 16F628-at. RB0-on egy ledet akarok villogtatni. (hello world) Szerintetek miért nem megy?

program ado1;
{ Declarations section }
var i:byte;
procedure init;
begin
CMCON:=$07;
trisb:=0;
portb:=0;
i:=0;
end;

begin
{ Main program }

while true do
begin
i:=1-i;
portb.0:=i;
delay_ms(1000);
end;
end.
(#) m.joco válasza gthomas hozzászólására (») Jan 10, 2010 /
 
Hello
Nem kell eljárás a programba, szóval ezeket az utasításokat:
CMCON:=$07;
trisb:=0;
portb:=0;
i:=0; a főprogram elejébe írd.
Üdv.
(#) gthomas válasza m.joco hozzászólására (») Jan 10, 2010 /
 
Jaaj bocs, egy so kimaradt, ami meghívja az eljárást:

program ado1;
{ Declarations section }
var i:byte;
procedure init;
begin
CMCON:=$07;
trisb:=0;
portb:=0;
i:=0;
end;

begin
{ Main program }

init;

while true do
begin
i:=1-i;
portb.0:=i;
delay_ms(1000);
end;
end.

Szóval így nem működik, pedig szerintemm kellene. Belső oscillátort a projekt létrehozásakor 4 MHz-re állítottam. A configurációs regiszterek:
CONFIG :$2007 : 0x3D6A
(#) gthomas válasza gthomas hozzászólására (») Jan 10, 2010 /
 
Oké, megtaláltam oscillátor -> INTRC CLKOUT !! ezzel megy! Köszi !
(#) gthomas válasza m.joco hozzászólására (») Jan 10, 2010 /
 
Szia m.joco!

Olvastam a listán, hogy Te is foglalkoztál a manchester kódolással történő RF adatátvitellel. Most állítottam össze két pic-et, hogy kipróbáljam, hőmérő lesz a végén.

Szóval először - mint Neked is ajánlották - összekötöttem a két pic-et direktben rf nélkül. Nekem a példa program tökéletesen működik. Viszont ha berakom az adót és a vevőt a kijelzőt teleírja '?' karakterekkel. A vevőm az adó kikapcsolása ellenére is vesz valamit, gondolom a házban működhet valamilyen eszköz ezen a frekvencián és innen veszi a zavarjelet. Hogyan lehet kiküszöbölni ezt és elérni hogy csak az én adóm által küldött adatot vegye? Te mire jutottál?
(#) m.joco válasza gthomas hozzászólására (») Jan 10, 2010 /
 
Hello
Nos, több mint egy év után végre sikerült működésre bírni a mikropascal manchester unitját. Rájöttem, hogy az unit igazából egész jó.
A lényeg a helyes szinkronizálás. Ugye a manchester libraryban szerepel a man_receive_init és a man_synchro függvény. Az elsőt meghívjuk, aminek hatására próbál szinkronizálni a vevő az adóval - próbálja megállapítani a vétel bitjének hosszúságát/sebességét. Tehát fontos, hogy eközben az adó sugározzon. Csakhogy az is megtörténhet, hogy a rf vevőmodul által vett "szemét" miatt rosszul szinkronizálódik a vevő. Viszont hiába ad vissza a man_receive_init 0-s értéket (ami azt jelenti, hogy a szinkr. sikeres volt), nem biztos, hogy az adó által sugárzott jelre szinkronizált rá. Itt jött nekem a képbe a man_synchro függvény. Sokáig nem értettem, hogy mire is jó igazából. A Help szerint ez gyakorlatilag ugyanazt csinálja mint a man_receive_init, csak a visszatérő érték sikeres szinkronizálás esetén a manchester bit hosszának a fele 10us-s felbontásban. A Helpben benne van, hogy bithossz 2ms (ezért is 500bps sebességű ez a man. unit), most ha jól számolok, akkor: (2ms/2)/10us = 100. Tehát sikeres man_synchro után ennek a függvénynek 100-as értéket kéne visszaadni, és a vevőnek rá kéne szinkronizálódnia az adóra.
Ezért úgy kezdtem kísérletezni, hogy a vevő pic programjában meghívtam a man_receive_init -et (mert muszály), majd ezután ezt az utasítást adtam: while sync <> 100 do sync := man_synchro();
A sync változó byte típusú, kezdeti értéke 0. Ez így addig hívja meg a man_synchro -t, amíg nem lesz sikeres a szinkronizálás. Sajnos ez sem működött, pedig a próbakor sugárzott az adó is.
Ezután már kezdett felmenni bennem a pumpa . Tettem a vevőre egy 2x16-os LCD-t, és a man_synchro utasítást csak egyszer hívtam meg, és visszaadott értékét kiirattam az LCD-re. Többször is lefuttattam a programot, és nagyot néztem, amikor az LCD-re 43, 44, 46, 47- es értékek íródtak ki. Legtöbbször a 44. Ezután vissza az előbbi while-os utasítás, csak most másképp:
while sync <> 44 do sync := man_synchro();
Az eredmény - tökéletes :yes:
A vevő végtelen ciklusban a man_receive -ot futassa, az adó által minden kisugárzott bájt megjön. Szóval a lényeg a jó szinkronizálás. Kár hogy nem lehetséges a megadni előre, hogy a man_synchro rögtön a 44-re álljon be. A 44 -nek pedig szerintem igazából 50-nek kéne lennie (a mikropascalos fiúk valószínűleg annak a 2ms-nak a felének a felét értik). És hogy miért 44 50 helyett? Szerintem függ ez attól, hogy a vevő pic 4MHz-en teker, az adó pedig 10MHz-en, illetve az rf modulok is lehet, hogy nem pontosan addig sugároznak, amíg magas a bemenetük.
További érdekesség: az adót úgy programoztam be, hogy bekapcsolás után folyamatosan küldje a 255-es byte-ot kb. 1ms - 500ms időközönként (több időt is végigpróbáltam), ekkor kapcsolnám be a vevőt, de amikor a vevő több mint 2 méterre volt az adótól, akkor már nem szinkronizált be. :eek2:
Viszont ha még ennél messzebb is van a vevő, és gombnyomásra küld az adó csak egy-két bájtot, akkor a szinkronizálás sikeres volt. Ezt máig se értem.
Elég hosszúra sikeredett, de szerintem így érthető. Azt ajánlom neked, hogy te is használd a man_synchro utasítást, próbáld valahogy meghatározni, hogy neked mi a jó visszatérő érték.
Persze ilyenkor is vesz a vevő szemetet, de nekem adáskor nem zavart ez be - gondolom maga az adás erősebb. Egy bájt elküldése nekem a köv.: először elmegy 5 db 255-ös bájt, ezután egy 101-es bájt (ez nekem a start jel), majd az ADAT bájt, majd egy ellenőrző bájt, ami az adat bájtnak 255-el történő xor-olása( pl. adat 10010111, akkor az ell. bájt: 01101000). A vevő a 101-es bájt utáni vételt veszi, majd az utána levőt, ha az ellenőrző bájt megfelelő, akkor a vétel helyes. Nekem ez így jól működik. Az egyes elküldött bájtok között persze vannak pár ms-nyi szünetek.
Sok sikert!
Üdv.
(#) gthomas válasza m.joco hozzászólására (») Jan 11, 2010 /
 
Köszi a részletes leírást, akkor kísérletezek! Üdv!
(#) mps hozzászólása Feb 17, 2010 /
 
Sziasztok!
Próbálkozok a pic-kel. És a Pascalozás elején elakadtam. Nem tudom miért nem működik a mellékelt kód, bekötés, hasonlók renben, mert asm-ben villog a led. A proci:18f4550, 20MHz kvarccal. Érdekelne, milyen hibát követtem el.
A válaszokat előre is köszönöm!

ledvill.mpas
    
(#) potyo válasza mps hozzászólására (») Feb 17, 2010 /
 
Így első blikkre a konfigurációs biteket nem tudjuk, hogy hogyan állnak. Illetve az ADCON1 regisztert biztos nullára kell állítani? - bár ez jelen esetben épp nem zavarná a led villogását.
(#) mps válasza potyo hozzászólására (») Feb 17, 2010 / 1
 
Sajna nagyon kezdő vagyok a micropascalban, nem tudom a biteket állítgatni, megnézni, bár kerestem. Viszont WinPic ezt mutatja.
(#) potyo válasza mps hozzászólására (») Feb 17, 2010 / 1
 
Van ott az az Oscillator Selection rész, ott keress olyasmit, hogy Divide by 5 (20MHz input). Vagy a másik lehetőség, hogy az Oscillator alatt keress olyasmit, hogy HS oscillator, PLL disabled. Ezekre állítva égesd be újra és meglátjuk, hogy mi lesz.


Pascalban úgy egyébként mennyire vagy kezdő. Mert ha azt is most tanulnád, akkor inkább tanulj helyette C-t.
(#) mps válasza potyo hozzászólására (») Feb 17, 2010 /
 
Ezt az oszcis részt nem nagyon tudom megoldani, mert nem a WinPicet használom, hanem pk2-őt.
Csak a 2550 beégetéséhez kellett, mert volt egy jdm-em, és véletlen működött egyszer. Pascalt tanultam, és használom is, igaz pc-n. Tudom, hogy a c lenne az igazi, de az nagyon távol van még.
A micropascalban nem lehet állítani a config biteket? Sajnos a súgója ebben nem igen segítőkész.
(#) icserny válasza mps hozzászólására (») Feb 17, 2010 /
 
A VREGEN-t is be kellene billenteni, s a VUSB láb és a földközé egy 470 nF kondenzátor kell.
(#) gozi válasza mps hozzászólására (») Feb 17, 2010 /
 
A config biteket csak akkor lehet állítani, ha projektet hozol létre. Ez esetben a Project menüben az Edit project alatt lehet a konfigurációs biteket beállítani. A 20 megás kvarchoz, ha jól emlékszem, "Oscillator HS: USB-HS" beállítás szükséges, az összes többi bitre elvileg megfelelő a Default.
(#) potyo válasza mps hozzászólására (») Feb 17, 2010 /
 
Pickit2-ben nem lehet állítani a konfig biteket? Illetve ahogy megnyitottad a winpic800-al, úgy ott átállítani és lementeni vele hex-be, majd azt beégetni a pickit2-vel?

Ha a pascal valamennyire megy, akkor mondjuk egyelőre jó, de ne várj tőle túl sokat. Kevesen használják, így kevés a tapasztalat és a segítség vele. Nem olyan nehéz belejönni a C-be, és utána a pascal elég "maradinak" fog tűnni. Én épp vasárnap vettem elő a Delphit 3-4 év után, mert PC programozáshoz még csak azt használtam komolyabban és most nem volt idő elmélyedni másban, de azt kell mondjam, hogy a C jobban kézreáll. Persze ebben közrejátszik az is, hogy azóta csak C stílusú nyelvekben programozok: kontrollereknél C, munkaidőben pedig PHP és Javascript. Nem véletlen lett szinte minden újabb programozási nyelv alapszintaxisa a C
(#) gozi válasza icserny hozzászólására (») Feb 17, 2010 /
 
Valóban, bár ennek a bitnek csak az USB kapcsolat használata esetén van jelentősége.
(#) mps válasza potyo hozzászólására (») Feb 17, 2010 /
 
Köszönöm szépen a segítséget mindenkinek! Azt tettem, hogy winpicben lementettem módosítva, ahogy Potyó írta, és villog
A cvel az a bajom, hogy nem nagyon tudom hol kezdjem, bár a javat és a phpt azt használom én is munkaidőm egy részében, viszont a pic c-t nagyon nem értem, az elejét legalább is, de most az jön. A másik bajom az, hogy nem tudok könyvből tanulni, csak ha elmondják szépen szájbarágósan, és csinálom is közben.
Még egyszer köszi!
(#) Ktulu hozzászólása Feb 19, 2010 /
 
Mikropascal debuggerevel lehet olyant csinalni mint az mplabbal, hogy atugrok bizonyos sorokat? (Set PC to cursor)
Kesz orulet hogy milyen lassu, nem beszelve, ha beragad egy feltetelbe ami nem teljesul. (hogy aztan regisztereket kelljen piszkalni)
(#) icserny válasza Ktulu hozzászólására (») Feb 19, 2010 /
 
Nem nagy tragédia, ha arra készteti a programozót, hogy máskor jobban gondolja át a programot. A triviális hibákat nem hardveres debug-olással kellene felderíteni!
(#) m.joco hozzászólása Ápr 6, 2010 /
 
Hello
Mikropascal SPI Ethernet ENC28J60 unitjával szórakozok mostanában. A példaprogram szuperül működik. Írtam egy saját programot, http kérés esetén megjelenít egy weboldalt, ahol kiírja kérő ip címét, és a weboldal letöltések számát. Ez is jól működik, viszont pár perc után már nem jön be a weboldal. A ENC28J60 ic kissé melegszik, de a példaprogramnál fél óra után is jól bejön a weboldal. Az én kódom kisebb is, mint a példaprogram, nem tudom mi lehet a baj. Így viszont kár rá fejleszteni, ha 10 perc után már nem lehet elérni a weboldalt.
Csatolom a kódomat, én csak a tcp kezelő rutin módosította, az udp maradt.
Itt-ott benne maradtak a példa program megjegyzései a kódban, mivel én ezt írtam át.
Üdv.
(#) zsoltee0001 hozzászólása Máj 10, 2010 /
 
Sziasztok
Adott egy bemenet (12F629, GP4-ös láb);
Hogy tudom leprogramozni azt, hogy ezen 1 másodpercig volt -e jel?
Tehát minimum 1 másodpercig le volt-e nyomva egy gomb.
köszi.
(#) pako válasza zsoltee0001 hozzászólására (») Máj 10, 2010 /
 
If button(GPIO,4,1000)=255 then ...

vagy:

Function jelteszt:boolean;
Var counter:word;
Begin
Counter:=0;
If GPIO.4=1 then
Repeat
inc(counter);
delay_ms(1);
Until (GPIO.4=0) or (counter=1000);
If Counter=1000 then result:=1 else result:=0;
end;
Következő: »»   11 / 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