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
LiquidCrystallcd(12,11,5,4,3,2);
6
7
8
9
10
voidsetup()
11
{
12
Serial.begin(9600);
13
Wire.begin(2);
14
Wire.onReceive(empfangen);
15
lcd.begin(16,2);
16
}
17
18
voidloop()
19
{
20
delay(1500);
21
}
22
voidempfangen(intanzahl)
23
{
24
while(1<Wire.available())
25
{
26
charbuchstaben=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
charbuchstaben=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
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.
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
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.
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?
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.
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.
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("");
}
}