Folientastatur 3x4 Matrix

Gespeichert von artbody am Sa., 26.01.2019 - 12:34

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.

bookpics