Forum: Mikrocontroller und Digitale Elektronik Interrupt UART mit Bluetooth wir zu oft ausgelößt


von Andreas M. (burns)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein Problem mit meinem Bluetoothmodul und dem UART (RX) 
Interrupt.
Ich möchte von meinem BT Modul einzelne Zeichen empfangen und diese in 
einen Puffer schreiben. Leider funktioniert das nicht richtig.



Hier mein Programmcode:


ISR(USART_RXC_vect)
{

       int8_t Recive_Sign,i=0;
       Recive_Sign=UDR;
       // uart_putc(Recive_Sign);     // test für direkte Rückgabe

       //********************  speichern  der Daten in 
Puffer*********************



     while (i<4)
     {
           Telegramm[i]=Telegramm[i+1];
           i++;
     }
     Telegramm[4]=Recive_Sign;

......hier geht mein Code weiter der zu Testzwecken mit "UART_putc" alle 
Telegrammvariablen des Array ausgegeben hat.


Das Verhalten sieht so aus, dass ich einen Buchstaben an den Controller 
sende und nach meiner Erwartung sollte der in Telegramm[4] zu finden 
sein. Sende ich noch eines sollte der erste Buchstabe in Telegramm[3] 
rutschen und in Telegramm[4] der neu empfangene stehen.
Mein Verhalten ist nun so ich sende einen Buchstaben und der tauscht 
sofort auf allen Telegrammvariablen auf. Scheinbar wird der Interrupt 
mehrfach aufgerufen.

Auf Grund dessen hatte ich eine einfache Zählvariabe im interrupt 
angelegt und diese wurde scheinbar bei einem gesendeten Zeichen auch 
mehrfach gezählt.

Kann ich sicherstellen das der Inerrupt nur 1 mal abgearbeitet wird?

von Thomas Beck (Gast)


Lesenswert?

deklariere Telegramm[] als

volatile int8_t Telegramm[5];

das hilft auf jeden Fall einen Schritt weiter oder ist schon die ganze 
Lösung. Den Rest vom Code habe ich nicht weiter angeschaut.

von Andreas M. (burns)


Angehängte Dateien:

Lesenswert?

Hallo,

schon mal danke für die Antwort. Leider brachte es noch nicht den 
Erfolg.
Ich habe aber das System erkannt, nun hängt es nur noch an der Lösung 
:-).


Ich habe mal einen Screenshot von meinem Handy welches als Sender der 
daten genutzt wird.

Die blauen Zahlen sind die Signale die ich gesendet habe die grünen sind 
die Antworten vom Controller = der Inhalt meiner Telegramm Variable.

Ich habe eine 1 gesendet und diese bekomme ich auch in meinem 
Antworttelegramm zuerst (Telegramm[4]- Variable) zurück.

Als zweites habe ich eine 2 gesendet. Die 1 rutscht eine Stelle weiter 
(Telegramm[3]) und die 2 kommt in Telegramm[4]. Aber wie mann sieht 
bekomme ich nun als letzte 3 Werte immer 2 und 1 im wechsel. 
Normalerweise sollten da noch die 5 und 1 aus dem oberen Pufferinhalt 
stehen.

Dieses Verhalten ist immer gleich. Bei jedem 2 Durchlauf überschriebt er 
mir den Inhalt des Puffer an den letzten 3 Stellen (Telegramm[2..0]).

von Jim M. (turboj)


Lesenswert?

Woher weisst Du dass Dein Terminal nicht auch noch ein \r\n als 
Zeilenende anhängt?

von Andreas M. (burns)


Lesenswert?

Hallo,
das wars!
Das Terminal hat den Zeillenumbruch mit ausgegeben.
In den Setting vom Terminal konnte man es einstellen. Ohne den 
funktioniert es. Danke

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.