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, 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
Ja die LED's leuchten wen pin nach gnd schaltet.
habe schreiben erst heute gelernt.
bin legasteniger.
by Ferdinand.
Was Damaltor sagen will ist, dass es nicht sein kann das der Controller beim drücken der Taste 0 in die zweite If-Abfrage springt um dort die LED1 anzuschalten
Sicher das du die Taster richtig angeschlossen hast?
Wenn du möchtest, dass das LCD regelmässig aktualisiert wird kannst du doch auch mit einem Timer arbeiten und mit dem das LCD 1x pro Sekunde aktualisieren-
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
Ich glaube mitterweile auch dass da etwas falsch angeschlossen ist, bzw. du die Anschlüsse auf dem STK500 falsch interpretierst. Kann es sein, dass die Taster nicht gegen Masse, sondern gegen 5V schalten? Bin mir nicht mehr sicher. Das könnte aber der Grund sein, dass das Programm nur dann weiterläuft wen ein Taster auf 5V gelegt wird.
Edit: Ich habe gerade noch mal in den Schaltplan vom STK500 geschaut. Die Taster schalten auf Masse und haben bereits einen PullUp-Widerstand von 10k auf dem Board aufgelötet.
Die LEDs zeigen "in Richtung des Prozessors" und leuchten, wenn eine Null am entsprechenden Pin ausgegeben wird.
Geändert von damaltor (16.01.2012 um 15:00 Uhr)
Lesezeichen