Projekte.ctBot2_OberlaenderLi.unterseite3 (Struktur)


Problem 3: Display schien nicht zu funktionieren

Kontrastspannung:

Eine der Ursachen war, dass die Kontrastspannung nicht richtig eingestellt war. Mithilfe eines kleinen Schraubenziehers lässt sich diese jedoch am Potentiometer verändern. Ein gutes Ergebnis kann mit einer Einstellung, die im Bereich von 0...0,5 V liegt, erzielt werden.

Resetbutton:

Ausserdem war es komisch, dass sich sowohl bei Verwendung des Akkupacks als auch des Netzteils das Display ziemlich häufig nicht wie in gewohnter Weise ansteuern ließ. In diesen Fällen sollte man den Reset-Button drücken. Unterbricht man nämlich den c't-Bot in seinem Programmablauf und versucht dann den Zusammentest später wieder von vorne zu starten, muss man diesen ohne Benutzung des Reset-Buttons erst einmal wieder auf den Mikrocontroller neu übertragen.

Display.c:

Eine weitere Ursache für eine unzulängliche Displayansteuerung lag allerdings noch im Code des Displays verborgen:


#include "display.h"

int x,j;

static char puffer[PUFFER_GROESSE];	/*string fuer Displayausgaben */

void write_data(char data){ //ein Zeichen aus data in den Displayspeicher schreiben
        int i;
		
	for (x=0;x<100 ;x++ )
       {
        for (j=0;j<100 ;j++ ){}
       }
	   
	schieberegister_data_schicken(0x38,(1<<1),0x04);
	PORTC &= ~0x07;   // Alles zurueck setzen ==> Fallende Flanke von Enable  portc &=~ 0x07 (&=~0b111)
	
	for (x=0;x<40 ;x++ )
       {
        for (j=0;j<100 ;j++ ){}
       }
		
	schieberegister_data_schicken(data,(1<<1),0x04|(1<<0));
		
		// Enable muss fuer mind. 450 ns High bleiben, bevor es fallen darf!
		// ==> Also mind. 8 Zyklen warten
        
	for (i=0; i<250; i++){
		asm("nop");
	} 
	PORTC &= ~0x07;	
}
 


void befehl_schicken(unsigned char befehl{ //ein Befehl an das Display senden
	unsigned char i;
	schieberegister_data_schicken(befehl,(1<<1),0x04);       /*SRCLK = PORTC.1 = 1 und RCLK=PC2=1*/
	
	for (i=0; i<100; i++){
		asm("nop");
	} 

	PORTC &= ~0x07;	
}


 


Neuere Compiler optimieren die leeren geschweiften Klammern {} einfach weg, deshalb wurden diese durch { __asm volatile("nop"); } ersetzt, wobei _asm ein Schlüsselwort darstellt, dass eine Inline-Assembler Sequenz einleitet. Das nachgestellte volatile sorgt dafür, dass die Sequenz keinesfalls wegoptimiert werden darf. Zu "nop" ist nicht viel zu sagen, außer dass nop weder Input- noch Output-Operanden hat und sich Register/RAM nicht ändern. Nebenbei haben wir die Header Datei util/delay.h eingefügt, um eine Funktion, die eine Verzögerung von 47 Mikrosekunden bewirkt, in den Code einbringen zu können. Dazu musste die Taktfrequenz F_CPU noch einmal definiert werden.

Display_neu.c:

#include "display.h"

#ifdef F_CPU
#undef F_CPU
#endif
#define F_CPU 16000000UL  // Quarz 16 MHz
#include <util/delay.h>


int x,j;

static char puffer[PUFFER_GROESSE];	/*string fuer Displayausgaben */

void write_data(char data) //ein Zeichen aus data in den Displayspeicher schreiben
{   
	for (x=0;x<100 ;x++ )
       {
        for (j=0;j<200 ;j++ ){ __asm volatile("nop"); } // _asm kennzeichnet eine Inline-Assembler Sequenz
                                                       // volatile verbietet eine Wegoptimierung der Sequenz
	                                               // "nop" hat weder Input noch Output-Operanden
        }
	schieberegister_data_schicken(0x38,(1<<1),0x04);
	PORTC &= ~0x07;   // Alles zurueck setzen ==> Fallende Flanke von Enable  portc &=~ 0x07 (&=~0b111)
	
	for (x=0;x<40 ;x++ )
       {
        for (j=0;j<200 ;j++ ){ __asm volatile("nop"); }
       }
		
	schieberegister_data_schicken(data,(1<<1),0x04|(1<<0));
		
		// Enable muss fuer mind. 450 ns High bleiben, bevor es fallen darf!
		// ==> Also mind. 8 Zyklen warten
        
	_delay_us(47); // 47 Mikrosekunden warten

      PORTC &= ~0x07;	
}
 

void befehl_schicken(unsigned char befehl) //ein Befehl an das Display senden	
{        
	schieberegister_data_schicken(befehl,(1<<1),0x04);       /*SRCLK = PORTC.1 = 1 und RCLK=PC2=1*/
	
	_delay_us(47); // 47 Mikrosekunden warten

	PORTC &= ~0x07;	 
}


Autor: ifko, Letzte Änderung: 19.09.2008 19:44:13


 TU Clausthal 2020  Impressum