philipp-kolb.net - Philipp Kolb Pforzheim: Projekte / HiFi / Beschallungs- und Lichttechnik / Photografie und mehr...

 

Programmierung


Desktopanwendungen entwickle ich bevorzugt mit Qt, Delphi / Turbo Pascal oder Visual Basic.
Ich behersche u.a. die Programmiersprachen: C/C++, Turbo Pascal, Visual Basic, Assembler,
die HW-Beschreibungssprachen: ABEL, VHDL,
die Scriptsprachen: Phyton, PHP, Java Script / AJAX,
die Auszeichnungssprachen HTML 4.01 & XHTML strict.

Windows Desktop Anwendungen:

- Sicheres Löschen von Daten Final Destroy
- Digitale Modellbahn Steuerung SRCP-Client zum Steuern von Digital Lokomotiven ohne Interface
- HDD Anti Spin Down Download Die .exe Datei in den Autostartordner kopieren, Laufwerke auswählen, Fertig.

ACHTUNG: Durch herunterladen und ausführen der Dateien erkennen Sie an, das ich keinerlei Haftung für etwaige durch den Gebrauch der Software entstandenen Schäden übernehme!

Schnittstellen Tools

- Hidden Capture Socket

QT Klassen

- QT Klasse zur Kapselung von QSettings

AVR GCC C CODE Excerpts

Eigentlich triviale Dinge, die man aber nicht gleich immer griffbereit hat...

AVR ATMEGA 32 / 16 @ 8 MHZ: 8 Bit ADC Routine

  ADCSRA = 0b10000110; // AD eingeschaltet, jetzt nicht messen,no autotrigger,int,intflag,inten,prescaler 64
  ADMUX = 0b00100000; // Vcc als Vref, höchstwertigste Bits, und unsym. ADC 0 als Eingang
 
  unsigned char get_adc_value(unsigned char pin) {
    ADMUX &= 0b11100000; // ADC0
    ADMUX |= pin; // auf gewünschten Eingang schalten 0-7
    ADCSRA |= (1<<ADSC); // starten
    while (ADCSRA & (1<<ADSC) ) { ; } //warten bis Messung fertig ist
    return ADCH;
  }

AVR ATMEGA / ATTINY: 8 Bit Schieberegister
z.B. an PORTC (Ser Pin 5, CLK Pin 6, Latch Pin 7)

  
  volatile char shift_out = 0; // 8 Bit Schieberegister Datum
  
  void refresh_shift() {
	for (int s_bits = 0; s_bits <= 7; s_bits++) // 8 Bits
	{
		//Current Ser Bit
		if ((shift_out & (1 << s_bits)) != 0)
		{
			sbi(PORTC,5);
		} 
		else
		{
			cbi(PORTC,5);
		}
		// CLK an /aus
		sbi(PORTC,6);
		cbi(PORTC,6);
	}
	// Latch AN / AUS
	sbi(PORTC,7);
	cbi(PORTC,7);
  }
  

AVR ATMEGA / ATTINY: sbi , cbi , check Makros
macht den Code doch gleich viel übersichtlicher... (sbi(Y,X); Pin Y an Register X setzen; cbi(X,Y); ...löschen)


  // good old sbi / cbi
  #define sbi(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))
  #define cbi(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))

  // toggle Bit
  #define toggle(ADDRESS,BIT) ((ADDRESS) ^= (1<<(BIT)))
  
  // check Bit
  #define check(ADDRESS,BIT) ((ADDRESS) & (1<<BIT))

  

General Purpose C CODE Excerpts

Tiefpassfilter
kann z.B. wunderbar zum Entprellen von Tastern genutzt werden (Taster gedrückt -> New_Value = 10 / sonts New_Value = 0...
k ist der Tiefpassfaktor, d.h. nach k Schritten und einem konstanten New_Value ist der Ausgangswert 3dB von New_Value (ca. 75%).


  // Tiefpass
  #define k 3; // k als Konstante definiert
  
  float TPsum = 0; // TPsum enthät den aktuellen Wert des Tiefpasses
  float New_Value = 2; // aktueller Wert für diesen Schritt
  
  TPsum += (New_Value - TPsum)/k;
  

General Purpose Java-Script Excerpts

Übergabe eines Funktionszeigers mit Parametern
Möchte man einen Funktionspointer ohne zusätzliche Parameter übergeben ist dies in JS relativ einfach:


	var foo = function(){ alert(val_xyz); };

	document.getElementById(something).onclick = foo; // ohne () da die Funktion sonst aufgerufen wird
  
Möchte man nun jedoch noch zusätzlich einen Parameter übergeben ist die Lösung nicht ganz offensichtlich:

	var foo = function(val_xyz){ alert(val_xyz); };
	var XYZ = 42;
	document.getElementById(something).onclick = (function (XYZ) {return function() {foo(XYZ);} })(XYZ)
  

Submit eines Formulars verhindern
Möchte man ein Formular z.B. per AJAX verabeiten, und zeitgleich eine Fallbacklösung ohne JS haben funktioniert dies wie folgt:


	<form action="post_xy.php" method="POST" id="xyz">
		<button type="submit" onClick="return sub_form('xyz');" name="sb" value="bt" >ABSENDEN</button>
	</form>
  
Die zugehörige JS Funktion kann dann wie folgt aussehen:

	function sub_form(ajax_link, form_id)
	{
		// Auswertung
		// ...
		return false; // Submit verhindern
	}
  
Wichtig dabei ist das 'return' im onClick Aufruf und dass kein onSubmit verwendet werden darf.

Kleinigkeiten am Rande / Knowledge

CAN Frames
Die Byte Anordnung (z.B. bei 16 Bit Werten) ist innerhalb eines Telegramms invers: Byte0 -> Low Byte | Byte1 -> High Byte
Das Low Byte wird zuerst übertragen.

GET Parameter bei MOD REWRITE Rules
[QSA,L] an das Ende jeder Umleitung anhängen.