versuch doch mal rauszufinden, an welcher stelle das Programm hängen bleibt.
Druckbare Version
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 :) )
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);
}
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.
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-
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.