Forum: Mikrocontroller und Digitale Elektronik LCD Routine (C) bringt fehler


von Daniel S. (stoegi)


Lesenswert?

Hallo,
habe laut dieser Anleitung http://www.hady.de/sven/projekt4/start.htm
ein Programm geschrieben.
es ist jedoch unmöglich das file zu "builden" im avr studio mit gcc

...bringt laufend fehler..

string-avr.h no such file or directory
portlcd undeclared

... und so weiter
obwohl ich es genau so gemacht habe wie in der anleitung. ich finde den
fehler nicht

von Profi (Gast)


Lesenswert?

Bei C ist die erste Fehlermeldung die entscheidende, weitere sind meist
Folgefehler.
Die Meldung bedeutet, dass er string-avr.h nicht includen kann, weil er
sie nicht dort findet, wo er sie sucht.

Das kann 2 Gründe haben:
- die Datei steht woanders
  -> Datei ins include-Verzeichnis verschieben   oder
  -> in der #include-Anweisung den Pfad angeben
  (beachte den Unterschied <string-avr.h> und "string-avr.h")
- die Datei steht nirgens

Suche den Rechner nach der Datei ab (mit WindowsTaste-F).

Ein gutes Programm würde sagen:
Laden der Datei string-avr.h von Verzeichnis c:\abc\xyz und
c:\def\include nicht möglich, richtiges Verzeichnis eingeben:

von Daniel S. (stoegi)


Lesenswert?

danke,
bin schon draufgekommen

leider weiss ich nicht für was die string-avr.h gut ist.. finden tu ich
sie auch nirgends und im internet auch nicht

von Stefan K. (_sk_)


Lesenswert?

Vergiss den Code einfach.

Der Autor scheint noch nicht lange C zu programmieren. In einer .h
Datei hat der Code selbst nichts zu suchen.

Hier gibt es genügend bessere Beispiele, schau Dich mal in der
Codesammlung und bei den Tutorials um.

Gruß, Stefan

von Daniel S. (stoegi)


Lesenswert?

danke,
ich durchsuchte bereits das ganze Net und komme nicht weiter.

dabei kann es gar nicht so schwer sein
habe die routine von peter fleury genommen und abgeändert auf die ports
usw.

obwohl ich in meinem programm die lcd.h include, kennt er den befehlt
.. lcd_init(...) nicht und macht nur ärger

oder lcd_puts(....) funktoniert auch nicht.
es geht einfach garnix :)

vielen dank

von karl-heinz (Gast)


Lesenswert?

ein programm aus codeschnippsel.
datenanschluss portc 0-3 (4bit-modus)standartdisplay 2x16, 4=en, 5=rs,
rw auf masse.
kannste jederzeit ändern, brauchs nur die daten vom jeweiligen lcd
reinbringen. daten werden vom pc über die serielle schnittstelle
eingelesen (19200bps)und auf dem display ausgegeben.
schau dir das programm in aller ruhe durch.
typ: avr16 8mhz und 19200bps.


die lcd.c :

#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "uart.c"

#define delay_us_(us)  _delayFourCycles_( ( ( 1*(F_CPU/4000) )*us)/2005
)

void _delayFourCycles_(uint16_t z)
{
  uint16_t i;

      for (i=0; i<z; i++)
      asm volatile("nop");
}

void delay_ms_(uint16_t z)
{
  uint16_t i;
  for (i=0; i<z; i++)
      delay_us_(999);
}

void lcd_flash_e (void)
{
  PORTC|=(1<<DDC4);
  delay_us_(5);
  PORTC&=~(1<<DDC4);
  delay_us_(50);
}

void lcd_write (uint8_t data, uint8_t rs)
{
  uint8_t dataBits ;

    if (rs)
       dataBits=0x20;
    else
       dataBits=0;

    PORTC=dataBits |(data>>4);
  lcd_flash_e ();
    PORTC=dataBits | (data&0x0F);
  lcd_flash_e();
  delay_ms_(2);
}

void lcd_cls (void)
{
  lcd_write(0x02,0);
  delay_ms_(2);
  lcd_write(0x01,0);
  delay_ms_(2);
}

void lcd_writechar(char zeichen)
{
  lcd_write (zeichen,1);
}

void lcd_writetext(char *text)
{
  uint8_t i = 0;
  while (text[i]!=0)
  {
    lcd_writechar(text[i]);
    i++;
  }
}

void lcd_gotoline(uint8_t zeile)
{
  if (zeile == 1)lcd_write(0x80,0);
  if (zeile == 2)lcd_write(0xC0,0);
}

void lcd_gotopos (uint8_t zeile, uint8_t spalte)
{
  if (zeile == 1)lcd_write(0x80+spalte-1,0);
  if (zeile == 2)lcd_write(0xC0+spalte-1,0);
}

void lcd_ini (void)
{
  DDRC = 0x3F;
  PORTC=0x00;

  delay_ms_(5);

  lcd_write(0x2,0);

  lcd_flash_e ();

  delay_ms_(5);

  lcd_write(0x28,0);
  lcd_write(0x0C,0);
  lcd_write(0x06,0);

  lcd_cls();
}

int main(void)
{

  DDRC=0xff;
  PORTC=0;
  sei();
  usart_init( (READ + WRITE) , READ);

  delay_ms_(100);
  lcd_ini();

  while(1)
  {
    if(char_test==1)
    {
        lcd_cls();
      lcd_gotopos (1, 3);
      lcd_writetext(text_ausgabe);
      lcd_gotopos (2, 6);
      lcd_writetext(text_ausgabe);

    }
    char_test=0;
    delay_ms_(5);
  }

}


die uart.c :

#define READ  1
#define WRITE 2

#define USART_BAUD_RATE   19200
#define USART_BAUD_SELECT   (F_CPU/(USART_BAUD_RATE*16l)-1)

char uart_text[32];
char text_ausgabe[32];
char buchstabe;
uint8_t zaehler_char=0;
uint8_t char_test;
uint8_t zaehler_ausgabe;


SIGNAL(SIG_UART_RECV)
{
if(char_test==0)
{
  buchstabe=UDR;
  if ((buchstabe==13) || (zaehler_char==31))
  {
    uart_text[zaehler_char]='\0';
    strcpy(text_ausgabe, uart_text);
    zaehler_ausgabe=zaehler_char;
    zaehler_char=0;
    char_test=1;
    }
    else
    {
    uart_text[zaehler_char] = buchstabe;
      zaehler_char=zaehler_char+1;
  }
}
}

void usart_init(int Enable, int Interupts)
{
  if (Enable & READ)             UCSRB = (1<<RXEN);
  if (Enable & WRITE)            UCSRB |= (1<<TXEN);

    if (Interupts & READ)             UCSRB |= (1<<RXCIE);
  if (Interupts & WRITE)            UCSRB |= (1<<TXCIE);
    UBRRL = (unsigned char)       USART_BAUD_SELECT;
}

void usart_writeChar(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE))) {}
    UDR = c;
    while(!(UCSRA & (1<<TXC))) {}
}

void usart_writeString(unsigned char *string) {
    while (!(UCSRA & (1<<UDRE))) {}
  while ( *string)
    usart_writeChar(*string++);
}

von Daniel S. (stoegi)


Lesenswert?

die lcd.c funktioniert bei mir aber nicht.
kann es daran liegen dass die lcd.h fehlt oder hast du das scho
beisammen,
danke

von Daniel S. (stoegi)


Lesenswert?

kann es daran liegen dass ich die string.h und stdint.h nicht besitze.
oder dass gewisse variablen im code ersetzt werden müssen.
er brint mir beim erzeugen des hex files nur fehler mit deinem code

danke

von Daniel S. (stoegi)


Lesenswert?

So,
habe die Routine von Peter Fleury und habe 1 fehler.

D:/Programme/WinAVR/bin/../lib/gcc/avr/3.4.1/../../../../avr/lib/avr5/cr 
tm128.o(.init9+0x0):
undefined reference to `main'


An was liegt das?

danke

von Karl H. (kbuchegg)


Lesenswert?

Steht doch da: Du hast keine main() Funktion.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.