arduino delay wird ignoriert

OP #4862856
Lesenswert?
• ▲
▼
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 #4862873
Lesenswert?
• ▲
▼
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 #4862891
Lesenswert?
• ▲
▼
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 #4862963
Lesenswert?
• ▲
▼
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 #4862970
Lesenswert?
• ▲
▼
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 #4862987
Lesenswert?
• ▲
▼
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 #4868182
Lesenswert?
• ▲
▼
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

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