Ja weil das Programm hier stehen bleibt:
while(!(PIND & (1<<PD0)));
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.
versuch doch mal rauszufinden, an welcher stelle das Programm hängen bleibt.
Wie schon gesagt das kannst du testen indem du an verschiedene Stellen einfach eine LED einschaltest (du kannst auch nur eine LED einschalten und die Stelle wo sie eingeschaltet wird immer wechseln). Dadurch siehst du recht gut was wann passiert und wie sich dein Programm verhält. Alternativ kannst du das auch mittels Ausgabe über UART und einem Terminalprogramm am PC machen (oder z.B. dein LCD)
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
OK
Ich hab mal 2 LED's mit eingebunden, also beim Start sind beide LED's aus. Wen ich Taste 0 drücke Dan geht LED 1 an, wen ich Taste 1 drücke Dan geht LED 0 an.
Allerdings weis ich nicht ob die LED's beim STK500 nach GND schalten.
Hier hab ich mal den Code.
DankeCode:// // 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 { DDRA = 0xff; // Pins sind Ausgang PORTA = 0xff; // LED's Aus 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); PORTA = (1<<PD0); //LED0 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); PORTA = (1<<PD1); //LED 1 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); }
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Warte... wenn du 0 drückst geht 1 an und umgekehrt? Das ist ja fast nicht möglich o0
Lesezeichen