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


von Andy S. (Gast)


Angehängte Dateien:

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

von holger (Gast)


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;)

von Andy S. (Gast)


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

von Peter D. (peda)


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

von Peter D. (peda)


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

von Andy S. (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.