6 Namenskonventionen und aussagekräftige Identifier

Wie schon in den vorhergehenden Unterabschnitten dieses Bereiches mehrfach erwähnt, stellen Konventionen eine gute Methode dar, um Fehlerhäufigkeit oder Verwechslungen beim Programmierer oder Programmnutzer zu vermindern. Dies wurde auch in der Namensvergabe von Unterprogrammen und Makros konsequent eingesetzt. Als Beispiel seien hier die LCD-Ausgaberoutinen angeführt, analoge Mechanismen wurden auch in anderen Bereichen verwendet.

Die Ausgabe von Informationen auf das LCD-Display ist, bezogen auf die Prozessorzeit, eine sehr aufwändige Operation. Es ist somit sinnvoll, mehrere Zeichen in einer $I^{2}C$-Ausgaberoutine auszugeben, ohne den Bus neu initialisieren zu müssen. Es gibt jedoch auch zahlreiche Situationen, in denen man um eine Bus-Initialisierung nicht herumkommt.

Daher sind diese ,,High-Level'' Ausgabefunktionen alle zwei mal vorhanden,

Beide Aufrufarten sind identisch, mit der Ausnahme, dass die Funktionen der 1. Art mit ,,LCD_'' beginnen und in der 2. Version ,,LCD_INIT_'' vorangestellt bekommen.

	; ================================================================== 
	; display Z-value as floating point number - without LCD_INIT 
	; float format: NNN.F - in current implementation the fractional 
	; float part F can only be 0 or 5 (0.5 degrees), 
	; ---------------------------------- 
	; input: REG_Z (word) in 0.5 degrees (=value*2) 
	; output: none 
	; affected: iic_sendbyte 
	; 
	LCD_SEND_CFLOAT:
	  push  temp1
	  push  ltmp1
	  PUSHW REG_Z 
	... assembler code ...
	; do clean up ...
	  POPW  REG_Z
	  pop   ltmp1
	  pop   temp1
	  ret
	; ---------------------------------- 
	; display Z-value as floating point number - with LCD_INIT
	; ...
	LCDINIT_SEND_CFLOAT:
	  rcall LCD_START                 ; start bus transfer
	  rcall LCD_SEND_CFLOAT           ; send float to LCD
	  rcall IIC_STOP                  ; stop bus transfer
	  ret  
Weitere häufig verwendete Konventionen bestehen darin, dass in zahlreichen Subroutines ein Label mit dem Namen des Unterprogramms aufscheint, dem die Nachsilbe ,,_ret'' nachgestellt ist. Dies ist jenes Label, nach dem nur mehr Stack-Wiederherstellungen ausgeführt werden und das somit jederzeit gefahrlos zum Verlassen des Unterprogramms angesprungen werden kann, bzw. soll.

	; ---------------------------------- 
	; user selectable preset rotation direction 
	; --------------------------------- 
	; input:  none 
	; output: temp1 - rotation step counter increment (-1,0,+1) 
	; affected: flags 
	; --------------------------------- 
	user_select_direction:
	  PUSHW REG_Z 
	... assembler code ...
	dir_none:
	  ldi   temp1, ValueDirNone ; no rotation?
	  rjmp  user_select_direction_ret
	dir_left:
	  ldi   temp1, ValueDirDecr ; reverse direction
	  rjmp  user_select_direction_ret
	dir_right:
	  ldi   temp1, ValueDirIncr ; normal direction
	; rjmp  user_select_direction_ret
	user_select_direction_ret:
	  POPW  REG_Z
	  tst   temp1
	  ret 
Weiters enden alle Hauptfunktionen der obersten Menüebene (Module) mit der Nachsilbe ,,_main'' und können daher leicht als Einsprungspunkte der Hauptfunktionen identifiziert werden.

Die häufige Verwendung der 16-Bit Makros führt zwangsweise auch dazu, dass zwei 8-Bit Register gemeinsam auf den Stack gesichert und vor allem in der richtigen Reihenfolge wiederhergestellt werden müssen.

Dies erledigen die beiden Makros PUSHW und POPW, die sich immer auf einen High- und Low-Registeranteil beziehen und somit auf alle Register angewendet werden können, die das H- und L-Postfix verwenden.

Diese ,,Typkennzeichnung'' wird aber auch bei 8-Bit Makros verwendet, so gibt das Makro OUTB ein Byte in ein 8-Bit Port unter Verwendung eines Hilfsregisters aus.

	OUTB TIMSK,(1<<OCIE1A)|(1<<TOIE0)
gerhard.reithofer@tech-edv.co.at