mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD und Taster auf Pollin-Board


Autor: D-Bo2010 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin ein Anfänger der versucht in C ein Programm hinzubekommen was 
"erstmal" auf dem display schreibe was zutun ist.

Ich wollte aus dem Tut zum Pollin-Board hier aus dem Forum das Programm 
Tasty mit einem LCD zuverbinden allerdings läuft entweder nur das LCCD 
oder nur das Programm Tasty.

Könnt Ihr euch mal das Programm von mir anschauen und mir sagen wo mein 
Fehler ist?

Ach bevor ich es Vergesse das Tut AVR-GCC oder so habe ich schon durch 
aber leider nichts brauchbares für mein Problem gefunden vielleicht bin 
ich auch einfach nur Blind.

danke schonmal im vorraus

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahhh! Deine Ausdrucksweise ist ganz fürchterlich, sorry.

Den Code finde ich ziemlich chaotisch, mal ein paar allgemeine Hinweise 
(was mir - "fortgeschrittener Anfänger" - beim schnellen Durchlesen so 
auffällt):
>#define LED_AN(LED)  (PORTD |=  (1<<(LED)))
Ich würde LED durch _led oder so ersetzen, es ist allgemein üblich das 
Wörter in Großbuchstaben Präprozessormakros sind. Wenn jemand nicht 
genau liest könnte er denken LED ist irgendwo definiert und wird 
ersetzt.
Besser: #define LED_AN(_led) (PORTD|=(1<<_led))

>char i[]="Druecke \0";         // Definiere Nullterminierten String "\0" 
>unbedingt mit angeben
Die Null macht der Compiler automatisch mit rein, "Druecke" reicht hier 
aus.

>char f=0x0;            // Definiere byte mit dem wert 255
0x0 ist Null, nicht 255.

>while (1)                // Schleife um den Controller zu fangen
Da kommt der µP wie du selber sagst nie wieder raus...


>return 0;
und wenn doch würde das das Programm sofort beenden.

Der gesamte Block
>DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster
wird also NIEMALS ausgeführt!!!

Ganz wichtig: Vernünftig einrücken!

>while(2)
Was soll die 2 da? Es ist nicht falls (alles was nicht 0 ist ist wahr), 
aber normalerweise schreibt man 1.

>lcdcall(56,1);           // Systemeinstellungen
Keine Zahlen im Quellcode nutzen, keiner weiss was da gemeint ist. 
Besser sowas wie (1<<CONFIGMODUS)|(1<<LCD_AN)|(1<<CURSOR_AN) nutzen 
(Präprozessor!).

>PORTB=b-1;            // Enable wieder null setzen
Uhhhh!!!! Das geht (wenn überhaupt) nur wenn Enable=LSB. Du hast oben 
doch angefangen Makros zu schreiben um deine LEDs zu tooglen, warum 
diese nicht verallgemeinern und für Enable nutzen?

> char l=(c*16);
> l=l/16;
Was soll das bringen (außer einem Überlauf)?

lcdwritedec hab ich mir nicht angeschaut.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verzeihung, zu schnell...

Ersetze
>Es ist nicht falls
durch
>Es ist nicht *falsch*

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 while (1)                // Schleife um den Controller zu fangen
  {
  lcdwritexy(1,2,"   \0");      // Lösche Zahl  
  lcdgotoxy(1,2);          // Gehe in die 2.Zeile position 1  
  lcdwrites("   \0");        // Schreibe angegebene Zeichenkette
  }     
   return 0; // <<<< HIERHER UND WEITER KOMMT DAS PROGRAMM NIE <<<<

     {
    DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster

Ändere das mal in
int main(void) 
{
 char i[]="Druecke \0";         // Definiere Nullterminierten String "\0" unbedingt mit angeben   
 char f=0x0;            // Definiere byte mit dem wert 255

 lcdinit();               // Initialisiere LCD
 lcdwrites(i);            // Schreibe  Zeichenkette i auf Display
 lcdwrites("Taster1\0");        // Schreibe angegebene Zeichenkette
 lcdgotoxy(1,2);          // Springe zur 2. Zeile Position 1
 lcdwritehex(f);          // Schreibe den Hexcode von f auf display
 
 // Taster initialisieren
 DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster
 
 // Anfangseinstellung
 DDRD |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2
 LED_AN(LED1);
 LED_AUS(LED2);
 
 while (1)                // Schleife um den Controller zu fangen
 {
   lcdwritexy(1,2,"   \0");      // Lösche Zahl  
   lcdgotoxy(1,2);          // Gehe in die 2.Zeile position 1  
   lcdwrites("   \0");        // Schreibe angegebene Zeichenkette

   _delay_ms(1000);  // Wert 1000 erlaubt ab avr-libc 1.6
   LED_TOGGLE(LED1);
   LED_TOGGLE(LED2);
 } 
} 

Es fehlt aber noch die Abfrage des Tasters. Im Moment ist es nur eine 
LCD Ausgabe und ein Blinken von LED1 und LED2.

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.