PICDEM 2 PLUS mit PIC18F4431 und LCD
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  LCD (CCS)  |  PICDEM 2 PLUS mit PIC18F4431 und LCD « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: PICDEM 2 PLUS mit PIC18F4431 und LCD  (Gelesen 2295 mal)
 
EB
Gast
« am: August 24, 2008, 16:27:24 »

Hallo,

ich versuch schon seit einiger zeit ein Programm zu shcreiben mit dem ich das LCD auf dem PICDEM ansteuern kann.

Hier im Forum gibt es ja jede menge Beispiele und Hilfen...mit einem dieser Beispiele (ich weiß leider nimmer von wem der code war) hab ich angefangen.
Leider meldet mir der CCS Compiler immer einen Fehler: A #DEVICE required before this line

die Fehlermeldung bezieht sich auf folgende Zeile (LCD.c):

struct port_d_layout const LCD_READ={15,0};  // Lesen


Hier mal mein Programm:

main.c

Code:
//
=================================== I N C L U D E S =====================================
#include "hardware.h"
#include "LCD.c"


//================================ D E F I N I T I O N E N ================================
#define LCD_BLANK(){lcd_send_byte(0,1);delay_ms(2);}

unsigned char wert; //Zälvariable


//================================ H A U P T P R O G R A M M  =============================
void main()
{
  int data;
  set_tris_a(0x00); //Setzt Port A als Input (Bit=1 -> Input)
  set_tris_b(0xFF); //Setzt Port B als Output (Bit=0 -> Output)
  set_tris_c(0x00); //Setzt Port C als Input (Bit=1 -> Input)
  set_tris_d(0x00); //Setzt Port D als Input (Bit=1 -> Input)

  lcd_init();

  LCD_BLANK();

  lcd_gotoxy(1,1);

  lcd_putc("\cBaufeld\2");
  lcd_putc("V 1.0");

  delay_ms(500); //Pause 500ms
  wert=0; //Setzt Zählvariable auf 0


//================================ H A U P T S C H L E I F E ============================= 
  while(TRUE)
  {
    if(0 == input(PIN_A4))
{
  output_high(PIN_B2);
}
if(1 == input(PIN_A4))
{
  output_low(PIN_B2);
}

output_high(PIN_B1);
delay_ms(10);
output_LOW(PIN_B1);
delay_ms(10);

    output_toggle(PIN_B0);

i2c_start();
i2c_write(0x9A);    //Adresse des Temperatusensor
i2c_write(0x00);    //Read Temp
i2c_start();
i2c_write(0x9B);
data = i2c_read();
i2c_stop();
LCD_BLANK(); //hier wird das LCD gelöscht
printf(lcd_putc,"\fTemp:%03u",data); //hier wird den Wert auf dem Display geschrieben

delay_ms(1000);


  } //end while(TRUE)
} //end main

LCD.c (hier ausm Forum "geklaut")

Code:
struct port_d_layout const LCD_READ={15,0};  // Lesen

struct port_d_layout const LCD_WRITE={0,0};  // Schreiben

#define lcd_type 2 // Typ der Anzeige (0=5x7, 1=5x10, 2=2 lines)
// verschiedene Eigenschaften der LCD-Anzeige
// 0x0C = Display an
// 0x01 = Display löschen
// 0x06 = Adresspointer inkrementieren und Displayinhalt nicht verschieben

byte CONST LCD_INIT_STRING[4]={0x20|(lcd_type<<2),0x0C,0x01,6};

// LCD-Display wird ausgelesen
byte lcd_read_byte()
{
byte low,high;
set_tris_d(LCD_READ);
output_high(LCD_RW);
delay_cycles(1);
high=portd.lcddata;
        output_low(LCD_ENABLE);
delay_cycles(1);
        output_high(LCD_ENABLE);
delay_us(2);
low=portd.lcddata;
        output_low(LCD_ENABLE);
set_tris_d(LCD_WRITE);
return((high<<4)|low);
}


// versendet ein Nibble an das Display
void lcd_send_nibble(byte n)
{
portd.lcddata=n;
delay_cycles(1);
output_high(LCD_ENABLE);
delay_us(2);
        output_low(LCD_ENABLE);
}

// Hier wird das komplette Byte übertragen. Zuerst aber wird das Busy Flag überprüft und danach wird
// das Byte getrennt und zwei Nibbles übertragen werden
void lcd_send_byte(byte address,byte n)
{
output_low(LCD_RS);
while (bit_test(lcd_read_byte(),3));  // Hier wird D7 vom LCD-Display abgefragt
output_bit(LCD_RS,address);
delay_cycles(1);
        output_low(LCD_RW);
delay_cycles(1);
        output_low(LCD_ENABLE);
lcd_send_nibble(n>>4);
lcd_send_nibble(n&0xF);
}

// Initialisierung des LCD-Displays
void lcd_init()
{
byte i;
set_tris_a(LCD_WRITE);
set_tris_d(LCD_WRITE);
    output_low(LCD_ENABLE);
delay_ms(15);
for(i=1;i<=3;++i)
{
lcd_send_nibble(3);
delay_ms(5);
}
lcd_send_nibble(2);
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);
}

// Hier wird der Anzeige auf bestimmten Koordinaten gesetzt
void lcd_gotoxy(byte x, byte y)
{
byte address;

if(y==1) address=0;
if(y==2) address=0x40;
if(y==3) address=0x10;
if(y==4) address=0x50;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

// Hier wird der Text auf das Display geschrieben
void lcd_putc(char f)
{
switch (f)
{
case '\c' : lcd_send_byte(0,1);
delay_ms(2);
break;
case '\1' : lcd_gotoxy(1,1); break;
case '\2' : lcd_gotoxy(1,2); break;
case '\3' : lcd_gotoxy(1,3); break;
case '\4' : lcd_gotoxy(1,4); break;
default : lcd_send_byte(1,f); break;
}
}

hardware.h

Code:
//=================================== I N C L U D E S =====================================
#include "18F4431.h" //PIC18F4431 Ports
 

//============================= C O N F I G U R A T I O N =================================

#fuses HS,NOWDT,NOPROTECT,NOLVP        // Konfigurationbits
#use delay(clock=4M, oscillator)        // Clock Speed
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, BRGH1OK) // RS232 Konfiguration
#use i2c(master,sda=PIN_C4,scl=PIN_C3) // I2C Schnittstelle


//Struktur für den Port A
#use standard_io(a)

#define S4 PIN_A4


//Struktur für den Port B
#use standard_io(b)

#define LED_1 PIN_B3
#define LED_2 PIN_B2
#define LED_3 PIN_B1
#define LED_4 PIN_B0

//Struktur für den Port C

// scl=PIN_C3 <- siehe oben (use i2c)
// sda=PIN_C4 <- siehe oben (use i2c)

//Struktur für den Port D
#use fast_IO(d)

struct port_d_layout
{
int lcddata:4; //LCD Daten RD0..RD3
int unused:4; 
}portd;

#define LCD_ENABLE PIN_D6
#define LCD_RW      PIN_D5
#define LCD_RS      PIN_D4

#byte portd = 0xF83

Für eure hilfe wäre ich euch sehr dankbar!

Gruß Eric
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #1 am: August 25, 2008, 13:41:34 »

Benutzt Du die MPLAB IDE, in welche Du den CCS C - Compiler eingebunden hast? Hast Du dann etwa die Datei "lcd.c" als Sourcecodedatei in Dein Projekt integriert?
Wenn ja, dann wäre dies eine Erklärung für Deinen Fehler.

Im MPLAB-Projekt darf nur die main.c als einzige Sourcecodedatei stehen, alle anderen Sources müssen mit #include eingefügt werden!
Gespeichert
EB
Gast
« Antworten #2 am: August 27, 2008, 07:42:46 »

Vielen Dank für deinen Tipp! Genau den Fehler hab ich gemacht….

Nach dem ich noch feststellen musste das es mehrere verschiedene Versionen der PICDEM 2 Plus Platine,
und ich natürlich mit dem falschen Schaltplan gearbeitet hab, funktioniert das ganze jetzt endlich.
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.035 Sekunden mit 18 Zugriffen.
 
Top! Top!