Modul antwortet nur nach Neuprogrammierung des Controllers

Gast #1920109
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:
1
void VRBOT_init()
2
{
3
  check_ID();
4
  lcd_clear();
5
  lcd_string("ID checked!");
6
  _delay_ms(WARTEZEIT);
7

8
  ack_test();
9
  lcd_clear();
10
  lcd_string("ack tested!");
11
  _delay_ms(WARTEZEIT);
12

13
  set_language();
14
  lcd_clear();
15
  lcd_string("language OK");
16
  _delay_ms(WARTEZEIT);
17

18
  set_timeout();
19
  lcd_clear();
20
  lcd_string("timeout OK!");
21
  _delay_ms(WARTEZEIT);
22
  lcd_clear();
23
}

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:
1
void check_ID()
2
{
3
  uart_putc('x');
4
  while(zuletzt_empfangen != 'x')
5
  {
6
    zuletzt_empfangen = 0;
7
    zuletzt_empfangen = uart_getc();
8
  }
9
}

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
Angehängte Dateien:
#1920283
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
#1920450
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
Gast #1920947
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren