Du wartest ja auch an dieser Stelle
auf einen Tastendruck. An dieser Stelle bleibt dein Programm so lange in der While-Schleife hängen, bis eine Taste gedrückt wird.Code:while(!(PIND & (1<<PD1))); _delay_ms(10); }
Hallo ich möchte mir eine Steuerung für ein Ätzgerät basteln.
Ich möchte die Laufzeiten der Heizung und die Laufzeiten der Aquariumpumpe einstellen können, wann sie Beginen und wann sie Stoppen, dazu Wil ich die Temperatur einstellen und einen schwel wert für die Heizung einstellen können, weil die ja eine Wärme Kapazität hat und eine Kapazität damit sie nicht Sekunden weise einschaltet und wider aus schaltet zur Regelung, ich möchte die Einstellungen später im EEPROM speichern können.
Nun möchte ich die Temperatur dauernd anzeigen, nur funktioniert das nicht die Anzeige des LCD's wird nur nach einem Tastendruck aktualisiert
Code:// // ATMega644 // lcd-routines.c, lcd-routines.h, i2c.h // #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <stdlib.h> #include <stdbool.h> #include "lcd-routines.h" #include "i2c.h" int main(void) //Hauptschleife { DDRD = 0x00; // Pins sind Eingang PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND // Initialisierung des LCD // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken // verschwunden sein lcd_init(); lcd_string(" LCD Start !!! "); _delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht lcd_clear(); lcd_home(); lcd_string(" Taste druecken"); TWI_init(FAKTOR, TEILER); char temperatur; //Temperaturvariable char einer; //Temperaturvariable einer char zehner; //Temperaturvariable zehner char Buffer[100]; //itoa Array 3 stelig int i = 25; //Laufzeitvariable while(1) //Programmschleife { temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen einer = ( temperatur % 10 ) + 48; zehner = ( temperatur / 10 ) + 48; if(!(PIND & (1<<PD0))) // Taste 0 an PORTD PD0 { _delay_ms(10); i++; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD0))); _delay_ms(10); } if(!(PIND & (1<<PD1))) // Taste 1 an PORTD PD1 { _delay_ms(10); i--; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD1))); _delay_ms(10); } if (dat2 >= 0b10000000) { lcd_setcursor( 0, 2); lcd_string("Temperatur "); lcd_data(zehner); lcd_data(einer); lcd_string(",5C "); } else { lcd_setcursor( 0, 2); lcd_string("Temperatur "); lcd_data(zehner); lcd_data(einer); lcd_string(",0C "); } } return(0); }
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Du wartest ja auch an dieser Stelle
auf einen Tastendruck. An dieser Stelle bleibt dein Programm so lange in der While-Schleife hängen, bis eine Taste gedrückt wird.Code:while(!(PIND & (1<<PD1))); _delay_ms(10); }
Dan müsste ich ja beide gedrückt haben.
Nun zurzeit ist es egal, welche Taste gedrückt wird.
Und wen ich das verwende.Code:if(!(PIND & (1<<PD0))) // Taste 0 an PORTD PD0 { _delay_ms(10); i++; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD0))); _delay_ms(10); } if(!(PIND & (1<<PD1))) // Taste 1 an PORTD PD1 { _delay_ms(10); i--; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD1))); _delay_ms(10); }
Dann wen ich denn Taster gedrückt halte, zählt die Variable rauf oder runter.Code:if(!(PIND & (1<<PD0))) // Taste 0 an PORTD PD0 { _delay_ms(10); i++; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); if(!(PIND & (1<<PD0))) { _delay_ms(10); } } if(!(PIND & (1<<PD1))) // Taste 1 an PORTD PD1 { _delay_ms(10); i--; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); if(!(PIND & (1<<PD1))) { _delay_ms(10); } }
Danke
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Hm. Ich geh mal davon aus, dass du die Taster gegen Masse angeschlossen hast und mit dem internen Pullup-Widerständen betreibst, wie es in deinem Quellcode steht. Das Display geht also an, "LCD Start" wird ausgegeben, und die Temperatur wird EIN mal angezeigt und dann nicht aktualisiert. ist das so?
ja stimmt !!!
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Ja weil das Programm hier stehen bleibt:
while(!(PIND & (1<<PD0)));
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
Dort dürfte es ja eigentlich nur dann stehen bleiben wenn die Taste gedrückt ist, und an der stelle eine null im Register ist.
Er kann ja mal testen wo das Programm stehen bleibt indem er eine LED schaltet. Einfach verschiedene Stellen im Programm einen Pin auf High setzen. Dann sieht er ja wo es stehen bleibt.
Schaut ruhig mal auf meiner Homepage vorbei :
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
ja, so hab ich das auch immer gemacht. wenn dir ein jtagICE zur verfügung steht, kannst du den code auch live laufen lassen und schauen wo es hängt.
Ja schon nur das wartet ja so lange, bis ich die Taste wider losgelassen habe.
Noch mal mein Code etwas übersichtlicher.
Wie gesagt ich hab nur Probleme mit der Temperatur aktualisieren.Code:// // ATMega644 // lcd-routines.c, lcd-routines.h, i2c.h // #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <stdlib.h> #include <stdbool.h> #include "lcd-routines.h" #include "i2c.h" int main(void) //Hauptschleife { DDRD = 0x00; // Pins sind Eingang PORTD = 0xff; // mit aktiviertem PullUp, Taster schalten nach GND // Initialisierung des LCD // Nach der Initialisierung müssen auf dem LCD vorhandene schwarze Balken // verschwunden sein lcd_init(); lcd_string(" LCD Start !!! "); _delay_ms(500); //Gibt einem die moeglichckeit zu lesen was auf dem LCD steht lcd_clear(); lcd_home(); lcd_string(" Taste druecken"); TWI_init(FAKTOR, TEILER); char temperatur; //Temperaturvariable char einer; //Temperaturvariable einer char zehner; //Temperaturvariable zehner char Buffer[100]; //itoa Array 3 stelig int i = 25; //Laufzeitvariable while(1) //Programmschleife { temperatur = TWI_empf(ADRESSE_R); //Temperaturvariablen einer = ( temperatur % 10 ) + 48; zehner = ( temperatur / 10 ) + 48; if(!(PIND & (1<<PD0))) // Taste 0 an PORTD PD0 { _delay_ms(10); i++; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD0))); //Warte solange Taste noch getrückt ist. _delay_ms(10); } if(!(PIND & (1<<PD1))) // Taste 1 an PORTD PD1 { _delay_ms(10); i--; lcd_setcursor( 0, 1); lcd_string("Aetzlaufzeit "); itoa( i, Buffer, 10 ); //Laufzeitvariable in Integer wandeln lcd_string( Buffer ); while(!(PIND & (1<<PD1))); //Warte solange Taste noch getrückt ist. _delay_ms(10); } if (dat2 >= 0b10000000) { lcd_setcursor( 0, 2); lcd_string("Temperatur "); lcd_data(zehner); lcd_data(einer); lcd_string(",5C "); } else { lcd_setcursor( 0, 2); lcd_string("Temperatur "); lcd_data(zehner); lcd_data(einer); lcd_string(",0C "); } } return(0); }
Danke
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Lesezeichen