Hallo :),
ich versuche zur Zeit von einer Steuerung ein Signal mit einem Arduino Uno über Infrarot zu Empfangen.
Die Steuerung hat kein bestimmtes Protokoll(zb. NEC usw) deswegen ist es mein Ziel vorerst die Daten(einzelne Bits) zu Empfangen und diese dann Später auswerten.
Hier ist mein Code wie ich es versuche einzele Bits auszulesen.
Das Problem ist ich bekomme von der Steuerung mindestens 1800 HIGH or LOW´s und diese
will ich in ein Array abspeichern damit ich später dann auswerten kann.
Jedoch bekomme ich diese Fehlermeldung:
Global variables use 4226 bytes (206%) of dynamic memory.
Mein Ram reicht nicht aus.
Habt ihr eine Idee wie ich trotzdem durch eine andere lösung zum gleichen Ergebins komme?
Und mein zweites Problem ist. Mein Code reagiert ja nur bei eine CHANGE(HIGH to LOW or LOW to HIGH). und ich weiß das ein Bit eine Länge von 850us hat.
Aber wenn ich jetzt zb von der Steuerung 00110011 Empfange wird aber von meinem Code nur 0101 ausgelesen.
Wie kann ich mein PIN jede 850us nach dem Zustand abfragen? Ich weiß das DigitalRead() zu langsam ist.
Vielen Dank für eure Hilfe im Voraus und bin sehr froh neues dazu zu lernen
Hier ist mein Code:
#define LEDPIN 2
int recvPin=2;
int x=0;
byte data[2500]; //bekomme von der Steuerung mindestens 1800 HIGH or LOW´s
void setup()
{
Serial.begin(115200);
attachInterrupt(0,Rec_Interrupt,CHANGE);
pinMode(LEDPIN,INPUT);
}
void loop() {
Serial.print(" Press the Button");
delay(5000);
if(x)
{
digitalWrite(LEDPIN,HIGH);
Serial.print(" Signal Empfangen");
detachInterrupt(0);
for(int i=0;i<x;i++)
{
Serial.print(data[i]);
}
x=0;
digitalWrite(LEDPIN,LOW);
attachInterrupt(0, Rec_Interrupt, CHANGE);
}
}
void Rec_Interrupt()
{
if(x%2==0)
{
data[x]=0;
}
else
{
data[x]=1;
}
data[x++];
}
byte data[2500];
Der UNO hat 2kB RAM. Das alleine ist schon mehr
Für die Anwendungen brauchst du einen Controller mit mehr RAM
Klar mein Dynamischer Speicher reicht nicht aus jedoch weiß ich nicht wie ich das lösen soll
Mit dynamischem Speicher hat das nichts zu tun
Wenn Du Dir Deinen Code anschaust, wirst Du merken, dass er verstümmelt ist.
Setze den Code bitte in Codetags (</>-Button oben links im Forumseditor). Bei dieser Gelegenheit kannst Du auch gleich die unnötigen Leerzeilen entsorgen und damit die Lesbarkeit erhöhen.
Gruß Tommy
Hi
Wenn Du doch BITs einliest, warum speicherst Du Diese dann in Bytes?
Das könnte Dir schon Mal 7/8tel der 2500 Byte einsparen (auf 312,5 Byte schrumpfen lassen).
Das Problem dürfte sein, sich auf die 850µs einzutakten.
Sonst könntest Du einen Timer 'nach 852 µs' zuschlagen lassen - also etwas später, als das Bit zuende wäre.
Der nächste 'Wachhund' sollte dann aber wieder nur die 850µs danach zubeißen, daß Du nicht aus dem Takt raus läufst, wenn 'jede Menge Nullen' kommen.
Mit jedem empfangenem Wechsel setzt Du Deinen Timer zurück auf Null bzw. beendest den Timer, wenn die Bits Alle gelesen sind.
MfG
Hi,
also ich habe es versucht mit dem Datentyp Bool abzuspeichern aber bin dann drauf gekommen das es genau so 1 Byte von meinem Ram verbraucht.
Ich werde mir ein Arduino Mega besorgen weil es anders nicht gehen wird.
Also ein Timer mit 852us bei der ersten Einlesung und bei den restlichen 850us.
hmmm ich werde mal versuchen das umzusetzen und hoff das es klappt.
LG
ein bool verbraucht auch ein Byte. Aber in diesem Byte kannst du 8 bit speichern und diese 8 bit sollst du Nutzen.
Warum musst du das überhaupt erst einlesen um zu parsen, warum kannst du das nicht so wie es reinkommt interpretieren?
Hi
850µs - pro µs macht der Arduino 16 Takte, die (Assembler-)Befehle brauchen aber teilweise mehr als einen Takt (Näheres im Datenblatt des verwendeten µC).
Wären 13600 Takte, in Denen man schon einiges anstellen könnte.
(Ok, etwas Luft sollte man sich lassen).
Wie sieht Es aus, wenn man ein Array von Typ bool erstellt?
Wobei - man kann sich auch eine Funktion basteln, Die genau Das macht - bitweise Bytes füllen und Diese ins Array packen.
(hatte jetzt aber schon gehofft, daß der Kompiler mehrere bool zusammen 'baut' um Diese in einem Byte unter zu bringen :o )
MfG
Hi,
doofe Frage gestattet ?
warum ließt du die Daten (bit´s nicht in einer Schleife ein 0-7 und schiebst die in ein Byte Arry. Jedes mal wenn die Schleife neu anfängt erhöhst Du den index des Arry.
1800/8 = 225 Byte.
wenn die E/A reichen kannst Du auch einen ESP8266-01 oder einen seiner grösseren Brüder nehmen die sind ziemlich flott un haben mindestens 1MB Speicher.
Heinz
Rentner:
oder einen seiner grösseren Brüder nehmen die sind ziemlich flott un haben mindestens 1MB Speicher.
Da war aber der Wunschtraum der Vater des Gedankens.
Da dieses Array im RAM liegt, ist die Menge sehr weit von 1 MByte weg - max. 96 kB RAM (technische Spec beachten) für RAM. Was Du meinst ist wohl Flashspeicher, da gibt es aber auch exemplare mit nur 512 MByte.
Gruß Tommy