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


von D-Bo2010 (Gast)


Angehängte Dateien:

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

von ... (Gast)


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.

von ... (Gast)


Lesenswert?

Verzeihung, zu schnell...

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
 while (1)                // Schleife um den Controller zu fangen
2
  {
3
  lcdwritexy(1,2,"   \0");      // Lösche Zahl  
4
  lcdgotoxy(1,2);          // Gehe in die 2.Zeile position 1  
5
  lcdwrites("   \0");        // Schreibe angegebene Zeichenkette
6
  }     
7
   return 0; // <<<< HIERHER UND WEITER KOMMT DAS PROGRAMM NIE <<<<
8
9
     {
10
    DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster

Ändere das mal in
1
int main(void) 
2
{
3
 char i[]="Druecke \0";         // Definiere Nullterminierten String "\0" unbedingt mit angeben   
4
 char f=0x0;            // Definiere byte mit dem wert 255
5
6
 lcdinit();               // Initialisiere LCD
7
 lcdwrites(i);            // Schreibe  Zeichenkette i auf Display
8
 lcdwrites("Taster1\0");        // Schreibe angegebene Zeichenkette
9
 lcdgotoxy(1,2);          // Springe zur 2. Zeile Position 1
10
 lcdwritehex(f);          // Schreibe den Hexcode von f auf display
11
 
12
 // Taster initialisieren
13
 DDRB &= ~(1<<TASTER);          // Port B: Eingang für Taster
14
 
15
 // Anfangseinstellung
16
 DDRD |= (1<<LED1) | (1<<LED2); // Port D: Ausgang für LED1 und LED2
17
 LED_AN(LED1);
18
 LED_AUS(LED2);
19
 
20
 while (1)                // Schleife um den Controller zu fangen
21
 {
22
   lcdwritexy(1,2,"   \0");      // Lösche Zahl  
23
   lcdgotoxy(1,2);          // Gehe in die 2.Zeile position 1  
24
   lcdwrites("   \0");        // Schreibe angegebene Zeichenkette
25
26
   _delay_ms(1000);  // Wert 1000 erlaubt ab avr-libc 1.6
27
   LED_TOGGLE(LED1);
28
   LED_TOGGLE(LED2);
29
 } 
30
}

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

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.