www.mikrocontroller.net

Forum: Gesperrte Threads Irgendwie bekommen ich einen reset.

Autor: Shibby (Gast)
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
Autor: flotter dreier (Gast)
Datum:

Zeile 15 ist falsch.
Autor: Mark Brandis (markbrandis)
Datum:

42
Autor: Gast (Gast)
Datum:

Deine ISR fehlt.
Autor: Shibby (Gast)
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.
Autor: Lothar Miller (lkmiller) Benutzerseite
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()
Autor: Shibby (Gast)
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
Autor: Karl Heinz Buchegger (kbuchegg) (Moderator)
Datum:

Mach bitte keine 2 Threads zum selben Thema auf.

Beitrag "Unerklärter Reset"

Danke
Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.
webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net