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   5 / 29
(#) hajos.norbert hozzászólása Dec 2, 2008 /
 
Sziasztok.

Adott egy 18F452 és egy 16F876A. I2C-n szeretném működésre bírni. A 16F felé tudok adatot küldeni, ellenkező irányba nem akar menni a dolog.

18F452 kódrészlete:
  1. I2C_Start;
  2.   I2C_Wr($F8); //Cím
  3.   I2C_Wr(0); //Parancs
  4.                
  5.   I2C_Repeated_Start;
  6.   I2C_Wr($F8); //Cím
  7.   I := I2C_Rd(1);
  8.                
  9.   I2C_Stop;


16F kódjai:
  1. Procedure I2SlaveInit();
  2.  begin
  3. SSPCON := %00010110;           //Slave Mode
  4. ClearBit(SSPSTAT, CKE);         //Disable SMBus specific inputs
  5. SPADD := %11111000;
  6. SetBit(SSPCON, SSPEN);         //MSSP-Modul enable
  7. end;
  8.  
  9. Procedure WaitForPIR1SSPIFset;
  10.      //Waits till interrup flag PIR1,SSPIF is set
  11.  begin
  12.      repeat
  13.      until TestBit(PIR1, SSPIF) = 1;
  14.  end; //WaitforPIR1SSPIFset
  15.  
  16. Function ReceiveByteI2C: Byte;
  17.      //Receives one byte via I2C
  18.      //Clock is held LOW after receive (must be manually released by other code)
  19.      
  20.  begin
  21.      SetBit(SSPCON, CKP);           //Release clock
  22.      WaitForPIR1SSPIFset;
  23.      Result := SSPBUF;
  24.      ClearBit(PIR1, SSPIF);          //Clear interrupt flag
  25.  end; //ReceiveByteI2C
  26.  
  27. Procedure SendByteI2C(TByte: Byte);
  28.      //Sends the byte in TByte via I2C
  29.      
  30.  begin
  31.      repeat
  32.      until TestBit(SSPSTAT, BF) = 0;  //Wait for empty buffer
  33.      NOP;
  34.      NOP;
  35.      NOP;
  36.      //NOP;                           //Use 6 NOP for 40MHz, 3 for 20MHz
  37.      //NOP;                           //Don’t ask me why, but it does not
  38.      //NOP;                           //work without the NOPs.
  39.  
  40.      SSPBUF := TByte;                   //Put TByte in buffer
  41.      NOP;
  42.      NOP;
  43.      NOP;
  44.      //NOP;                           //Use 6 NOP for 40MHz, 3 for 20MHz
  45.      //NOP;
  46.      //NOP;
  47.  
  48.      SetBit(SSPCON, CKP);            //Release the clock. This actually starts the transmission.
  49.      WaitForPIR1SSPIFset;
  50.      ClearBit(PIR1, SSPIF);           //Clear interrupt flag
  51.  end; //SendByteI2C

És maga a főprogramrész:
[code"=c]
If TestBit(PIR1, SSPIF) = 1 then begin
//Nekünk címeztek valamit
I := SSPBUF; //Get rid of Address
ClearBit(PIR1, SSPIF);
CommandByte := ReceiveByteI2C;
If CommandByte = CMD_GETSTATUS then begin
SetBit(SSPCON, CKP); //Release clock
WaitForPIR1SSPIFset; //Wait for RepeatStart
I := SSPBUF; //Get rid of Address
ClearBit(PIR1, SSPIF);

SendByteI2C(10); //OK

ClearBit(PIR1, SSPIF); //Clear interrupt flag
SetBit(SSPCON, CKP);
end;
[/code]
Hol szúrom el a dolgot?

Segítségeteket előre is köszönöm!
(#) Istike88 hozzászólása Dec 19, 2008 /
 
Sziasztok!

Az volna a kérdésem hogy az alábbi hibákat miért kapom mikor próbálom lefordítani? Még nem teszt jelleggel fordítom, csak szintaktika miatt. Csináltam új projektet, beállítottam 8MHz-vel ATiny45-öt.

hiba.JPG
    
(#) Istike88 válasza Istike88 hozzászólására (») Dec 19, 2008 /
 
megoldódott nem soft spi out hanem soft spi write

Csak azt nem értem hogy ez miért nem megy atiny45-el? át állítom Atmega8ra és lefordul simán de ha Atiny45ön van akkor sok kódot mintha nem ismerne
(#) Istike88 hozzászólása Jan 3, 2009 /
 
Sziasztok!

Hogy lehet mikropascalban balra shiftelést végezni egy byte-on?

Próbálkoztam az SHL függvénnyel de azt írja hibának hogy SHL was not declared

Pedig még autómatikusan kiemeli kék színnel :nemtudom:

Előre is köszi!
(#) kobold válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Ha mindegy neki a kis- és nagybetű (azaz nem shl kellene), akkor lehagytad, hány bittel léptessen, pl.:
Idézet:
var1 := var2 shl 2”
--> ez két bitet léptet.
(#) Istike88 válasza kobold hozzászólására (») Jan 3, 2009 /
 
Megmentőm vagy! Köszönöm szépen!

Én úgy emlékeztem hogy így működik: Shl(data);

A te verziód működik!

Üdv
(#) Istike88 hozzászólása Jan 3, 2009 /
 
Ismét én!

Írtam egy programot mikropascalban nokia 3410 lcd vezérlésre, de sehogy sem akar működni! Mellékelem a forrás kódot, hátha találtok benne olyat amit én nem vettem észre.

Az egészet egy C program forráskódjának az átírásával csináltam, vagyis nem saját kútfő.

A kijelző meg se akar mukkanni. Attiny 45-el próbáltam.
Kínomban már egy ledet kötöttem az SCK lábra hogy figyeljem van-e órajel, de az se világított!
(#) Istike88 válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
hopsz! nem csatoltam a fájlt

nokialcd.txt
    
(#) icserny válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Az adatbitek kiküldésének az időzítését nem látom benne. Milyen tempóban tudja a kijelző fogadni az adatokat, s hogyan akarod a kiküldés sebességét korlátozni?
(#) kobold válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Az már elsőre is biztos, hogy a kijelző Reset lába alacsony szinten marad, vagyis állandó Reset-ben van, úgy nem is ír ki semmit.
Az Attiny-t nem ismerem, abban nincs olyan, hogy a portok irányát (ki / bemenet) be kell állítani? vagy ez volna a
Idézet:
„ddrb:=$FF;”
? Ha igen, jó ez az érték? Már csak azért, mert ha kivezérlés sincs, talán valami ilyesmi hiányzik még.
(#) abalazs válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Nemtudom hogy a 3410-nek milyen kijelzője van, én a 3310, 5110-esét próbáltam már. Van hozzá egy komplett bekötési rajzom, és egy forrás, amit a zippben megtalálsz. Egy próbapanelen szinte mindig ezt a kijelzőt használom ha látnom kell az infókat a fejlesztés alatt. Remélem hasznát veszed.
(#) Istike88 válasza icserny hozzászólására (») Jan 3, 2009 /
 
Helló!

Ezen a részen is elgondolkoztam, láttam néhány c forrás kódot de azon se láttam olyat. Valahol mint ha azt olvastam volna hogy a kijelző 4Mbit/s sebességgel képes fogadni az adatokat!
(#) Istike88 válasza kobold hozzászólására (») Jan 3, 2009 /
 
úgyhiszem jó az érték, ez állítja kimenetnek a portját. A resetet közben én is észre vettem és javítottam. sőt kipróbáltam azt hogy nem így adok értéket egy lábnak:

pinb4:=1;

hanem

setbit(portb,4);

De így se semmi, kivéve hogy mostmár látom a leden az órajelet.
(#) Istike88 válasza abalazs hozzászólására (») Jan 3, 2009 /
 
Ugyan az a kijelzője van, csak nagyobb felbontású, de a vezérlő ic ugyanaz benne!

Nagyon szépen köszönöm a forrást! Szerintem ezzel sikerül már valamire jutnom!

Üdv
(#) kobold válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Amikor lefordítod, készít belőle asm file-t? Ha igen, azt lehetne még megnézni, hogy alakul benne a kódod.
Közben azon gondolkodom, ott van pl. ez a rész:
  1. Procedure write_dorc(data:byte);
  2. var i,data2:byte;
  3. Begin
  4.   for i:=8 downto 0 do
  5.     Begin
  6.       SCLK:=0;
  7.       if ((data and $80)=0) then
  8.         SDA:=0
  9.       else
  10.         SDA:=1;
  11.       SCLK:=1;
  12.       data:=data shl 1;
  13.     End;
  14. End;

Helyet foglal data2-nek, de nem is használja; szimulátorban megnézted, hogy a balra léptetésnél tényleg léptet-e? Ha nem, akkor azért, mert a függvény paraméterét nem módosíthatja (pl. basic esetében az érték szerint átadott változók ilyenek). És akkor talán a rutin elején egy
Idézet:
„data2 := data”
sor, majd a data2 használata szükséges.
(#) Istike88 válasza kobold hozzászólására (») Jan 3, 2009 /
 
Igen, csinál asm fájlt, csatoltam is.

Bár asm-hez nem konyítok.

a data2 azért volt ott mert elősször abba akartam tárolni a shiftelt fájlt, de úgy gondoltam egyszerűbb ha a saját helyére számoltatom ki azaz a data-ba, a data2 megmaradt véletlen.

Hogy sikerül e a shift azt nem tudom, mert nem tudtam rendesen megnézni a watch-al. Turbo pascalban kicsit máshogy volt

Nem mutatta hogy mikor ugrik erre az eljárásra, pedig a write_data eljárással az is meg volt hívva a főprogramban.
Annyit tudtam kivenni belőle hogy: data: inaccessible
(#) kobold válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Tegyél töréspontot (breakpoint) a függvényre, akkor megáll a programvégrehajtás a szimulátorban, és utána lépésenként át tudod nézni, mi történik. Kicsit ismerkedni kell a debug lehetőségeivel.
(#) El_Pinyo válasza Istike88 hozzászólására (») Jan 3, 2009 /
 
Szia!
Esetleg még megpróbálhatnád azt is, hogy a write_dorc és a write_cmd eljárásokat nem érték, hanem változó paraméterekkel paraméterezed.
Tehát amire gondolok:
  1. Procedure write_dorc(var data:byte);

...
  1. Procedure write_cmd(var cmd:byte);

...
Üdv.
(#) Istike88 válasza kobold hozzászólására (») Jan 3, 2009 /
 
Megvan! Sikerül neki shiftelni, és úgy nézem hogy jó is a végeredmény, majd még átfutok rajta meg azon is ahonnan írtam az egészet.

Akkor tépném csak a hajamat ha kiderülne hogy a kijelző a rossz!

Jaja, van még mit tanulnom ezért járok ide

üdv
(#) wangi hozzászólása Jan 4, 2009 /
 
Hello!Udv mindenkinek!Segitseget kernek
"MikroPascal V.8.001" ugyben,valami javito progira lenne szuksegem...Elore is kosz!
(#) hajos.norbert válasza hajos.norbert hozzászólására (») Jan 4, 2009 /
 
Megvan az error

Íráskor és olvasáskor máshogy kell megcímezni a slave-t
(#) pako válasza Istike88 hozzászólására (») Jan 4, 2009 /
 
Üdv!
Észrevettem egy hibát a kódodban.

Idézet:
„Procedure write_dorc(data:byte);
var i,data2:byte;
Begin
for i:=8 downto 0 do
Begin
SCLK:=0;
if ((data and $80)=0) then
SDA:=0
else
SDA:=1;
SCLK:=1;
data:=data shl 1;
End;
End;”


Ha a for ciklus 8-tól megy 0-ig, az 9 bitet jelent. Helyesen 7-től kell mennie 0-ig.
Én így csináltam volna:

Procedure write_dorc(data:byte);
var i:byte;
Begin
for i:=7 downto 0 do
Begin
SCLK:=0;
if data.i=0 then
SDA:=0
else
SDA:=1;
SCLK:=1;
End;
End;
(#) Istike88 válasza El_Pinyo hozzászólására (») Jan 4, 2009 /
 
Helló!

Ez sajnos nem jött be, nem enged konstans értéket beírni!
(#) Istike88 válasza pako hozzászólására (») Jan 4, 2009 /
 
Helló!

Igaz, át is írtam hogy 7-0ig menjen. És ez a data.i megoldás is egyszerűbbé teszi a dolgot! De van még egy problémám!

Ha így akarom megváltoztatni a kimenet értékét hogy pl: SCLK:=1;

Akkor az nem működik, de ha ezt:
setbit(portb,3);

írom akkor ugyan beáll a kimenet, de szerintem a
clearbit(portb,3);

nem csinál semmit ha utána meghívom

Nem lehet hogy valami regiszterrel kellene szórakozni hogy menjen?
(#) pako válasza Istike88 hozzászólására (») Jan 5, 2009 /
 
Atmelekhez nagyon nem értek még. Próbáld meg ASM parancsokkal kapcsolgatni a lábakat. Megnéztem az adatlapját ennek az atmel csodabogárnak , szerintem próbáld ki ezt:
setbit helyett:
Asm
SBR PortB,3
end;
clearbit helyett:
Asm
CBR PortB,3
end;
Ha nem lesz jó, akkor passzolom
(#) pako válasza pako hozzászólására (») Jan 5, 2009 /
 
Az adatlap szerint a szerint a DDRB regiszter 6. és 7. bitje csak olvasható, próbáld meg $FF helyett $3F-re állítani. Nem biztos hogy segít, de egy próbát megér.

Ezzel kapcsolatban akár kérdezhetsz az http://www.hobbielektronika.hu/forum/topic_861.html témában is
(#) lgyk hozzászólása Jan 5, 2009 /
 
Hi!

mikroPascalban írogatok egy programot, nagy része működik, de van pár problémám:

- A DS1820-as szenzorral kommunikál (azonosítókat beolvassa, kiküldi, de valamiért a szenzor nem válaszol, vagy a kontroller hibásan dolgozza fel.

- RS-232 porton keresztül nem hajlandó kommunikálni...

A segítséget előre is köszi!

A forrás:

-----

Még egy pár kiegészítés: a szenzorok (1-Wire) a PORTA.0-n vannak, a nyomógombok a megfelelő (bemenetre állított) portokon. Az LCD része, nyomógobmkezelés, szenzoradatok beolvasása tökéletesen működik... A mikrovezérlő PIC16F877 20/P (HS 20,000 MHz).
(#) hajos.norbert válasza lgyk hozzászólására (») Jan 5, 2009 /
 
Szia!

http://users.edpnet.be/rosseel01/DRO/PIC/index.htm

Itt foglalkoznak a dologgal. Van hozzá valami LIB is
(#) lgyk válasza hajos.norbert hozzászólására (») Jan 5, 2009 /
 
Köszi, megnézem!
(#) ha1drp válasza lgyk hozzászólására (») Jan 5, 2009 /
 
Én első rápillantásra két dolgot látok:

Usart_Init(4800); - kivenném a ciklusból, mert nem valószínű, hogy pár uS alatt - a lekérésig jönne be adat.

Lehet, hogy rosszul emlékszem de a szenzornak kevés a 100mS mérési idő.
Következő: »»   5 / 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