mikrocontroller.net

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


Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Kleinwort (_sk_)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: karl-heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++);
}

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel Stoeger (stoegi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht doch da: Du hast keine main() Funktion.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.