Forum: Mikrocontroller und Digitale Elektronik arduino delay wird ignoriert


von DAVID B. (bastler-david)


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

: Bearbeitet durch User
von IncreasingVoltage .. (increasingvoltage)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Programmiersprache selbst ist nicht das Problem, die ist auch bei 
Arduino & Co. C++.

Hier fehlt es an anderen Dingen.

von Einer K. (Gast)


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

von DAVID B. (bastler-david)


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.

: Bearbeitet durch User
von hinz (Gast)


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?

von Einer K. (Gast)


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.

von Einer K. (Gast)


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.

von DAVID B. (bastler-david)


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

     }
}

von Kit Dealer (Gast)


Lesenswert?

Hier 2 vollwertige Gratismuster an Auszeichnungstags:
]][[/ccddeeoo
]][[/ccddeeoo

von Teee (Gast)


Lesenswert?

das lcd.begin in der schleife ist falsch.
Du überschreibst so das Zeichen immer wieder in der Schleife. Du musst 
dann auch den Cursor mit bewegen.

von DAVID B. (bastler-david)


Lesenswert?

SUPER vielen dank da hocke ich stunden lang an der einen Sache und ein 
umsetzten von begin bringt den erfolgt :-)
Vielen dank.

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.