mikrocontroller.net

Forum: Gesperrte Threads Irgendwie bekommen ich einen reset.


Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

: Verschoben durch Admin
Autor: flotter dreier (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeile 15 ist falsch.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
42

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deine ISR fehlt.

Autor: Shibby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:

Bewertung
0 lesenswert
nicht lesenswert
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 (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mach bitte keine 2 Threads zum selben Thema auf.

Beitrag "Unerklärter Reset"

Danke

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.