Hier hatte ich die Aufgabe eine Folientastatur mit einem CPLD so auszuwerten, dass sie von einem Mikrokontroller (Atmel 8bit 16MHz) direkt als Zahlenwerte eingelesen werden kann, dies um den Mikrokontroller in der Rechenzeit zu entlasten.
Auch hier wurde mit einem Altera MAX II EMP240 gearbeitet.
Mit Quartus wurde das Program erstellt. Im Prinzip ist so eine Abfrage recht simple. Man legt eine Spannung nacheinander an die 4 Spalteneingänge und misst ob an einem der 3 Reihenausgänge eine Spanung anliegt. Ist dies der Fall so wurde eine Taste gedrückt. Damit weiß man z.B. erste Spalte erste Reihe = 1te Taste usw. Geht dieser Vorgang zu langsam, wie bei einem kleinen Mikrokontroller eventuell der Fall, so gehen immer wieder Eingaben verloren.
Interessant wird es natürlich sobal die Anzahl der Tasten z.B. auf 5x8 oder größer zunimmt. Beim CPLD bleibt es bei CS_EN, EXTIx als Interuptmeldeleitung und der dem Binärwert entsprechenden Leiteranzahl wie im Beispiel 5x8 =40 = 101000. Was gesamt dann 8 IO's des Mikrokontrollers beanspruchen würde. Anzudenken wäre hier natürlich dann eine Serielle Schnittstelle, was dann z.B. mit einer I2C plus der IRQ Leitung zu 3 IO's führen würde-
Die zwei State Machines wurden mit VHDL geschrieben
fsm_tastatur
--fsm_tastatur in messschaltung
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity FSM_tastatur is
Port (
--rst : IN STD_LOGIC := '0';
clock : IN STD_LOGIC;
EN : IN STD_LOGIC := '0';
row: IN STD_LOGIC_VECTOR(2 DOWNTO 0) := "000" ;
col_nr_in: IN STD_LOGIC_VECTOR(2 DOWNTO 0) := "000" ;
col: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000" ;
--row_bin_out: OUT STD_LOGIC_VECTOR(1 DOWNTO 0) := "00" ;
rowcol_bin_out: OUT STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000" ;
EXTI4 : OUT STD_LOGIC;
--ShiftClock : OUT STD_LOGIC;
clk_out: OUT STD_LOGIC:= '1'
);
end FSM_tastatur;
architecture Verhalten of FSM_tastatur is
signal reg_c: integer range 0 to 4:=0;
signal reg_r: integer range 0 to 12:=0;
--type state_t is (reset, idle, row_act, shift_load, shift_loadin, done);
--signal state : state_t := idle;
--signal en_colcounter: std_logic;
signal nextrun: std_logic := '0';
begin
--read values from row and multiply with col (reg_c)
row_sel: process(row,reg_c)
begin
case row is
when "001" =>
reg_r <=1*reg_c;
when "010" =>
reg_r <=2*reg_c;
when "100" =>
reg_r <=3*reg_c;
when others =>
reg_r <=0;
end case;
end process row_sel;
--read and set values to col and reg_c
col_out: process(col_nr_in,reg_c)
begin
case col_nr_in is
when "001" =>
col <="0001";
reg_c <=1;
when "010" =>
col <="0010";
reg_c <=2;
when "011" =>
col <="0100";
reg_c <=3;
when "100" =>
col <="1000";
reg_c <=4;
when others =>
col <="0000";
reg_c <=0;
end case;
end process col_out;
-- set start / stop (clk_out) scanning row input tht have to stop both dff on the row input
-- put the result from reg_r to output
ausgabe: process(reg_r)
begin
rowcol_bin_out<= std_logic_vector(to_unsigned(reg_r,4));
EXTI4 <= '0';
if (reg_r > 0 and nextrun = '0') then
clk_out <= '0';
EXTI4 <= '1';
elsif nextrun='1' then
clk_out <= '1';
else
clk_out <= '1';
end if;
end process ausgabe;
--switch between enable and disable scanning
restart: process(EN)
begin
if (EN = '1') then
nextrun <= '1';
else
nextrun <= '0';
end if;
end process restart;
end Verhalten;
FSM_tastatur_exti
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity FSM_tastatur_exti is
Port (
--rst : IN STD_LOGIC := '0';
clk : IN STD_LOGIC;
EXTI_IN : IN STD_LOGIC := '1';
row_async_in: in STD_LOGIC_VECTOR(2 DOWNTO 0) := "000";
CS_EN_IN: IN STD_LOGIC := '1';
EXTI_OUT : OUT STD_LOGIC
);
end FSM_tastatur_exti;
architecture Verhalten of FSM_tastatur_exti is
signal exti_in_ok: std_logic :='0';
signal ff1_out : std_logic_VECTOR(2 DOWNTO 0) := "000";
signal sync_out : std_logic_VECTOR(2 DOWNTO 0) := "000";
begin
process
begin -- Einsynchronisieren
EXTI_OUT <= EXTI_IN;
wait until rising_edge(clk);
ff1_out <= row_async_in;
sync_out <= ff1_out;
if (EXTI_IN = '1' and exti_in_ok ='0' ) then
exti_in_ok <='1';
end if;
if (sync_out>"000" and exti_in_ok ='1') then
EXTI_OUT <='1';
elsif (sync_out="000" and CS_EN_IN='1') then
EXTI_OUT <='0';
exti_in_ok <='0';
end if;
end process;
end Verhalten;
Da die angedachte Folien Tasatur jedoch durch ein TFT mit Touchscreen ersetzt wurde gibt es hier derzeit keine weiteren Aktionen.
- Anmelden, um Kommentare verfassen zu können