Hallo Mag Gyver,
ich glaube ich habe einen entscheidenden Fehler gefunden...!
Nachdem ich nochmal deinen Post verinnerlicht habe,
habe ich mir nochmal meine Timer angeschaut.
Da ich 6 verschiedene Lüfter per PWM ansteuern möchte und ich dachte das die Standard PWM von 1KhZ für Timer0 nicht reicht
(was sie nach Tests aber doch tut),
habe ich die höher gesetzt. Für sämtliche Timings innerhalb meines Codes habe ich das auch berücksichtigt.
Woran ich nicht gedacht habe ist, dass die KNX Library anscheinend auch Befehle wie millis/micros nutzt...
Ich habe das jetzt mal wieder auf 1Khz zurückgestellt und siehe da,
seit 1ner Stunde kein einziges Reset TPUART, ... selten bekomme ich zwar noch UNKNOWN (ca. 2-3mal in 10minuten?) ...
Und das tollste überhaupt,
nun reagiert er, denke ich, auch auf jede KNX-Botschaft... JUHUUU, jetzt warens doch einige mehr Stunden, aber mein Prototypenaufbau steht jetzt...
Hier mal mein ganzer Code... ist sicherlich noch optimierungswürdig, aber erstmal läuft er...
Ich poste gleich nochmal den kompletten Code, falls jemand interesse hat..
Viele Grüße
Heiko
Ankündigung
Einklappen
Keine Ankündigung bisher.
ARDUINO am KNX
Einklappen
X
-
Hallo kettheik,
kein Problem.
Ja, bekomme auch ab und zu UNKNOWN-Telegrame (im Monat ca. 2-3 Stück).
Nein, ich bekomme nur bei Störungen auf dem KNX-Bus TPUART_RESET_INDICATION-Telegrame.
Der TP-UART im 5WG1 117-2AB12 hat eine KNX-Seite (9600 Baud) und eine serielle Schnittstellen-Seite (19200 Baud). An dieser Schnittstellenseite hängst du mit deinem Mikrocontroller (Arduino Uno) dran.
Zu dem Zweig UNKNOWN oder dem Zweig TPUART_RESET_INDICATION gibt es auch noch jede Menge andere Antworten.
Wenn du mit deinem Code, den TP-UART unbeabsichtigt falsch ansprichst oder zwischendurch irgendwelche Ausgaben auf der Schnittstelle machst (keine TP-UART-Befehle) kommt es zu solche Problemen. Wenn der Mikrocontroller ein Arduino Uno ist, geht nur die Kommunikation mit dem TP-UART über die serielle Schnittstelle. Alle anderen Befehle für die serielle Schnittstelle dürfen nicht verwendet werden. Desgleichen tritt auch auf wenn der Empfangspuffer der seriellen Schnittstelle des Mikrocontroller überläuft. Die UNKNOWN-Telegrame sind auch KNX-Telegrame, aber diese werden durch die Library nicht ausgewertet bzw. behandelt.
Woher bezieht dein Arduino Uno seine Spannung ?
Grundsätzliches im Code:
In "void setup()" : Alle Einstellungen treffen und TP-UART initialisieren (hilfreich ist nur hier das kontrollierte Einsetzen der "delay()" Funktion)
In "void loop()" : Dein Programm -> Hier kommen zum Beispiel deine Anweisungen DEBUGPRINT rein und das Setzen bzw. Rücksetzen von MikrocontrollerpinsCode:knx.addListenGroupAddress("9/2/0"); delay(1000); } // Ende void setup
In "void serialEvent()" : Die Abfragen der notwendigen bzw. der notwendigsten KNX-Telegramm
(je mehr Zeit der Mikrocontroller für die Abarbeitung dieser Funktion benötigt, desto wahrscheinlicher eines Empfangspufferüberlauf und damit verbundenen Problemme)
Der Zweig IRRELEVANT_KNX-Telegrame hat welche Sinn?
Am besten du machst dir eine Skizze, was dein Code alles können soll. Danach erarbeitest du eine Ablaufskizze und anschließend daran deinen Code.
Mit freundlichen Grüßen
Mag GyverZuletzt geändert von Mag Gyver; 18.09.2015, 03:17.
Einen Kommentar schreiben:
-
Hallo Mag Gyver,
vielen Dank..., mit 19200 komme ich jetzt ein wenig weiter...
Komisch ich dachte der KNX Bus läuft auf 9600 ???
Zumindest komme ich nun in alle Zweige rein...
Mir ist schon klar, dass ich aktuell da noch nichts wirklich auswerte... das dürfte aber ja kein Problem sein.
Mein Problem ist vielmehr, dass ich eben nicht nur in die Zweige
KNX_TELEGRAM und IRRELEVANT_KNX_TELEGRAM reinlaufe,
sondern eben auch in die Zweige UNKNOWN (was mich ja noch nicht mal stört, obwohl ich da am häufigsten reinlaufe (ca. 20mal in der Minute)
und vor allem auch den Zweig TPUART_RESET_INDICATION (... ca. 3mal in der Minute)
Und wenn ich das richtig deute, bedeutet dies, dass der TPUART resets macht...
Ich möchte halt keinen Busteilnehmer schaffen, der sich irgendwie ständig resetet.
Auch erfasse ich definitiv nicht immer das entsprechende Telegramm auf das ich hören möchte...
Also das ist schon ziemlich "suboptimal"...
Hast du noch ne Idee, oder andersrum gefragt, bekommst du auch diese TPUART Resets oder UNKNOWN Telegramme?
Code:void serialEvent() { if ( knx_startup_done ) { //Get Serial Event [B]KnxTpUartSerialEventType eType = knx.serialEvent();[/B] //Check Serial Event if (eType == [COLOR=#006400][B]KNX_TELEGRAM[/B][/COLOR]) { if(DEBUGPRINT==2) { if(led_gre_state==false) digitalWrite(LED_GRE, HIGH); if(led_gre_state==true) digitalWrite(LED_GRE, LOW); led_gre_state = !led_gre_state; } } else if ( eType == [COLOR=#808080][B]IRRELEVANT_KNX_TELEGRAM [/B][/COLOR]) { if(DEBUGPRINT==2) { if(led_whi_state==false) digitalWrite(LED_WHI, HIGH); if(led_whi_state==true) digitalWrite(LED_WHI, LOW); led_whi_state = !led_whi_state; } } else if ( eType == [COLOR=#FF8C00][B]TPUART_RESET_INDICATION [/B][/COLOR]) { if(DEBUGPRINT==2) { if(led_yel_state==false) digitalWrite(LED_YEL, HIGH); if(led_yel_state==true) digitalWrite(LED_YEL, LOW); led_yel_state = !led_yel_state; } } else if ( eType == [COLOR=#FF0000][B]UNKNOWN [/B][/COLOR]) { if(DEBUGPRINT==2) { if(led_red_state==false) digitalWrite(LED_RED, HIGH); if(led_red_state==true) digitalWrite(LED_RED, LOW); led_red_state = !led_red_state; } } else { ; } } }Zuletzt geändert von kettheik; 17.09.2015, 23:47.
Einen Kommentar schreiben:
-
Hallo kettheik,
ich habe ein paar Probleme gefunden.
Die KNX_BAUDRATE sollte 19200 betragen.
Die void serialEvent() werte alles mögliche aus, aber nicht das was du machen willst.
So hier mal das "void serialEvent()" welches ich auch benütze:
Zum Programmieren des Arduino musst du natürlich den TP-UART wieder entfernen (RxD und TxD),Code:void serialEvent() { KnxTpUartSerialEventType eType = knx.serialEvent(); if (eType == KNX_TELEGRAM) { KnxTelegram* telegram = knx.getReceivedTelegram(); // Telegramauswertung auf knx (immer notwendig fur empfangen) String target = String(0 + telegram->getTargetMainGroup()) + "/" + String(0 + telegram->getTargetMiddleGroup()) + "/" + String(0 + telegram->getTargetSubGroup()); // Auswertung der Gruppenadresse des empfangenen Telegrames und Zwischenspeicherung in Variable target // Die Zeilen in deinem Code bezüglich der Auswertung der Gruppenadressen gehen auch, // aber man muss eine Zahl in der Auswertung der Gruppenadresse eingeben, // von diesem Schema bin ich abgekommen, weil dies keine Mensch lesen/verstehen kann if (telegram->getCommand() == KNX_COMMAND_WRITE) { // Auswertung empfangenes KNX Telegrames mit Schreibbefehl (Flag) // *** if (target == "3/2/7") { // Auswertung empfangenes KNX Telegrames mit passender Gruppenadresse led_red_9_state = telegram->getBool(); // Übernahme des Inhaltes des KNX Telegrames in die Variable led_red_9_state } // *** // Der Abschnitt zwischen *** und *** wird pro benötigter Gruppenadresse notwendig } // oder für die Auswertung eines empfangene KNX Telegrames mit Lesebefehl (Flag) if (telegram->getCommand() == KNX_COMMAND_READ) { // Auswertung empfangenes KNX Telegrames mit Lesebefehl (Flag) // *** if (target == "3/2/7") { // Auswertung empfangenes KNX Telegrames mit passender Gruppenadresse knx.groupAnswerBool("3/2/7", led_red_9_state); // Senden des Inhaltes der Variable led_red_9_state auf das angegebene KNX Telegrames } // *** // Der Abschnitt zwischen *** und *** wird pro benötigter Gruppenadresse notwendig } } }
die Brücke am (ICSP1 Pin 5 mit ICSP1 Pin 6) muss ebenfalls entfernt werden und danach
den USB-Stecker ausstecken und wieder einstecken (Zwischen dem Ein- und Ausstecken ein bisschen Zeit vergehen lassen).
Deinen Code im "void loop ()" entsprechend anpassen, der kann so auch nicht funktionieren und achte darauf das du in
"void serialEvent()" nur das aller nötigste machst. Die Ansteuerungen der Ausgänge bitte in die "void loop ()" verlagern.
Wenn du selber Telegramme mit Lesebefehlen an den KNX verschicken möchtest, dann muss man die Libary entsprechend anpassen.
Mit freundlichen Grüßen
Mag GyverZuletzt geändert von Mag Gyver; 13.09.2015, 11:28.
Einen Kommentar schreiben:
-
Also ich habe jetzt nochmal alles hier im Forum durchsucht...
Ich bin der Meinung alles richtig verdrahtet und auch programmiert zu haben.
Leider ist es mit dem Uno sehr schwer zu "debuggen".
Habe dafür mal die LEDs genutzt... aber bei UNKNOWN Telegramtype wirds dann doch schwer.
Dachte es liegt an der Debugangabe des UART Treibers, aber die ist nicht aktiv.
Bin grad ziemlich gefrustet, da ich mir schon meine eigene KWL "ausgemalt habe" ...
Aber ohne lesende KNX Kommunikation wirds schwer...
;-(
Grüße Heiko
Zuletzt geändert von kettheik; 09.09.2015, 09:59.
Einen Kommentar schreiben:
-
Hallo,
ich versuche nun seit einiger Zeit das Auslesen von Telegrammen hinzubekommen.
Leider erfolglos. Hat von euch noch jemand eine Idee?
Ich setze den UNO R3 ein.
Senden geht ohne Probleme.
Aber egal welche GAs ich auch auslesen möchte, er geht immer in den Zweig UNKNOWN... d.h. LED9 leuchtet.
(siehe... else if ( eType == UNKNOWN ) im Codeblock!)
Im ETS Busmonitor sieht man aber schön, dass Telegramme auf dem Bus liegen (auch leuchtet die LED nur dann...!)
Hier mein Aufbau: (um das Bild sehen zu können muss man eingeloggt sein) IMG_1705.JPG
Hier mal mein Code:
GrußCode://////////////////////////////////////////////////////////// // KNX Project - HN // Receive Grouptelegrams and turn on/off coffee or doorbell // // Works with Arduino UNO (only tested with SMD-Edition) // Only one serial port is needed, no debug outputs! // Don't add Serial.println // After Upload the sketch you have to disconnect the Arduino UNO from PC // and shortcut the ICSP1 Pin 5 with ICSP1 Pin 6, Reset the Arduino Uno ////////////////////////////////////////////////////////// #include <KnxTpUart.h> // Define send interval #define SEND_INTERVAL_MS 3000 // Define KNX Baudrate #define KNX_BAUDRATE 9600 #define LED_RED_9 9 #define LED_RED_10 10 #define LED_GRE_11 11 #define LED_YEL_12 12 // Init Outputs int led_red_9_state = 0; int led_red_10_state = 0; int led_gre_11_state = 0; int led_yel_12_state = 0; // Initialize the KNX TP-UART library on the Serial port of Arduino Uno // and with KNX physical address 1.1.52 KnxTpUart knx(&Serial, "1.1.52"); unsigned long startTime; void setup() { // Initialize Bus with KNX Baudrate Serial.begin(KNX_BAUDRATE); // Even Parity UCSR0C = UCSR0C | B00100000; knx.uartReset(); //The Group Adresses you want to listen too knx.addListenGroupAddress("3/2/7"); knx.addListenGroupAddress("3/2/8"); knx.addListenGroupAddress("1/2/12"); //Output pinMode pinMode(LED_RED_9, OUTPUT); pinMode(LED_RED_10, OUTPUT); pinMode(LED_GRE_11, OUTPUT); pinMode(LED_YEL_12, OUTPUT); startTime = millis(); } void loop() { /* Hold the exact time delay */ if (abs(millis() - startTime) < SEND_INTERVAL_MS) { delay(5); // delay 5ms return; // end function } /* Switch on/off led9 = function */ if (led_red_9_state == 0) { //knx.groupWriteBool("0/0/1", 1); } else{ //knx.groupWriteBool("0/0/1", 0); } // Save last time stamp startTime = millis(); //Rest is wait for an Serial Event } void serialEvent() { //Get Serial Event KnxTpUartSerialEventType eType = knx.serialEvent(); //Check Serial Event if (eType == KNX_TELEGRAM) { led_gre_11_state=1; digitalWrite(LED_GRE_11, HIGH); delay(500); led_gre_11_state=0; digitalWrite(LED_GRE_11, LOW); // Get Data to Telegram structure KnxTelegram* telegram = knx.getReceivedTelegram(); // Now we have the telegram and can do whatever we want // Get TargetMainGroup int main = telegram->getTargetMainGroup(); // Get TargetMiddleGroup int middle = telegram->getTargetMiddleGroup(); // Get TargetSubGroup int sub = telegram->getTargetSubGroup(); // Create TargetGroupAddress int TargetGroupAddress(main*2048 + middle*256 + sub); //Turn on/off the doorbell "3/2/7" } else if ( eType == IRRELEVANT_KNX_TELEGRAM ) { led_yel_12_state=1; digitalWrite(LED_YEL_12, HIGH); delay(500); led_yel_12_state=0; digitalWrite(LED_YEL_12, LOW); } else if ( eType == TPUART_RESET_INDICATION ) { led_red_10_state=1; digitalWrite(LED_RED_10, HIGH); delay(100); led_red_10_state=0; digitalWrite(LED_RED_10, LOW); } else if ( eType == UNKNOWN ) { led_red_9_state=1; digitalWrite(LED_RED_9, HIGH); delay(100); led_red_9_state=0; digitalWrite(LED_RED_9, LOW); } else { ; } }
HeikoZuletzt geändert von kettheik; 09.09.2015, 09:52.
Einen Kommentar schreiben:
-
Passt soweit denke ich.bitte berichtigen oder ergänzen wenn es falsch ist.
Jepp, die PA wird normalerweise über ETS gesetzt. Aber da wir keine signierten Applikationen für die KNX Geräte mit Arduino erstellen können, kannst sonst nichts in ETS mit dem Arduino-KNX-Teil gemacht werden.Die PA wird doch normal über die ETS Software vergeben, war oder ist ja noch in der lip vorhanden, was genau macht eigentlich das Karduino Graphical Tool?
Das Karduino Tools Programm ist als grafisches Frontend für die KNX-on-Arduino Basteleien gedacht. Quasi ein "ETS für KNX-on-Arduino". Damit kannst du die PA, GA sowie die Parameter deines KNX-on-Arduino-Gerätes setzen.
Soviel wie du RAM-Speicher entbehren kannst. Momentan ist es so, dass die GAs im RAM gehalten werden. Kommt ein Telegram rein, wird mit den GAs im RAM abgeglichen und bei Bedarf darauf reagiert.Auf wie viele Gruppenadressen kann der karduino reagieren?
Man könnte die GAs auch rein in den EEPROM legen. Dann ist noch mehr Platz für GAs, aber dann kommt noch die Zugriffszeit auf den EEPROM hinzu. Und das kann, je nach Anwendung, zeitlich ungeschickt werden.
Jede GA im RAM belegt 2 byte. Je nach verwendeten Arduino variiert der zur Verfügung stehende RAM Speicher.
Entweder du führst sie überhaupt nicht in der ETS, oder eben mit Universal Modulen. Ich für meinen Teil führe sie in ETS gar nicht und hab eben in beiden Welten sich überschneidende GAs. Fertig.Wie werden die Karduino’s mit der ETS verknüpft, mit Universal-Modulen?
Die "lip" schreibt sich mit "b", wegen "library" und so ;-)Irgendwo gab es eine Liste mit den Datentypen die die lip kann, finde sie aber nicht mehr
Eine Liste hab ich nicht. Steht aber einigermaßen leserlich im Source: https://github.com/KNX-on-Arduino/Kn.../KnxTelegram.h
Ist mit dem Arduino alles möglich. Die Frage ist nur immer ob man feriges zusammensteckt und damit "mehr Platz" braucht, oder ob man die Platine mit Arduino und Co. selbst erstellt/fertigen lässt und damit deutlich kleiner wird.Hier mal ein kleine Auflistung was ich mit dem kleinen Burschen umsetzen würde, z.B. im Rauchmelder oder der UP-Dose untergebracht.
Alles in allem:
An Karduino ist noch einiges zu tun. Da hier gerade bedingt durch das "Sommerloch" andere Dinge bei den anderen wohl wichtiger waren, hab ich mich auch erstmal um anderes gekümmert. Aber der Versuchsaufbau liegt noch auf dem Schreibtisch und wartet darauf weiter gebastelt zu werden.
Einen Kommentar schreiben:
-
Sehr interessantes Projekt, ich bin vor gut einem Jahr auf den Beitrag gestoßen und habe wieder Lust bekommen an unserem Hausautomatisierungsprojekt zu basteln. Hardware besorgt, aufgebaut, und liegen gelassen :-(
Erstmal Danke und Glückwunsch für euer karduino, ich kann gut nachvollziehen was so ein Projekt bedeutet.
Kurz zu mir - Wir, zwei Freunde und ich habe vor einiger Zeit ein Profibus DP-Slave gebaut. Dieser Slave ist eine MSP430F2252 als Basis, programmiert in C, der mit einer SPS S7 kommuniziert. Ich habe vor 10 Jahren mit ETS2 schon einige Projekte umgesetzte aber dann ging es eher Richtung SPS.
Hier einige Links von & zu uns
http://www.sps-forum.de/feldbusse/15...ber-bauen.html
http://www.see-solutions.de/projekte/projekte.htm
http://www.mikrocontroller.net/topic/106174
Habe gesehen dass sich auch hier der Informationen von Jörg bedient wurde, der „KNX_Twisted_Pair_Protokollbeschreibung.pdf“ von See-Solutions.de
Schön wenn diese Informationen auch anderen helfen :-)
Hier gibt’s auch nochmal etwas zum Reverse Engineering KNX http://www.see-solutions.de/sonstiges/sonstiges.htm
Habe mich mal durch die mittlerweile vielen Seiten gelesen und dachte ich fasse es kurz zusammen, bitte berichtigen oder ergänzen wenn es falsch ist.
Projekt karduino = KNX on Arduino
Initiator war „ThorstenGehrig“ größtenteils weiterentwickelt von „JuMi2006“ und "tuxedo"
Projekt ist hier gehostet https://github.com/KNX-on-Arduino
Zur Hardware:
Arduino Nano/Mini/Leonardo/Mega/UNO über seriellen Schnittstelle mit dem TP UART (5WG1117-2AB12)
„JuMi2006“ entwickelt gerade eine Platine mit allem onboard für die UP-Dose, oder? -> Wie ist der Status?
Java Tool von tuxedo „Karduino Graphical Tool„ ist zum Einstellen der Physikalischen Adresse des Moduls sowie der Gruppenadressen und der Geräteparameter.
Nun haben sich einige Fragen bzw. Unklarheiten für mich aufgetan
Die PA wird doch normal über die ETS Software vergeben, war oder ist ja noch in der lip vorhanden, was genau macht eigentlich das Karduino Graphical Tool?
Auf wie viele Gruppenadressen kann der karduino reagieren?
Wie werden die Karduino’s mit der ETS verknüpft, mit Universal-Modulen?
Irgendwo gab es eine Liste mit den Datentypen die die lip kann, finde sie aber nicht mehr
groupWrite2ByteFloat
..
Hier mal ein kleine Auflistung was ich mit dem kleinen Burschen umsetzen würde, z.B. im Rauchmelder oder der UP-Dose untergebracht.
- Luftfeuchete/Temperatur VCO iaq-core
- Präsensmelder
- Einige E/A’s für Rollo’s, Lichtschalter, Fensterkontakte (evtl. auch ext. im Raum verbaut)
- Einige PWM für LED oder zur Ansteuerung der Heitzkreisverteiler (evtl. auch ext. im Raum verbaut)
- Klein für UP-Dosen oder Design für Rauchmelder
- kleines Display (evtl. auch ext. im Raum verbaut)
- Füllstand
- Wetterstation
- …
@ tuxedo: tolle Monologe ;-)
... weiter so
Zuletzt geändert von Johannes F; 17.08.2015, 15:10.
Einen Kommentar schreiben:
-
Danke
Die schau ich mir genauer an.
Das klingt ja nochmal besser.Zitat von tuxedo Beitrag anzeigenBzgl. Shield... JuMi bastelt bei sich den Arduino/AVR gleich drauf. Was Omegacontrol/Mario vor hat weiß man nicht.
Somit ist die iButton Hardware nur recycling?! :-)
Einen Kommentar schreiben:
-
Viel Speicher, viel RAM macht Sinn wenn du "viel" damit vor hast. Für kleine Dinge tut es auch ein Arduino Nano. Ansonsten würde ich zum Micro greifen.welcher Arduino ist am sinnvollsten?
Siehe letzte Frage.Welche AVR sollte drauf sein.
Ideal zum basteln ist ein Arduino mit zwei seriellen Schnittstellen: Eine für den Bus, und eine für die Debug-Konsole.
Bzgl. Shield... JuMi bastelt bei sich den Arduino/AVR gleich drauf. Was Omegacontrol/Mario vor hat weiß man nicht.
Einen Kommentar schreiben:
-
Bei 696 Beiträgen zu dem Thema, kann einem schon mal etwas schwindelig werden und die Evolutionsstufen sind tief vergraben.
Ich möchte mich auf den Winter vorbereiten und deshalb etwas Hardware beschaffen.
Somit ist meine Frage, welcher Arduino ist am sinnvollsten?
Welche AVR sollte drauf sein. (Es gibt ja aus China auch andere Formfaktoren vom Leonardo zum Beispiel)
Welcher Formfaktor hat am meisten potential, mit Hinblick auf das KNX-shield?
Der 1-wire iButton Beitrag hat mich noch mehr darin bestärkt, dass der Arduino ne tolle Ergänzung für meinen Bus wäre.
Ich hätte gerne einen SHT von Sensirion in meinen Bädern und das würde ich gern umsetzen wollen.
Danke
Gruß Stefan
Einen Kommentar schreiben:


Einen Kommentar schreiben: