Seit dem Zwischenbericht haben wir unsere Schaltung und unser Layout fertig gestellt und die Platinen ätzen und bestückt lassen. Dabei haben sich ein paar kleine Änderungen ergeben. Wir verwenden nun den \textbf{ATmega 32A} und nichtmehr den ATmega 328P.
Auch benutzen wir ein anderes Display, welches nicht den HD44780 verwendet, sondern den \textbf{KS0070B} Es ist aber kompatibel mit diesem. Diese Änderung hat also keine Auswirkungen auf unsere Schaltung oder Programmierung.
Schaltung
Hier unsere fertige Schaltung. Der neue Mikrocontroller bietet mehr Pins für unsere Logik. So konnten wir noch einige Status LED`s hinzufügen. Die Datenbits des LCD`s werden über die oberen Pins des Port D angesteuert und die Steuerbits über die unteren Pins des Port C.
Hier nochmal alle wichtigen Pins für die Ansteuerung des LCD
Das Layout wurde mit Eagle gemacht und in dem Labor der TU geätzt. Die Bohrungen für die Durchkontaktierungen und die Bestückung haben wir selber gemacht.
Code
Da das Display leider noch nicht funktioniert und wir noch auf der Fehlersuche sind, ist der Code noch nicht komplett fertig. Die Routines, welche zur Programmierung notwendig sind haben wir fertig gestellt. Das Hauptprogramm muss aber noch geschrieben werden.
/*
* LCD_Library.c
*
* Created: 05.01.2016 15:21:49
* Author: valy_studium
*/
#include <avr/io.h>
#include <util/delay.h>static void lcd_enable (void) //gibt einen enable Impuls
{
PORTC |= (1<<Enable)
_delay_us(0.4)
PORTC &= ~(1<<Enable)
}void lcd_command(uint8_t data) //übergibt dem befehl ein 8 bit befehl
{LCD_DATA_PORT |= (data & 0xF0); //untere 4 Bits 0 setzen
PORTC &= ~(RS); //RS = 0
PORTC &= ~(RW); //RW = 0
lcd_enable(); //Enable Impulsdata &= 0x0F; //Obere 4 Bits löschen
LCD_DATA_PORT |= (data << 4); //Befehl nach links shiften
lcd_enable(); //Enable Impuls
}void lcd_init(void) //initialisiert das Display im 4 bit modus
{
_delay_ms(16)PORTC &= ~((1<<RW) | (1<<RS)); //RW und RS 0 setzen
PORTD &= ~(1<<PD6) | (1<<PD7)); //PD6 und PD7 0 setzen
PORTD |= (1<<PD4) | (1<<PD5); //PD4 und PD5 1 setzen ->soft reset_delay_ms(5);
lcd_enable(); //ausführen
_delay_us(200); //wartenlcd_enable(); //ausführen
_delay_us(200); //wartenlcd_enable(); //ausführen
lcd_command(LCD_FUNCTION_SET); //Zeilen, font und modus definieren
lcd_command(LCD_DISPLAY_OFF); //Display ausschalten
lcd_command(LCD_CLEAR_DISPLAY); //Display löschen
lcd_command(LCD_SET_ENTRY); //Cursor initialisieren, increase, display not shifted}
void lcd_daten(uint8_t data) //übergibt dem befehl ein 8 bit befehl
{LCD_DATA_PORT |= (data & 0xF0); //untere 4 Bits 0 setzen
PORTC |= RS; //RS = 1
PORTC &= ~(RW); //RW = 0
lcd_enable(); //Enable Impulsdata &= 0x0F; //Obere 4 Bits löschen
LCD_DATA_PORT |= (data << 4); //Befehl nach links shiften
lcd_enable(); //Enable Impuls
}void lcd_clear (void) //löscht den Text auf dem Bildschirm
{
lcd_command(LCD_CLEAR_DISPLAY)
_delay_ms(2)
}void lcd_write(const char *text) //Gibt einen String auf dem Bildschirm auf
{
while( *text != NULL) //Solange *text nicht Null ist wird *text++ auf dem Bildschirm ausgegeben
lcd_daten (*text++);
}void lcd_cursor_reset(void) //Reset des Cursors auf die erste Spalte der ersten Zeile
{
lcd_command(RETURN_HOME)
_delay_ms(2)
}void lcd_setcursor_line2_middle(void) //setzt den Cursor auf die Mitte der 2- Zeile
{ // eventuel praktisch um zum Beispiel Werte anzeigen zu lassen
lcd_command(LCD_SET_CURSOR); //zB: erste Zeile: Drehzahl, zweite Zeile mitte: 1300 U/min
_delay_us(100);
}int function(void)
{return 0;
}