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
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.
Verzeihung, zu schnell... Ersetze >Es ist nicht falls durch >Es ist nicht *falsch*
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.