Datum:
Hallo, Ich habe ein kleines Problem das ich nicht ganz verstehe. Ich arbeite an einem Programm wo man per Tasten, verschiedene Buchstaben zu einer String hinzufügen kann. Hat man 20 Characters erreicht, so bricht der input loop ab und es geht in den output loop. Bis hier funktioniert alles bestens da meine Entprellroutine gut funktioniert (ich entprelle einfach mehrere Ports gleichzeitig). Nur manchmal wenn ich richtig stark auf die taste hämmer sodass es ganz schnell geht, springt er wieder zum Anfang des input modes zurück und ich habe keine Ahnung warum. Danach kann ich auch noch so langsam drücken und das was beim output mode erscheinen soll (ein paar LEDs leuchten dann auf) flackert nur kurz auf und man ist wieder im input mode. Dieses Problem habe ich aber komischerweise nicht, wenn ich direkt im output mode loop angebe PORTB = 0xFF; Wenn ich dies aber in einer Funktion mache und die dann im loop rufe, bekomme ich manchmal das Problem. Weiß vielleicht einer von euch woran das liegen könnte? Ich bin mir ziemlich sicher dass beim Zählen alles glatt läuft. Cheers, Shibby
Datum:
Na gut ihr bekommt code, hab gedacht ich versuchs erstmal so weil ich auf dem PC wo AVR Studio ist kein Internet habe. Hier ist mein main.c file:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "Defines.h"
#include "Timer0_Function_Prototypes.h"
#include "Port_Initialization_Function_Prototypes.h"
#include "InputProc_Function_Prototypes.h"
#include "Output_Function_Prototype.h"
#include "Key_Enum.h"
#define MAX_STRING_SIZE 20
int main(void)
{
InitPorts();
InitTimer();
sei();
// No key is pressed at the beginning.
KeyPressed keyPressed = None;
unsigned char debouncedStateE = 0xFF;
unsigned char debouncedStateF = 0xFF;
// Mode variables.
bool inputMode = true;
bool outputMode = false;
// String to store characters.
unsigned char inputString[MAX_STRING_SIZE];
unsigned char stringSz = 0;
while (inputMode)
{
debouncedStateE = GetDebouncedStateE();
debouncedStateF = GetDebouncedStateF();
if (GetInputE(&keyPressed, debouncedStateE))
InputProc(keyPressed, inputString, &stringSz);
else if (GetInputF(&keyPressed, debouncedStateF))
InputProc(keyPressed, inputString, &stringSz);
// If the max string size has been reached, switch to output mode.
if (stringSz > MAX_STRING_SIZE - 2)
{
inputMode = false;
outputMode = true;
}
}
// Append terminating null character to string.
inputString[MAX_STRING_SIZE - 1] = '\0';
while (outputMode)
{
PORTB = 0xFF;
}
return 0;
}
|
In dem letzten while loop wird die String dann mit Hilfe einer Funktion wieder ausgegeben. Komischerweise funktioniert obiges Beispiel, jedoch mit folgender Änderung nicht:
while (outputMode)
{
PrintString(inputString);
}
|
Wobei PrintString in diesem Falle das gleiche machen soll wie oben:
void PrintString(char* pInputString)
{
PORTB = 0xFF;
}
|
Dann tritt das Problem auf was ich im ersten Post beschrieben habe und das Programm fängt wieder beim Eingabe mode an.
Datum:
Sieh dir mal an, wie andere das machen... Such insbesondere nach einer forever-loop im Stil von for(;;) oder while(1) Ein uC-Porgramm erreicht niemals das Ende der von main()
Datum:
Na gut da hast du recht, ich habe meinen eigentlichen unendlichen While loop später für den input verwendet und vergessen einen neuen zu schreiben. Also müssten die beiden while loops in einen unendlichen?
while (true)
{
while (inputMode)
{
...
}
while (outputMode)
{
...
}
}
|
Aber wie löst das mein Problem? Danke, Shibby