|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2105 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Ned Mar 14, 2010 11:38 am Naslov sporočila: VHDL-I/O bus |
|
|
Pozdravljeni!
Zanima me, kako v VHDLju berem I/O pin, ki je definiran kot vhod/izhod vektor? Namreč isti pin bi enkrat uporabil kot izhod, drugič kot vhod.
Prosim za kakšen primer kode... _________________ Denis |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.20 Kraj: Kranj - struževo
|
Objavljeno: Ned Mar 14, 2010 12:13 pm Naslov sporočila: |
|
|
Kot izhod mu lahko definiraš vrednosti '1' ali '0' ali 'Z'. Z = HiZ = tristate oziroma izklopljen izhodni driver in je pin vhod.
Ko hočeš prebrat vrednost, mu prirediš izhodno vrednost 'Z' in ga prebereš. Seveda pa mora bit pin in priključen signal definiran kot inout.
Delujoč primer kode lahko dobiš v ponedeljek. Sicer sta pa samo dve vrstici _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2105 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Ned Mar 14, 2010 3:40 pm Naslov sporočila: |
|
|
Mišljeno je bilo nekako tako, da se nastavi vsem vhodom pull-up oziroma pull-down upore (preklop s pin7), nato pa se po en pin nastavi na '0' oziroma '1' in preverja stanje na ostalih vhodnih pinih.
Koda: |
----- ----- -0 1 2 3 4 5 6 7
--0-- -- 01 02 03 04 05 06 UU
--1-- 10 -- 12 13 14 15 16 UU
--2-- 20 21 -- 23 24 25 26 UU
--3-- 30 31 32 -- 34 35 36 UU
--4-- 40 41 42 43 -- 45 46 UU
--5-- 50 51 52 53 54 -- 56 UU
--6-- 60 61 62 63 64 65 -- UU
--7-- DD DD DD DD DD DD DD --
-- pin7 preklaplja uporovno verigo med PULL-UP in PULL-DOWN
TIPKOMAT: process (clk) -- Bere TIPKE
--ioTipke : inout STD_LOGIC_VECTOR (7 downto 0); -- 42 Tipk na 8 io pinih
begin
if clk'event and clk='1' then
-- PULL DOWN POLJE
if (StanjeTipk = "0001") and (CasCikla = "0010000000000") then
ioTipke <= "0ZZZZZZ1"; -- pin7=pull-down , pin0='1', ostali so vhodi
if ioTipke(1)='1' and Servo01 > "00000000" then
Servo01 <= Servo01 - ServoH; -- zmanjša čas servo impulza
ServoxxHd <= Servo01; -- Uravnava velikost ServoH, da Servo-- ne pade pod 000
PrikazD <= "00001"; -- Servo motor st.: 01
elsif ioTipke(2)='1' and Servo02 > "00000000" then
Servo02 <= Servo02 - ServoH;
ServoxxHd <= Servo02;
PrikazD <= "00010"; -- Servo motor st.: 02
elsif ioTipke(3)='1' and Servo03 > "00000000" then
Servo03 <= Servo03 - ServoH;
ServoxxHd <= Servo03;
PrikazD <= "00011"; -- Servo motor st.: 03
elsif ioTipke(4)='1' and Servo04 > "00000000" then
Servo04 <= Servo04 - ServoH;
ServoxxHd <= Servo04;
PrikazD <= "00100"; -- Servo motor st.: 04
elsif ioTipke(5)='1' and Servo05 > "00000000" then
Servo05 <= Servo05 - ServoH;
ServoxxHd <= Servo05;
PrikazD <= "00101"; -- Servo motor st.: 05
elsif ioTipke(6)='1' and Servo06 > "00000000" then
Servo06 <= Servo06 - ServoH;
ServoxxHd <= Servo06;
PrikazD <= "00110"; -- Servo motor st.: 06
else --- Ostane nespremenjeno
Servo01 <= Servo01;
Servo02 <= Servo02;
Servo03 <= Servo03;
Servo04 <= Servo04;
Servo05 <= Servo05;
Servo06 <= Servo06;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
if StanjeTipk = "0010" and (CasCikla = "0010000000000") then
ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi
if ioTipke(2)='1' and Servo07 > "00000000" then
Servo07 <= Servo07 - ServoH;
ServoxxHd <= Servo07;
PrikazD <= "00111";
elsif ioTipke(3)='1' and Servo08 > "00000000" then
Servo08 <= Servo08 - ServoH;
ServoxxHd <= Servo08;
PrikazD <= "01000";
elsif ioTipke(4)='1' and Servo09 > "00000000" then
Servo09 <= Servo09 - ServoH;
ServoxxHd <= Servo09;
PrikazD <= "01001";
elsif ioTipke(5)='1' and Servo10 > "00000000" then
Servo10 <= Servo10 - ServoH;
ServoxxHd <= Servo10;
PrikazD <= "01010";
elsif ioTipke(6)='1' and Servo11 > "00000000" then
Servo11 <= Servo11 - ServoH;
ServoxxHd <= Servo11;
PrikazD <= "01011";
else --- Ostane nespremenjeno
Servo07 <= Servo07;
Servo08 <= Servo08;
Servo09 <= Servo09;
Servo10 <= Servo10;
Servo11 <= Servo11;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
if StanjeTipk = "0011" and (CasCikla = "0010000000000") then
ioTipke <= "0ZZZZ1ZZ"; -- pin7=pull-down , pin2='1', ostali so vhodi
if ioTipke(3)='1' and Servo12 > "00000000" then
Servo12 <= Servo12 - ServoH";
ServoxxHd <= Servo12;
PrikazD <= "01100";
elsif ioTipke(4)='1' and Servo13 > "00000000" then
Servo13 <= Servo13 - ServoH;
ServoxxHd <= Servo13;
PrikazD <= "01101";
elsif ioTipke(5)='1' and Servo14 > "00000000" then
Servo14 <= Servo14 - ServoH;
ServoxxHd <= Servo14;
PrikazD <= "01110";
elsif ioTipke(6)='1' and Servo15 > "00000000" then
Servo15 <= Servo15 - ServoH;
ServoxxHd <= Servo15;
PrikazD <= "01111";
else --- Ostane nespremenjeno
Servo12 <= Servo12;
Servo13 <= Servo13;
Servo14 <= Servo14;
Servo15 <= Servo15;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
if StanjeTipk = "0100" and (CasCikla = "0010000000000") then
ioTipke <= "0ZZZ1ZZZ"; -- pin7=pull-down , pin3='1', ostali so vhodi
if ioTipke(4)='1' and Servo16 > "00000000" then
Servo16 <= Servo16 - ServoH;
ServoxxHd <= Servo16;
PrikazD <= "10000";
elsif ioTipke(5)='1' and Servo17 > "00000000" then
Servo17 <= Servo17 - ServoH;
ServoxxHd <= Servo17;
PrikazD <= "10001";
elsif ioTipke(6)='1' and Servo18 > "00000000" then
Servo18 <= Servo18 - ServoH
ServoxxHd <= Servo18;
PrikazD <= "10010";
else --- Ostane nespremenjeno
Servo16 <= Servo16;
Servo17 <= Servo17;
Servo18 <= Servo18;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
--- PULL DOWN POLJE ima še 3 proste tipke za ostale funkcije
---------------------------------------------------------------------
---------------------------------------------------------------------
-- PULL UP POLJE
if (StanjeTipk = "1001") and (CasCikla = "0010000000000") then
ioTipke <= "1ZZZZZZ0"; -- pin7=pull-up , pin0='0', ostali so vhodi
if ioTipke(1)='0' and Servo01 < "11111111" then
Servo01 <= Servo01 + ServoH; -- poveča čas servo impulza
ServoxxHd <= Servo01; -- Uravnava velikost ServoH, da Servo-- ne gre čez 255
PrikazD <= "00001"; -- Servo motor st.: 01
elsif ioTipke(2)='0' and Servo02 < "11111111" then
Servo02 <= Servo02 + ServoH;
ServoxxHd <= Servo02;
PrikazD <= "00010"; -- Servo motor st.: 02
elsif ioTipke(3)='0' and Servo03 < "11111111" then
Servo03 <= Servo03 - ServoH;
ServoxxHd <= Servo03;
PrikazD <= "00011"; -- Servo motor st.: 03
elsif ioTipke(4)='0' and Servo04 < "11111111" then
Servo04 <= Servo04 + ServoH;
ServoxxHd <= Servo04;
PrikazD <= "00100"; -- Servo motor st.: 04
elsif ioTipke(5)='0' and Servo05 < "11111111" then
Servo05 <= Servo05 + ServoH;
ServoxxHd <= Servo05;
PrikazD <= "00101"; -- Servo motor st.: 05
elsif ioTipke(6)='0' and Servo06 < "11111111" then
Servo06 <= Servo06 + ServoH;
ServoxxHd <= Servo06;
PrikazD <= "00110"; -- Servo motor st.: 06
else --- Ostane nespremenjeno
Servo01 <= Servo01;
Servo02 <= Servo02;
Servo03 <= Servo03;
Servo04 <= Servo04;
Servo05 <= Servo05;
Servo06 <= Servo06;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
elsif StanjeTipk = "1010" and (CasCikla = "0010000000000") then
ioTipke <= "1ZZZZZ0Z"; -- pin7=pull-up , pin1='0', ostali so vhodi
if ioTipke(2)='0' and Servo07 < "11111111" then
Servo07 <= Servo07 + ServoH;
ServoxxHd <= Servo07;
PrikazD <= "00111";
elsif ioTipke(3)='0' and Servo08 < "11111111" then
Servo08 <= Servo08 + ServoH;
ServoxxHd <= Servo08;
PrikazD <= "01000";
elsif ioTipke(4)='0' and Servo09 < "11111111" then
Servo09 <= Servo09 + ServoH;
ServoxxHd <= Servo09;
PrikazD <= "01001";
elsif ioTipke(5)='0' and Servo10 < "11111111" then
Servo10 <= Servo10 + ServoH;
ServoxxHd <= Servo10;
PrikazD <= "01010";
elsif ioTipke(6)='0' and Servo11 < "11111111" then
Servo11 <= Servo11 + ServoH;
ServoxxHd <= Servo11;
PrikazD <= "01011";
else --- Ostane nespremenjeno
Servo07 <= Servo07;
Servo08 <= Servo08;
Servo09 <= Servo09;
Servo10 <= Servo10;
Servo11 <= Servo11;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
elsif StanjeTipk = "1011" and (CasCikla = "0010000000000") then
ioTipke <= "1ZZZZ0ZZ"; -- pin7=pull-up , pin2='0', ostali so vhodi
if ioTipke(3)='0' and Servo12 < "11111111" then
Servo12 <= Servo12 + ServoH";
ServoxxHd <= Servo12;
PrikazD <= "01100";
elsif ioTipke(4)='0' and Servo13 < "11111111" then
Servo13 <= Servo13 + ServoH;
ServoxxHd <= Servo13;
PrikazD <= "01101";
elsif ioTipke(5)='0' and Servo14 < "11111111" then
Servo14 <= Servo14 + ServoH;
ServoxxHd <= Servo14;
PrikazD <= "01110";
elsif ioTipke(6)='0' and Servo15 < "11111111" then
Servo15 <= Servo15 + ServoH;
ServoxxHd <= Servo15;
PrikazD <= "01111";
else --- Ostane nespremenjeno
Servo12 <= Servo12;
Servo13 <= Servo13;
Servo14 <= Servo14;
Servo15 <= Servo15;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
end if;
elsif StanjeTipk = "1100" and (CasCikla = "0010000000000") then
ioTipke <= "1ZZZ0ZZZ"; -- pin7=pull-up , pin3='0', ostali so vhodi
if ioTipke(4)='1' and Servo16 < "11111111" then
Servo16 <= Servo16 + ServoH;
ServoxxHd <= Servo16;
PrikazD <= "10000";
elsif ioTipke(5)='1' and Servo17 < "11111111" then
Servo17 <= Servo17 + ServoH;
ServoxxHd <= Servo17;
PrikazD <= "10001";
elsif ioTipke(6)='1' and Servo18 < "11111111" then
Servo18 <= Servo18 + ServoH
ServoxxHd <= Servo18;
PrikazD <= "10010";
else --- Ostane nespremenjeno
Servo16 <= Servo16;
Servo17 <= Servo17;
Servo18 <= Servo18;
ServoxxHd <= ServoxxHq;
NiTipk <= '1';
end if;
--- PULL UP POLJE ima še 3 proste tipke za ostale funkcije
else
ioTipke <= "00000000"; -- pin7=pull-down , ostali so izhodi
ServoxxHd <= ServoxxHq; -- Ostane
NiTipk <= '0'; -- Nobena tipka ni pritisnjena
PrikazD < PrikazQ ; -- Ostane
end if;
end process; |
Gre se za osnovni pristop do 'Z'. Je pravi?
Če bo to delalo, je možno priklopiti 42 tipk na 8 pinov. (56 na 9 , ... ; (n-1)*(n-2) na n pinov). PIC to zmore, a ne zmore 8-bitno (256 korakov od 1,5ms do 2,5ms) poganjati 18 modelarskih servomotorjev hkrati . _________________ Denis |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.20 Kraj: Kranj - struževo
|
Objavljeno: Ned Mar 14, 2010 6:30 pm Naslov sporočila: |
|
|
Koda: |
ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi |
To je za vhode v redu, ja. Na pinu 7 ni pull-down ampak je izhod in logična ničla.
Če hočeš krmiliti pull-up/-down upore, jih moraš zunaj zmontirat in krmilit z enim dodatnim pinom.
Upore se sicer definira pri definicijah, kater port gre na kater fizični pin čipa. Opcija je sicer tudi "Keeper" poleg uporov. Ampak to se definira pri prevajanju / programiranju in ne moreš spreminjat med samim delovanjem.
Ni mi sicer čisto jasno, kaj si skodiral tu (po pravici se tudi nisem prav dosti poglabljal), ampak za tipke moraš imeti tudi debounce rutino. Če imaš matrično tipkovnico, pa rabiš malo trikov, da ne delaš vseh 48 registrov _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2105 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Ned Mar 14, 2010 7:50 pm Naslov sporočila: |
|
|
aly je napisal/a: |
Koda: |
ioTipke <= "0ZZZZZ1Z"; -- pin7=pull-down , pin1='1', ostali so vhodi |
To je za vhode v redu, ja. Na pinu 7 ni pull-down ampak je izhod in logična ničla.
Če hočeš krmiliti pull-up/-down upore, jih moraš zunaj zmontirat in krmilit z enim dodatnim pinom. |
Ja, saj tako je narejeno. Pin 7 je priklopljen na skupni pin od uporovne verige. Ko ga dam na '0', se upori v uporovni verigi obnašajo kot pull-down upori ostalim vhodom. Ko ga dam na '1', se obnašajo kot pull-up upori.
Citiram: |
Ni mi sicer čisto jasno, kaj si skodiral tu (po pravici se tudi nisem prav dosti poglabljal), ampak za tipke moraš imeti tudi debounce rutino. Če imaš matrično tipkovnico, pa rabiš malo trikov, da ne delaš vseh 48 registrov |
Gre za matrično tipkovnico 7x7, pri čemer so pini za vrstice skupni pinom za stolpce. Zato je možnih 42 tipk, saj ni možno preveriti istega stolpca in vrstice med seboj.
Vhode dam na pull-down, izmenoma po en stolpec na '1' in preverjam, na katerem vhodu je '1' (neaktivni stolpci so dolpovlečeni na '0').
Vhode dam na pull-up, izmenoma po en stolpec na '0' in preverjam, na katerem vhodu je '0' (neaktivni stolpci so gorpovlečeni na '1').
Debounce je sočasno rešen s tistim ServoH (ga izračunam drugje), ki je "00000000" če tipka ni dovolj dolgo pritisnjena. Funkcija tipk ni tako kritična, da to ne bi zadostovalo. _________________ Denis |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|