Hallo, alle die noch Online sind. Ich versuche seit 2 Stunden auf meinem Display eine zweite Seite, also das es einen Text "Mutti fraegt Kind" anzeigt. Dann soll es so 10sec warten und den text "antwortet" schreiben. Wie muss ich den Code änderen? // // Anpassungen im makefile: // ATMega8 => MCU=atmega8 im makefile einstellen // lcd-routines.c in SRC = ... Zeile anhängen // #include <avr/io.h> #include "lcd-routines.h" int main(void) { lcd_init(); lcd_string("Mutti fraegt Kind"); set_cursor(0,2); lcd_string("1:"); while(10); { } return 1; } Oder muss ich in einer der anderen Datein noch etwas ändern? Als Programmiersoftware hab ich AVR-Studio es ist ein 2x 16 LCD. Bin um jede hilfe Dankbar!! Mfg Stefan
Vielleicht steht ja etwas falsches in "lcd-routines.h" ?
Ich weiß nicht, was falsch ist! Ich hab kaum erfahrungen. Ich bin ja froh, das es überhaupt etwas darstellt. Ich will ja nur, das es mit dem Text weitergeht. Kann mir bitte jemand einen Befehl oder Beispiel geben? Das LCD is von pollin. die lcd.rountine.h // Ansteuerung eines HD44780 kompatiblen LCD im 4-Bit-Interfacemodus // http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial // void lcd_data(unsigned char temp1); void lcd_string(char *data); void lcd_command(unsigned char temp1); void lcd_enable(void); void lcd_init(void); void lcd_home(void); void lcd_clear(void); void set_cursor(uint8_t x, uint8_t y); // Hier die verwendete Taktfrequenz in Hz eintragen, wichtig! #define F_CPU 8000000 // LCD Befehle #define CLEAR_DISPLAY 0x01 #define CURSOR_HOME 0x02 // Pinbelegung für das LCD, an verwendete Pins anpassen #define LCD_PORT PORTD #define LCD_DDR DDRD #define LCD_RS PD4 #define LCD_EN PD5 // DB4 bis DB7 des LCD sind mit PD0 bis PD3 des AVR verbunden
Verzweiflung schrieb:
> Ich weiß nicht, was falsch ist! Ich hab kaum erfahrungen.
Worin soll denn deiner Meinung nach die Warterei bestehen?
1 | while(10); |
Da steht: solange 10 ungleich 0 ist, mach nichts. 10 ist immer ungleich 0 und wenn du bis ans Ende des Universums wartest. Wenn du sowas wie ein Menüsystem bauen willst, dann ist die einfachste Variante die, für jede 'Seite' eine eigene Funktion zu machen. Das ist zwar bei deinem Mikrobeispiel nicht wirklich notwendig, sobald es aber komplizierter wird, sieht die Sache anders aus.
1 | ..
|
2 | #include <util/delay.h> |
3 | ..
|
4 | |
5 | |
6 | void delay_sec( uint8_t sec ) |
7 | {
|
8 | uint8_t i; |
9 | |
10 | for( i = 0; i < sec; ++i ) |
11 | _delay_ms( 1000 ); |
12 | }
|
13 | |
14 | void Seite_1() |
15 | {
|
16 | lcd_clear(); |
17 | |
18 | lcd_string( "Mutti fraegt Kind" ); |
19 | |
20 | delay_sec( 10 ); |
21 | }
|
22 | |
23 | void Seite_2() |
24 | {
|
25 | lcd_clear(); |
26 | |
27 | lcd_string( "antwortet" ); |
28 | |
29 | delay_sec( 10 ); |
30 | }
|
31 | |
32 | int main() |
33 | {
|
34 | lcd_init(); |
35 | |
36 | while( 1 ) |
37 | {
|
38 | Seite_1(); |
39 | Seite_2(); |
40 | }
|
41 | }
|
Aber sei gewarnt: Solche Warteschleifen sind nur am Anfang dein Mittel zur Lösung. In richtigen Programmen kommt man so nicht weiter. Hauptsächlich deshalb, weil innerhalb einer Warteschleife (delay_sec) nichts weiter passieren kann ausser ISR abzuarbeiten. Genau das ist aber kontraproduktiv. Man möchte ja meistens haben, dass ein µC sofort auf ein Ereignis reagiert und nicht erst stumpfsinnig irgendwelche Zeit runterzählt. Edit: Damit die _delay_ms Funktion richtig funktioniert, muss der Optimizer des Compilers eingeschaltet sein. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
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.