Hallo,
da sich, wenn man z.B. gleichzeitig Multiplexen und IR-Signale oder Serial-Signale verarbeiten möchte, oder z.B. eine SD-Card auslesen will,
die verschiedenen Libs in die Quere kommen und/oder ein einzelner Arduino das einfach nicht parallel machen kann,
würde ich gerne 4 8x8-RGB-LED-C.A.-Matrizen seperat multiplexen, sodass ich mit dem Arduino nur die RGB-Werte sende
und gleichzeitig noch z.B. eine SD-Karte auslese, um z.B. Frames auf die Matrix zu laden.
Dazu bräuchte ich schätz ich mal einen weiteren Chip, aber wie genau soll ich das am besten und kostengüstigsten machen?
Hallo.
Bin mir nicht sicher, ob ich deine Frage richtig verstanden habe.
"Gleichzeitig" gibt es nicht. Ich kenne zwar deinen Code nicht, aber ich denke, du hast generell Probleme mit dem Timing.
Da hilft eine so genannte Time-Machine Abhilfe.
Sieh dir mal das Thema Timer Interrupt an: Arduino Playground - HomePage
Statt wie in dem Beispiel Code:
#include "TimerOne.h"
void setup()
{
pinMode(10, OUTPUT);
Timer1.initialize(500000); // initialize timer1, and set a 1/2 second period
Timer1.pwm(9, 512); // setup pwm on pin 9, 50% duty cycle
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
}
void callback()
{
digitalWrite(10, digitalRead(10) ^ 1);
}
void loop()
{
// your program here...
}
Könnte so eine Time-Machine in etwa so aussehen.
(NUR BEISPIELHAFT! NICHT GETESTET!)
1. #include "TimerOne.h"
2. volatile int sd_lesen = 0;
3. volatile int rgb_refresh = 0;
4. volatile int v_warte = 0; // statt delay()
5.
6. // und noch weitere Variablen, die du für dein Timing brauchst...
7. int daten_gelesen =0;
8. void setup()
9. {
10.
11. Timer1.initialize(1000); // 1 millisekunde
12. Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
13. }
14.
15. void callback()
16. {
17. sd_lesen++;
18. rgb_refresh++;
19. v_warte++;
20. }
21.
22. void loop()
23. {
24. // your program here...
25. // nur als Beispiel!!!
26.
27. // alle 20 Millisekunden von sd lesen…
28. if(sd_lesen == 20 && daten_gelesen == 0){
29. sd_karte_lesen();
30. daten_gelesen = 1;
31. rgb_refresh = 0;
32. }
33. // damit werden alle 40 Millisekunden die LEDs updated
34. // = 25 Bilder pro sekunde
35. if(daten_gelesen == 1 && rgb_refresh == 20)
36. {
37. daten_gelesen = 0;
38. rgb_refresh();
39. }
40. // und es bleibt genug Zeit für alles mögliche...
41.
42. // hier noch ein Ersatz für die delay() Routine;
43. // aufruf:
44. // v_warte =0; // muss vorher auf null gesetzt werden
45. // warte(100); // warte 100 milisekunden
46. void warte(int wielange) {
47. while (v_warte != wielange) {}
48. }
49.
50. void sd_karte_lesen() {
51. sd_lesen = 0;
52. // dein Code zum lesen von der SD Karte...
53. }
54. void rgb_update()={
55. rgb_refresh = 0;
56. // dein Code für den demultiplexer...
57. }
Was das Demultiplexing angeht, so lassen sich mehrer Demultiplexer in reihe Schalten. Tutorials gibt es dazu einige im Netz.
Falls ich deine Frage falsch verstanden habe, tut es mir leid. Dann vergiss was ich geschrieben habe.
Aber ich glaube, was ich vergessen habe zu sagen ist, dass ich TLCs verwende, und somit der Arduino die ganze Zeit damit beschäftigt ist, die PWM-Signale zu generieren, sowie zu multiplexen.
Es ist ohne umschreiben der Libraries nicht möglich, parallel zum TLC-Multiplexen z.B. noch Infrarot-Signale auszulesen.
Also möchte ich das TLC-Multiplexen, sprich das erzeugen der PWM-Signale etc. auf externe Hardware auslagern, damit der Arduino andere Aufgaben übernehmen kann.
Ja, das ist mir klar, aber kann man das auch irgendwie kostengünstiger machen?
Z.B. mit nur nem Mikrochip, paar Kerkos und nem Quartz oder wie auch immer man das macht?
Du kannst nach dieser Anleitung einen ATmega auf einer Lochraterplatine aufbauen: http://arduino.cc/en/Main/Standalone
oder eine Minimalvariante des Arduino wie zB Arduino mini oder Arduini PRO Mini
Grüße Uwe
Hmmm...
Wenn ich mir einen 2ten Arduino kaufe, kann ich dann z.B. Frames von einer SD lesen
und auf die Matrix multiplexen oder IR-Signale "live" auswerten und dementsprechend etwas auf der Matrix anzeigen?
Ich weiß nicht genau, wie du das meinst, aber ich habe einen Sainsmart Mega, an den ich 4 RGB-LED-Matrizen anschließen möchte.
Dieser ist dann für das Multiplexen und PWM-Signal-Generieren zuständig.
Und jetzt brauche ich einen zweiten, der dem Mega sendet, was er auf der 16x16 Matrix darstellen soll.
Der zweite soll diese Info z.B. von einer SD-Karte lesen und die Frames nach einander an den Mega senden, sodass dieser die Frames darstellt.
Ist das möglich?