hackwerk.de erlebnisse eines bastlers

August 22, 2013

UART RX

Filed under: code,fpga — max @ 10:39 pm

empfangsteil eines „software“-uarts:

ACHTUNG: versuch aus der zeit, in der ich mir VHDL erst noch beigebracht habe. 😉

-- uart.vhd
--
--        UART-RX
--
-- erstellt durch maximilian pautsch -> maximilian[at]hackwerk[punkt]de
-- 40MHz clock, 9600 baud, even parity, 8 bit!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY uart_rx IS
    PORT(
    clk: IN std_logic;
    data: OUT std_logic_vector(7 downto 0);
    rx_port: IN std_logic;
    rx_error: OUT std_logic
    );
END uart_rx;

ARCHITECTURE arch OF uart_rx IS

        SIGNAL clk_count:       INTEGER RANGE 0 TO 260;
        SIGNAL bitcount:        INTEGER RANGE 0 TO 10; --wir brauchen 12 bit. das letzte ist force-high

        SIGNAL data_cache:      std_logic_vector(10 downto 0);
        SIGNAL abtastung:       INTEGER RANGE 0 TO 15;
        SIGNAL abtastung_val:   INTEGER RANGE 0 TO 15;

        SIGNAL parity  : std_logic  :='0';
        SIGNAL rx_run: BIT :='0';
        SIGNAL rx_ready: BIT :='0';

BEGIN  

run_check: PROCESS(rx_port,rx_ready)
	BEGIN
        IF rx_port='0' OR rx_ready='0' THEN
            rx_run <= '1';
        ELSE
    	    rx_run <= '0';
        END IF;
END PROCESS run_check;

run_rx: PROCESS (clk, rx_port)
    BEGIN

	IF (clk'event AND clk='1')  THEN
		IF  rx_run='1' THEN
			rx_ready<='0';

            IF clk_count = 260 THEN --- wir tasten jedes bit 16 mal ab!
                clk_count <= 0;
                IF abtastung < 15 THEN
                    abtastung <= abtastung +1;
                    IF rx_port='1' THEN
                        abtastung_val <= abtastung_val +1;
                    END IF;
                ELSE --- ein bit komplett abgetastet!

                    IF abtastung_val < 9 THEN
                        data_cache(bitcount) <= '0';
                    ELSE
                        data_cache(bitcount) <= '1';

                        IF bitcount > 0 AND bitcount < 9 THEN
                            ---- parity-control
                            IF parity='0' THEN
                                parity<='1';
                            ELSE
                                parity<='0';
                            END IF;
                        END IF;
                    END IF;

                    abtastung     <= 0;
                    abtastung_val <= 0;

                    IF bitcount = 10 THEN  -- alles komplett?

                        --- bit 1 ist das startbit und muss 0 sein. dann 8 daten, 1 parity und MINDESTENS 1 stopbit (high)
                        --- 9 muss noch auf parity gecheckt werden:
                        IF  data_cache(0)='0' AND ((data_cache(9)='0' AND parity='0') OR (data_cache(9)='1' AND parity='1')) AND data_cache(10)='1' THEN
                       		rx_error<='0';
                            data <= data_cache(8 DOWNTO 1);
						ELSE
	                       	rx_error<='1';
	                    END IF;

                        -- den ganzen uart_rx zurücksetzen:
	                    rx_ready <='1';
                        bitcount <= 0;
                        parity   <='0';
                    ELSE
                        bitcount <= bitcount+1;
                    END IF;
                END IF;
            ELSE
                clk_count <= clk_count+1;
            END IF;
        END IF;
    END IF;

END PROCESS run_rx;

END arch;

 

UART TX

Filed under: code,fpga — max @ 10:38 pm

sendeteil eines „software“-uarts:
ACHTUNG: versuch aus der zeit, in der ich mir VHDL erst noch beigebracht habe. 😉

-- uart.vhd
--
--        UART-TX
--
-- erstellt durch maximilian pautsch -> maximilian[at]hackwerk[punkt]de
-- 40MHz clock, 9600 baud, even parity, 8 bit!

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY uart_tx IS
    PORT(
    clk: IN std_logic;
    data: IN std_logic_vector(7 downto 0);
    transmit: IN std_logic;

    tx_port: OUT std_logic;
    tx_ready: OUT BIT
    );
END uart_tx;

ARCHITECTURE arch OF uart_tx IS
BEGIN  

run_tx: PROCESS (clk, transmit)
        VARIABLE clk_count: INTEGER RANGE 0 TO 4167;
        VARIABLE bitcount: INTEGER RANGE 0 TO 11; --wir brauchen 12 bit. das letzte ist force-high
        VARIABLE parity  : BIT  :='0';
        VARIABLE tx_run: BIT :='0';
        VARIABLE tx_event: BIT :='1';
    BEGIN

    IF transmit='1' AND transmit'event THEN
        tx_event := '1';
    END IF;
    IF tx_run='1' THEN
    	tx_event := '0';
    END IF;

	IF (clk'event AND clk='1')  THEN
		IF  tx_run='1' OR tx_event='1' THEN
			tx_run:='1';
			tx_ready<='0';

	        IF clk_count = 0 THEN

	            IF bitcount = 0 THEN
	                tx_port <='0';
	            ELSIF bitcount > 0 AND bitcount <9 THEN
	                tx_port <= data(bitcount-1);
	                IF (parity='1' AND data(bitcount-1)='1') OR (parity='0' AND data(bitcount-1)='0') THEN
	                	parity := '0';
	                ELSE
	                	parity := '1';
	                END IF;
	             --   parity := parity XOR data(bitcount-1);
	            ELSIF bitcount = 9 THEN     --parity
	            	IF parity = '1' THEN
	            		tx_port <= '1';
	            	ELSE
	            		tx_port <= '0';
	            	END IF;
	               -- tx_port <= parity;
	            ELSE
	                tx_port <='1';
	            END IF;

	            ----- ist die transmission zu ende? wenn ja: status setzen & für nächstes bit vorbereiten:
	            IF bitcount = 11 THEN
	                tx_ready <= '1';
	                bitcount := 0;
	                tx_run := '0';
	            ELSE
	                bitcount := bitcount +1;
                    -------berechnung des wertes: 40.000.000 / baudrate 
	                clk_count:=4167;  ---so viele clks während einem bit
	            END IF;

	        ELSE
	            clk_count:=clk_count-1;
	        END IF;

	    END IF;
	END IF;
END PROCESS run_tx;

END arch;

alle pdf in ordner durchsuchen

Filed under: code — max @ 10:34 pm

vielleicht findet das ja irgendjemand praktisch 😉
das script sollte alle pdfs in einem ordner nach einem string oder einer regexp durchsuchen und dann ausgeben wo er überall vorkommt!

#!/bin/bash
# searches for given string in pdfs
# usage: findpdf DIR STRING
# or   : findpdf STRING - defalt-dir is: ./

if [ -n "$2" ] ; then
	suche=$2;
	pfad=$1;
else
	if [ -n "$1" ] ; then
		pfad="./";
		suche=$1;
	else
		echo "usage: $0 [path] string"
		exit;
	fi;
fi;

for i in *.pdf;
do
	if pdftotext "$i" - | grep -E "$suche" 1>/dev/null; then
		echo "found string in: $i";
	fi;

done;

automatisches bildschirmdrehen

Filed under: code — max @ 9:58 pm

dieses kleine programm dreht den x11 desktop, der auf einem ibm notebook mit eingebautem beschleunigungs-sensor läft, sobald das notebook gedreht wird. so kann man beispielsweise din4-seiten besser skaliert darstellen und lesen. außerdem isses cool! 😉 wenn man das ganze programm compiled und nach /home/USER/.kde/Autostart/* kopiert, wird es mit jedem kde start ausgeführt! hier das programm:

#include <stdio.h>

int main(){
	int x,y,pos_x;
	int x_cal, y_cal;

	//pos 1= links; 0=mitte ; 2 = rechts
	int pos=0;

	FILE *sensor;

	if(!(sensor=fopen("/sys/devices/platform/hdaps/calibrate", "r"))){
		printf("nkonnte den sensor nicht finden. breche ab!n");
		return 1;
		}
	fscanf(sensor, "(%d,%d)", &x_cal, &y_cal);
	fclose(sensor);

	for(;;){
		sensor = fopen( "/sys/devices/platform/hdaps/position", "r" );

		if(!sensor){
			printf("nkonnte den sensor nicht finden. breche ab!n");
			return 1;
			}

		fscanf(sensor, "(%d,%d)", &x, &y);
		//printf("n %i %i",x-x_cal,y-y_cal);

		fclose(sensor);

		pos_x=x-x_cal;
		if(pos_x>130 && pos!=1){
			pos=1;
			system("xrandr -o right");
			}
		else if(pos_x<-130 && pos!=2){
			pos=2;
			system("xrandr -o left");
			}
		else if(pos!=0 && pos_x>-130 && pos_x<130){
			pos=0;
			system("xrandr -o normal");
			}
		usleep(50000);
		}
	}

 

Powered by WordPress