Kategorie: Programmierung
RSS

8-Bit Shift Register mit Arduino

2015-07-20 von admin

Für eine Steuerung benötigte ich eine Porterweiterung für den Arduino UNO. Ein Schieberegister war die naheliegendste und unkomplizierteste Möglichkeit. Für die Umsetzung habe ich folgende Bauteile verwendet:

  • Arduino UNO
  • 74HC595 Schieberegister

Video

Quellcode

int clockPin = 8;		// SH_CP	shift register clock pin 
int latchPin = 9;		// ST_CP	storage register clock pin (latch pin)	
int dataPin = 10;		// DS		serial data input 
int data = 0;

void setup(){
	pinMode(clockPin, OUTPUT);
	pinMode(latchPin, OUTPUT);
	pinMode(dataPin, OUTPUT);
}

void loop() {
 sendBytes(data);
 data++;

 if(data > 255) {
   data = 0;
 }
}

void sendBytes(int val) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, MSBFIRST, val);
  digitalWrite(latchPin, HIGH);
  delay(1000);
}
Kategorie: Programmierung Schlagwörter:

ATtiny45 Programming Shield für Arduino

2015-05-07 von admin

Für das Programmieren eines ATtiny45 mit einem Arduino muss doch relativ viel verkabelt werden, was schnell in einem unübersichtlichen Kabelsalat enden kann. Eine einfache Möglichkeit, das Chaos zu beherrschen, ist die Erstellung eines Arduino Shields. Mit folgenden Materialien kann ein passendes Shield erstellt werden:

Die Vorderseite des Shields:

arduino shield_attiny_45_85_01

Die Rückseite des Shields:
arduino shield_attiny_45_85_02

Der Vorteil eines Shields ist die Zeitersparnis, da der Fokus ausschließlich auf der Programmierung liegt und nicht auf dem richtigen verkabeln. Die Pins: RESET, 5V, GND, 13, 12, 11 und 10 werden auf dem Arduino Board verwendet.

 

Für eine Schnelltest der Programmlogik habe ich eine Testplatine mit 5 Dioden eingesetzt.

attiny_45_test

Kategorie: Programmierung Schlagwörter: , ,

ATtiny45 mit Arduino programmieren

2015-03-04 von admin

Für eine separate Steuerung wollte ich einen ATtiny45 Chip programmieren.

Folgende Bauteile werden benötigt:

  • ATMEL ATtiny 45
  • Elektrolytkondensator 10uF
  • Arduino UNO

Vorgehensweise

1. Als erstes die Libary attiny von https://github.com/damellis/attiny/ runterladen (Download ZIP).
2. Aus dem ZIP Archiv den Ordner „attiny“ in „/home/username/sketchbook/hardware“ entpacken.
3. Die Arduino IDE beenden und erneut starten.
4. Schaltzeichnung ATtiny 45

ATtiny45-85

6. Als nächstes das Programm ArduinoISP (In-System-Programmer) unter dem Menüpunkt „Datei | Beispiele | ArduinoISP“ auf den Arduino einspielen.

ArduinoISP

7. Danach den Arduino UNO nach dem abgebildeten Schaltplan verkabeln.

Schaltplan

8. Das eigene Programm mit der Arduino IDE öffnen und im Menüpunkt „Tools | Programmer | Arduino as ISP“ wählen.

ArduinoISP2

9. Weiterhin muss unter dem Menüpunkt „Tools | Boards“ der „ATtiny45 (internal 8 MHz clock)“ ausgewählt werden.

ArduinoISP3

10. Als letzten Schritt das eigene Programm uploaden. Wenn die Dioden TX und RX Blinken wird der Upload durchgeführt.

 

Anmerkung

Wenn der Arduino wieder normal verwendet werden soll, muss vorher unter dem Menüpunkt „Tools | Boards“ das Board „Arduino Uno“ gesetzt werden.

Kategorie: Programmierung Schlagwörter: ,

Canvas: Deutschland Flagge

2014-07-14 von admin

Glückwunsch an unsere Nationalmannschaft zum Gewinn der WM 2014.

Flagge

Damit der Browser auch komplett in den drei Farben glänzen kann, gibt es hier die entsprechende Seite dazu.

function mwFlagge() {
	var t = this;
	t.canvas = null;
	t.ctx = null;		//canvas context 
	t.y;

	t.run = function(){
		t.init();
	}

	t.init = function(){
		t.canvas = document.getElementById('main');
		t.calculate();
		t.ctx = t.canvas.getContext('2d');

		window.addEventListener("resize", function(e) {
			e.preventDefault();
			t.resize();
		}, false);

		draw();
	}

	t.calculate = function(){
		t.canvas.width = window.innerWidth;
		t.canvas.height = window.innerHeight;
		t.y = window.innerHeight / 3;		
	}

	t.resize = function() {
		t.calculate();
		draw();
	}

	function draw(){

		t.ctx.beginPath();
		t.ctx.fillStyle = "#000000";
		t.ctx.fillRect(0,0,window.innerWidth,t.y);

		t.ctx.fillStyle = "#DD0000";
		t.ctx.fillRect(0,t.y,window.innerWidth,t.y);

		t.ctx.fillStyle = "#FFCE00";
		t.ctx.fillRect(0,t.y*2,window.innerWidth,t.y*2);

		t.ctx.stroke();
	}
}

Hier gehts zur Live Demo.
Download: Flagge.zip

Kategorie: Programmierung Schlagwörter: , ,

Oracle Apex: User Einstellungen eines Reports löschen

2014-06-01 von admin

Aufgrund eines Implementierungsfehlers in einer selbst geschriebenen Apex Anwendung hat ein Report unter einem bestimmten User nicht mehr wie gewünscht funktioniert. Mit dieser Prozedur werden alle Einstellungen eines Reports für alle aktuell angemeldeten Benutzer gelöscht und das Problem ist gelöst:

CREATE OR REPLACE PROCEDURE reset_report_curr_user_options( p_app_id IN number, 
															p_page_id IN number, 
															p_region_id IN number) 
IS
	l_sort_pref	VARCHAR2 (200);
BEGIN

	l_sort_pref := 'FSP' || p_app_id || '_P' || p_page_id || '_R' || p_region_id || '_SORT';

	for x IN (select distinct USER_NAME from apex_workspace_sessions) loop
		HTMLDB_UTIL.remove_preference (l_sort_pref, x.USER_NAME);
	end loop;

END;
/

Anhand eines Beispiels soll der Vorgang verdeutlicht werden. Bei der Spalte „CUST_FIRST_NAME“ ist die Einstellung Sortieren durch den Anwender gesetzt worden.

Report_with_sort

Mit der Ausführung der Prozedur

reset_report_curr_user_options(65775, 50, 47467819431230753912);

wird diese und alle anderen Einstellungen durch den User gelöscht.

statement_processed

Wenn die Seite mit dem Bericht im Browser aktualisiert wird, dann ist die „fehlende“ Einstellung zu erkennen.

Report_without_sort

Kategorie: Programmierung Schlagwörter: , , , ,

XChat – funny Perl Plugin

2013-11-24 von admin

Ein bisschen Spaß für zwischendurch. Die Idee, wenn ein User in einem IRC Channel das Wort „test“ schreibt, so soll mein User automatisch darauf mit „test failed“ antworten.

Bei dem Script müssen noch die Variablen $l_channel und $l_network angepasst werden.

#!/usr/bin/perl
use strict;
use warnings;
my $version = "1.0";
my $last_response = 0; #time of last response 
my $l_channel = "#DEINCHANNELNAME";
my $l_network = "DEINNETZWERKNAME";

Xchat::register('Mario Test Script', $version, 'Test Script' );
Xchat::print("Loaded Test Script v.$version");
Xchat::hook_print('Channel Message', \&mwTestScript);

sub mwTestScript {
	my $N = Xchat::get_info('network');
    my $C = Xchat::get_info('channel');
	my $nick = $_[0][0];
	my $message = $_[0][1];

	if($message =~ /test/i && $N eq $l_network && $C eq $l_channel){

		#flood protection
		if (time - $last_response < 10) { 
			Xchat::print $nick . ": testscript flood ignore";
			return Xchat::EAT_NONE;
		}

		Xchat::command("MSG " . $l_channel . " test failed");
		$last_response = time;

	}

	return Xchat::EAT_NONE;
}

Die Datei einach unter

/home/DEINUSERNAME/.xchat2/mwTestScript.pl

ablegen. Die Datei wird dann automatisch beim Start von xChat geladen. Alternativ kann das Script mit

/load /home/DEINUSERNAME/.xchat2/mwTestScript.pl

geladen und mit

/unload mwTestScript.pl

deaktiviert werden.

Kategorie: Programmierung Schlagwörter: , , , , ,

Liste aller USB Geräte anzeigen (unter Linux mit C)

2012-11-13 von admin

Mit diesem Beispiel können alle angeschlossenen USB-Geräte, unter Linux, ausgelesen werden.

Das Ergebnis sieht wie folgt aus.

Zum Vergleich, die Ausgabe von dem Befehl lsusb.

Damit das Programm auch kompiliert, wird eine Library benötigt.

Installation der USB Library

sudo apt-get install libusb-dev

Compile

gcc find_usb.c -o find_usb.o -lusb

 

Code

#include <stdio.h>
#include <stdlib.h>
#include <usb.h>

int main()
{

    struct usb_bus *bus;
    struct usb_device *dev;

    usb_init();
    usb_find_busses();
    usb_find_devices();

    for (bus = usb_get_busses(); bus; bus = bus->next)
    {

        printf("Bus %s \n", bus->dirname);

        for (dev = bus->devices; dev; dev = dev->next)
        {
            printf("Device %s vid=%04X, pid=%04X\n", dev->filename,    dev->descriptor.idVendor, dev->descriptor.idProduct);
        }
    }

    return 0;
}

Viel Spaß damit! :)

Kategorie: IT, Programmierung Schlagwörter: , , , , ,

Javascript: find the id and show in the title of the element

2012-05-13 von admin

This script shows the ID, if you move your mouse over the item.

 

function findIDandSetToTitle(obj) {

    //loop over all nodes of the obj
    for (i=0; i<obj.childNodes.length; i++) {

        if (obj.childNodes[i].tagName == "INPUT" && (obj.childNodes[i].type == "text" || obj.childNodes[i].type == "checkbox" || obj.childNodes[i].type == "radio") ||
            obj.childNodes[i].tagName == "SELECT" ||
            obj.childNodes[i].tagName == "TEXTAREA" ||
            obj.childNodes[i].tagName == "A"
            )
        {
            obj.childNodes[i].title = "ID:" + obj.childNodes[i].id;
        }  

    }
}

 

Live Demo: Click
Download Demo: Example_find_ids.zip

jQuery: find parent form and make all textfields inside the form editable

2012-03-03 von admin

This little jQuery script shows a solution for my next challenge.
It should be found, the parent form when the „bearbeiten“ button was pressed.
After that, all the fields inside the form must be editable.

 

Live Demo: Click
Download Demo: Demo_001.zip

$(document).ready(function () {
   $("input:text").attr('disabled', 'disabled');
});

$('input:button[name="bearbeiten"]').click(function() {
   setEditable(this);
});

function setEditable(_this) {

   $(_this).closest("form").find("input:text").each(function(index, elem ) {
      $(elem).removeAttr('disabled');
   });
}

thanks goes to: A.K. ;)

Oracle Datenbank Schema – killall Script

2011-03-15 von admin

Hier mal ein kleines Script für Oracle Datenbanken, mit welchem ein gesamtes Schema „gelöscht“ werden kann.

--
-- killall
--
begin

	-- delete all tables
	for rec_t in (select table_name from sys.USER_TABLES)
	loop
		execute immediate 'DROP table ' || rec_t.table_name ||  ' cascade constraints purge';
	end loop;

	-- delete all sequences
	for rec_s in (select sequence_name from sys.USER_SEQUENCES)
	loop
		execute immediate 'DROP sequence ' || rec_s.sequence_name;
	end loop;

	-- delete all index
	for rec_i in (select index_name from sys.USER_INDEXES)
	loop
		execute immediate 'DROP index ' || rec_i.index_name;
	end loop;

	commit;		

end;

Danke an: C.R. der mich auf die Idee gebracht hat. :)

Kategorie: Programmierung Schlagwörter: , , , ,