mikrocontroller.net

Forum: Compiler & IDEs Modul antwortet nur nach Neuprogrammierung des Controllers


Autor: Andy S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Wie die meisten schon wissen arbeite ich mit dem VRBOT Modul. Jetzt 
funktiort die Erkennung zwar, aber ein anderes Problem, das ich vor 
nicht so langem auch gehabt habe aber irgendwie wieder behoben habe, ist 
jetzt wieder aufgetaucht:

Ganz am ANfang meines Programms muss ich das Modul initialisieren. Dafür 
habe ich eine FUnktion geschrieben:
void VRBOT_init()
{
  check_ID();
  lcd_clear();
  lcd_string("ID checked!");
  _delay_ms(WARTEZEIT);

  ack_test();
  lcd_clear();
  lcd_string("ack tested!");
  _delay_ms(WARTEZEIT);

  set_language();
  lcd_clear();
  lcd_string("language OK");
  _delay_ms(WARTEZEIT);

  set_timeout();
  lcd_clear();
  lcd_string("timeout OK!");
  _delay_ms(WARTEZEIT);
  lcd_clear();
}

Die einzelfunktionen werden ausgeführt wenn ich den Controller 
programmiere.

Wenn ich aber die STK500(Wo auch das Sprachmodul hängt) aus und wieder 
einschalte, so sehe ich lediglich "Willkommen zur Spracherkennung" und 
ich hänge dann in dieser Schleife fest:
void check_ID()
{
  uart_putc('x');
  while(zuletzt_empfangen != 'x')
  {
    zuletzt_empfangen = 0;
    zuletzt_empfangen = uart_getc();
  }
}

Weiß jemand was ein solches Verhalten auslösen könnte?
Ich wäre sehr Dankbar für jeden Rat, weil mich so etwas einfach wundert 
und ich das Problem lösen möchte.

lg andy

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie die meisten schon wissen arbeite ich mit dem VRBOT Modul.

Das weiss vermutlich keiner. Oder glaubst du ernsthaft das
sich irgendeiner einen deiner Posts länger als 10s merkt?

SCNR;)

Autor: Andy S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Das weiss vermutlich keiner. Oder glaubst du ernsthaft das
> sich irgendeiner einen deiner Posts länger als 10s merkt?

Entschuldigung, das war nur eine Annahme.
Werde ich so nicht mehr dazuschreiben.

lg andy

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy S. schrieb:
> Werde ich so nicht mehr dazuschreiben.

Wenn Deine Frage in Zusammenhang mit einem früheren Thread steht, dann 
ist es durchaus ratsam, das zu zeigen. Allerdings sollen dann die Leser 
nicht raten oder suchen müssen.

Also einfach nen Link auf den anderen Thread posten, dazu sind Links 
nämlich da und das ist der übliche Weg im Internet. Alles andere ist 
gelinde gesagt unhöflich.



Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy S. schrieb:
> ich hänge dann in dieser Schleife fest:
> void check_ID()
> {
>   uart_putc('x');
>   while(zuletzt_empfangen != 'x')
>   {
>     zuletzt_empfangen = 0;
>     zuletzt_empfangen = uart_getc();
>   }
> }

Da sind einige Bomben drin.

1.
Wenn der erste Empfang fehlschlägt, wartest Du ewig und sendest auch 
nichts neu. Du must für den Empfang ein Timeout festlegen und dann 
nochmal zu senden versuchen.

2.
Vor dem Empfang zu vergleichen ist witzlos.
Du mußt erst empfangen und dann vergleichen, also nimm ne do..while 
Schleife.

3.
Wenn Du 2 Zuweisungen machst, ohne die erste auszuwerten, ist das 
witzlos.
Warscheinlich wird der Compiler das "zuletzt_empfangen = 0;" sogar 
wegoptimieren. Also schreib es garnicht erst hin.

4.
Der Code für die UART fehlt. Es kann sein, daß beim Einschalten des Pins 
eine Flanke entsteht und dann das 1.Zeichen verstümmelt.
Nach dem Initialisieren der UART sollte man ruhig noch eine Byte-Zeit 
(10 Bits) warten.

5.
Es kann auch sein, daß der andere Chip einfach noch nicht bereit ist. 
Mal ins Datenblatt schauen.


Peter

Autor: Andy S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn der erste Empfang fehlschlägt, wartest Du ewig und sendest auch
>nichts neu. Du must für den Empfang ein Timeout festlegen und dann
>nochmal zu senden versuchen.

Sehr gut, das war es.

>Wenn Du 2 Zuweisungen machst, ohne die erste auszuwerten, ist das
>witzlos.
>Warscheinlich wird der Compiler das "zuletzt_empfangen = 0;" sogar
>wegoptimieren. Also schreib es garnicht erst hin.

Stimmt, muss ich dir recht geben!

>Vor dem Empfang zu vergleichen ist witzlos.
>Du mußt erst empfangen und dann vergleichen, also nimm ne do..while
>Schleife.
Also ich würde das nicht als einen groben Fehler sehen.
Die Abfrage wäre in beiden Fällen zum richtigen Zeitpunkt geschehen.
Außer wenn ich zu einem vorherigen Zeitpunkt schon ein x empfangen habe.

Danke!

lg andy

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.