arduino delay wird ignoriert

OP #4862856
Hallo
Ich bin dabei 2 arduino nanos mit einander Kommunizieren zulassen über 
I2C.(PC lauscht zuerst noch mit)
Einer sendet der 2te nimmt es auf und zeig es auf ein Display an.
Der SENDER geht soweit auch.
Der Empfänger aber nicht so recht.
er macht auch was er soll bis auf die delay Wartezeit die überspringt er 
an jeder stelle.

Der rauscht einfach durch das geht so schnell das das Display immer nur 
für Bruchteile ein den letzten Buchstaben anzeigen kann.

Mir gehen die Ideen aus.
Als Anleitung hatte ich:
http://michaelsarduino.blogspot.de/2015/06/arduinos-zusammenschalten-uber-i2c.html
und das ist davon über.
Vielen DANK
1
#include <LiquidCrystal.h>
2
#include <Wire.h>
3

4

5
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
6

7

8

9

10
void setup() 
11
{
12
Serial.begin(9600);
13
Wire.begin(2);
14
Wire.onReceive(empfangen);
15
lcd.begin(16, 2);
16
}
17

18
void loop() 
19
{
20
  delay(1500);
21
}
22
  void empfangen (int anzahl)
23
  {
24
    while(1 <Wire.available())
25
    {
26
      char buchstaben = Wire.read();
27
      lcd.setCursor(0, 0);
28
      lcd.print(buchstaben);
29
      Serial.print(buchstaben);
30
      digitalWrite(13, HIGH);                      
31
   }
32
   delay(1500);
33
   lcd.clear();
34
    {
35
      char buchstaben = Wire.read();
36
      lcd.setCursor(0, 0);
37
      lcd.print(buchstaben);
38
      Serial.print(buchstaben);
39
      delay(1500);
40
      digitalWrite(13, LOW);    
41
      delay(1000); 
42
  }
43
}

--

Mit den [ c ] [ /c ] - Tags wirds etwas lesbarer, meinst Du nicht auch?
-rufus
Gast
Rufus Τ. F. schrieb:
> Hier fehlt es an anderen Dingen.
Richtig.

Z.B:
> Wire.onReceive(empfangen);

Diese CallBack Funktion wird von der I2C  ISR aufgerufen.
In "empfangen" wird Serial.print() aufgerufen.

Zwei Probleme:
1. delay() funktioniert nicht in ISR
2. Wenn der Serial Buffer voll ist, blockiert das Gebilde.
Denn: Beides nutzt selber Interruppts
OP
Arduino F. schrieb:
> Zwei Probleme:
> 1. delay() funktioniert nicht in ISR
> 2. Wenn der Serial Buffer voll ist, blockiert das Gebilde.
> Denn: beides nutzt selber Interruppts

>> zu1
Das dachte ich mir auch schon deswegen ichs ans ende gesetzt habe ändert 
aber nix.
Und beim sender gehts ja auch.

>>zu 2 ich übertrage zum testen 21 Zeichen welche auch fehlerfrei ankommen.
Soll ich das so verstehen das es keine gute Idee ist den PC mit lesen 
zulassen ?

Wenn ichs aufs DENKE ICH SO nötigste unterbreche :

void loop()
{
  delay(500);
}
  void empfangen (int anzahl)
  {
    while(1 <Wire.available())
    {
      char buchstaben = Wire.read();
      lcd.setCursor(0, 1);
      lcd.print(buchstaben);
   }
}

Wird die Übertragung genau EINMAL abgefragt und dann ist ende da kahm 
ich auf die idee
es 2mal abfragen zulassen seit dem gehts.(zumindest auf dem PC) das LCD 
Display zeigt seitdem gar nix mehr)
Da scheint er sich auch aufzuhängen.

Was mein Lebenslauf angeht da tauchen solch dinge gewiss nicht auf.
Gast
IncreasingVoltage .. schrieb:
> Wie wärs mit ner echten programmiersprache?!
> Ist mMn. sogar einfacher und universeller. Zu mal sich das auch im
> Lebenslauf unter "Hobbys" besser macht.
>
> Bei arduino lachen die dich aus... Ehrlich, fangt gleich mit was
> richtigem an, ist gar nicht so schwer! Tut euch den Gefallen.

Wie wärs, wenn du was zum Thema beiträgst und falls du dazu zu doof bist 
den Mund hältst?
Gast
Deine Einrückung verwirrt etwas.

So suggeriert es, empfangen() wäre irgendwie in loop().
Das ist es nicht.
Hoffentlich täuscht du dich nicht selber damit...

Deine  empfangen() ist eine eigenständige Funktion, gehört also auf die 
gleiche Ebene wie loop()


Naja, ich behaupte mal, dass LCD Ausgaben in der ISR auch böse sind.
Nicht, dass du immer nur die Buchstaben an eine Stelle schreibst...
Das kann ja noch gewollt sein.
Aber du klaust damit dem Hauptprogramm den Cursor unter dem Arsch weg..
Das wird dir noch massive Probleme bereiten.

Tipp:
In der ISR einfach nur die Daten annehmen.
Irgendwo speichern, z.B. ein globaler Puffer.
Und die Ausgabe dann im Hauptprogramm machen.

Wenn nötig eine Verriegelung bauen, so dass I2C keine Daten annimmt, bis 
der alte Datensatz abgearbeitet wurde.
Gast
hinz schrieb:
> IncreasingVoltage .. schrieb:
>> Wie wärs mit ner echten programmiersprache?!
>> Ist mMn. sogar einfacher und universeller. Zu mal sich das auch im
>> Lebenslauf unter "Hobbys" besser macht.
>>
>> Bei arduino lachen die dich aus... Ehrlich, fangt gleich mit was
>> richtigem an, ist gar nicht so schwer! Tut euch den Gefallen.
>
> Wie wärs, wenn du was zum Thema beiträgst und falls du dazu zu doof bist
> den Mund hältst?

Das folgende hat nichts damit zu tun, ob du recht hast, oder nicht:

Der IncreasingVoltage hat sich im Rahmen der, Foren üblichen, sozialen 
Kontrolle, einen Einlauf für die Dummheit eingefangen. Da jetzt nach zu 
treten könnte kontraproduktiv sein.
Bitte gib ihm Zeit zum überdenken und starte keine Eskalationsspirale.
OP
Vielen dank dir Arduino Fanboy!
Ich habe es jetzt mit funk und auch mit ISR weiter versucht.
aber es läuft immer darauf hinaus das das Display wie du schon sagtes 
nur das letzte zeichnen anzeigt.
Wie kann ich die Übertragung speichern ?
Ich dachte wird mit ((char)buf[i]) gespeichert aber woll nicht
Das ist jetzt mit funk.

#include <VirtualWire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
#undef int
#undef abs
#undef double
#undef float
#undef round

 void setup()
{
    Serial.begin(9600);
    lcd.begin(16,2);

 // Initialisieren Sie die IO und ISR
    vw_set_ptt_inverted(true);        // Ein und aus schalten
    vw_setup(600);                   // Bits pro sek
    vw_set_rx_pin(8);                // Pin Für Empfänger
    vw_rx_start();                   // Start den Receiver
}
void loop()
{
    delay(2000);
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;

    if (vw_get_message(buf, &buflen)) // sehen Ob alles eingegangen ist
    {
    int i;                            // Nachricht mit guter Checksumme 
erhalten.

    for (i = 0; i < buflen; i++)
    {
        Serial.print((char)buf[i]);
        lcd.begin(0,0);
        lcd.print((char)buf[i]);     // Werden die empfangenen Daten im 
Puffer gespeichert
        }
    Serial.println("");

     }
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.