Aktuelle Zeit: 28.09.2016, 05:21:52

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 10.10.2010, 02:09:54 
Offline

Registriert: 29.09.2010, 18:06:17
Beiträge: 10
Ich habe die Firmware der USB-Relaiskarte um eine Reihe von Verbesserungen erweitert, um das Gerät flexibler einsetzen zu können. Dabei habe ich die Tatsache ausgenutzt, dass für die Relais nur die Bits 1 bis 6 verwendet werden, so dass die Bits 7 und 8 besondere Bedeutungen bekommen konnten.

Inputstatus nur bei Änderung senden

Wie manfred hatte auch ich ein Problem damit, dass ein anliegendes Input-Signal permanent übermittelt wird. Das ist nun anders, der Input-Status wird nur noch bei Änderungen übermittelt. Im Unterschied zu seiner Lösung erfolgt bei mir aber auch keine periodische Wiederholung, solange diese nicht explizit angefordert wird.

Togglen von Eingängen (Bit 7)

Wenn das Bit 7 aktiviert ist (0x40), dann werden die Bits 1 bis 6 als "Toggle"-Befehl gedeutet. Beispiel: 0b01010001 bedeutet, dass der Status von Relais 1 und 5 geändert wird. Die Anderen bleiben wie sie sind. 0b01111111 wechselt den Status aller Relais, 0b01000000 bleibt ohne jeden Effekt.

Abfrage des Portstatus (Bit 8 )

Manchmal ist es sinnvoll erfragen zu können wie die Relais aktuell geschaltet sind. Und da der Input-Status nun nicht mehr permanent gesendet wird, möchte man diesen nun womöglich auch explizit abfragen können. Deshalb dient Bit 8 (0x80) nun dazu, im Anschluss an den aktuellen Befehl den Status von Input- und Output-Ports zurückzugeben.

Um den Status zu erfragen ohne ihn zu ändern kann man das Status-Bit 8 mit dem Toggle-Bit 7 kombinieren und 0b11000000 (= 0xC0) senden. Dies bedeutet: "Toggle nichts, und gib mir anschließend den Status der Ports zurück".

Damit das lesende Programm Input- und Output-Ports voneinander unterscheiden kann ist beim Output-Port das Bit 8 aktiviert. Sind zum Beispiel die Relais 2, 3 und 5 aktiviert, und am Optokoppler 4 liegt ein Signal an, so sähe die Antwort auf ein 0xC0 so aus:

>>> 0b11000000 (Status erfragen)
<<< 0b10010110 (Bit 8 = 1: Status der Relais)
<<< 0b00001000 (Bit 8 = 0: Status der Eingänge)

Initialisierung zum Schutz vor Hardwareerkennung

Wie bereits von Lucky001 berichtet habe auch ich das Problem, dass die Relais beim ersten Einstecken zufällige Umschaltungen vornehmen. Vermutlich liegt es an der Hardwareerkennung des Betriebssystem, die das angeschlossene Gerät zu identifizieren versucht.

Der angehängte Patch löst das Problem, in dem er initial eine Sequenz von 16 aufeinanderfolgenden 0xC0-Bytes erwartet, bevor Eingaben akzeptiert werden. Der Vorteil dieser Variante ist, dass sie in keinem Fall eine Änderung der Relais verursacht, auch wenn die Relaiskarte bereits initialisiert sein sollte. Im schlimmstem Fall werden halt nur 2*16 Bytes für die angefragten Port-Stati gesendet.

@Ulrich: Vielen, vielen Dank für dieses geniale Projekt :-)

Update 11.10.2010:
Den initFrames-Zähler nun jedesmal zurücksetzen, wenn die usbDeviceAdr == 0 ist. Dies deutet nämlich darauf hin, dass die Platine zwischenzeitlich vom PC getrennt war oder dieser neu gestartet wurde. Auch dann muss der Hardware-Erkennungsversuch des Betriebssystems geblockt werden. Hierfür war es notwendig, die Variable "usbDeviceAdr" aus der usbdrv/usbdrv.c als "extern" zu deklarieren. Um den Code von usbdrv nicht zu modifizieren erfolgt dies in der usbconfig.h, die von beiden C-Dateien inkludiert wird.

Bei der Gelegenheit auch gleich USB_CFG_IS_SELF_POWERED auf 1 gesetzt, da wir die Spannungsversorgung der USB-Schnittstelle nicht benötigen und dies dem Controller auch mitteilen sollten :-)


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 10.10.2010, 22:59:20 
Offline

Registriert: 29.09.2010, 18:06:17
Beiträge: 10
Ich frage mich gerade, ob das Toggle-Bit in der Praxis wirklich so sinnvoll ist. Wenn man auf die Kompatibilität zur bisherigen Firmware komplett verzichten würde, könnte man das Bit 7 vielleicht als Befehl "aktivieren (1)" bzw. "deaktivieren (0)" interpretieren, der dann auf die angegebenen Relays angewendet wird. Der Vorteil wäre, dass man gezielt einzelne Relays steuern kann, ohne dass man den aktuellen Zustand kennen muss. Der Nachteil, dass es zur bisherigen Implementierung nicht mehr kompatibel wäre und man Relays nicht mehr gleichzeitig ein- und ausschalten kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 21.11.2010, 21:54:35 
Offline

Registriert: 21.11.2010, 21:28:34
Beiträge: 5
Hi,
irgendwie stehe ich wohl etwas auf dem Schlauch aber ich bekomme deine Änderungen nicht komplett zum laufen.

Was zum Teil funktioniert sind die Eingänge. Zum Teil, weil es nicht so reagiert, wie ich es erwarte. Wenn ich am Eingang eine Spannung anlege, wird der entsprechende Port übermittelt. Anschließend gleich aber wieder die 0. Wenn ich die Spannung wegnehme, wird keine Änderung übermittelt. Wenn ich wieder Spannung an den gleichen Pin anlege, reagiert dieser nicht, erst wenn ich zuvor einen anderen Eingang verändert habe.
Ich habe in Zeile 394 das else if von (*a != lastSentFrame && ((PIND&0x1b) > 0 || sendEmptyFrame)) durch (*a != lastSentFrame || sendEmptyFrame) ersetzt und es ist fast das, was ich mir wünsche ( teilweise werden noch Meldungen doppelt gesendet, das kann ich aber verkraften).

Und was bei mir überhaupt nicht geht ist ein Relais zu schalten.
Ich hatte mir für die original Radig Version ein Mono Programm geschrieben, das entsprechend auf den Seriellen Port die Werte 0 bis 63 ausgibt. (Was hier auch interessant ist, das der Wert 192 dazu führt, dass alle Ports eingeschaltet sind?!? Wie auch immer...)
Wenn ich jetzt 16 mal 0xC0 ( (char) 192 ) an deine Softwareversion der Relaiskarte schicke passiert überhaupt nichts. Soweit auch ok. Jedoch kann ich danach schicken was ich will, an den Relais tut sich nichts.

Gepatcht habe ich die original Software, indem ich die usbconfig.h und main.c Datei durch deine ersetzt habe. Einstellungen lfuse 0x9F , hfuse 0xC9

Ich wäre Dankbar für jede Hilfe :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 24.11.2010, 18:36:46 
Offline

Registriert: 29.09.2010, 18:06:17
Beiträge: 10
Hi,

sorry dass ich erst ein paar Tage später antworte, die Mail-Benachrichtigung scheint nicht richtig zu funktionieren - hab deinen Eintrag nur zufällig gesehen.

f4n hat geschrieben:
Und was bei mir überhaupt nicht geht ist ein Relais zu schalten.
Ich hatte mir für die original Radig Version ein Mono Programm geschrieben, das entsprechend auf den Seriellen Port die Werte 0 bis 63 ausgibt. (Was hier auch interessant ist, das der Wert 192 dazu führt, dass alle Ports eingeschaltet sind?!? Wie auch immer...)
Wenn ich jetzt 16 mal 0xC0 ( (char) 192 ) an deine Softwareversion der Relaiskarte schicke passiert überhaupt nichts. Soweit auch ok. Jedoch kann ich danach schicken was ich will, an den Relais tut sich nichts.

Gepatcht habe ich die original Software, indem ich die usbconfig.h und main.c Datei durch deine ersetzt habe. Einstellungen lfuse 0x9F , hfuse 0xC9

Ich wäre Dankbar für jede Hilfe :)


Das Relais mit dieser Version ist nun schon seit Wochen im täglichen Einsatz, ohne dass ich ein solches Verhalten beobachtet hätte. 192 sollte aber schon auf der Original-Firmware nicht alle Relais einschalten, sondern nur das erste Relais. In der Modifikation müsste es das gleiche tun und zusätzlich noch den aktuellen Zustand zurückschicken.

Kannst du ausschließen, dass es ein Fehler an der Verdrahtung ist? Hast du die Spannung an den Ausgangspins zum Beispiel mal nachgemessen? Ich hatte auch mehrfach Probleme mit dem ULN 2003A, der extrem empfindlich auf meinen Lötkolben reagierte und sich danach sehr merkwürdig verhalten hat. Letztendlich hab ich den Chip auf einen Sockel verfrachtet und seit dem Ruhe.

Meine Fuse-Einstellungen waren lfuse: 0xcf hfuse: 0xd9. Ich habe auch mal das Python-Programm angehängt, mit dem ich die Karte ansteuere. Neben Python benötigst du dafür auch die pySerial-Bibliothek.

Bitte schreib mir ggf. ne PM, falls das Benachrichtungssystem hier wieder nicht funktioniert. Oder über das Kontaktformular in meinem Blog ( http://www.blogs.uni-osnabrueck.de/rota ... ich-radig/ ).


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 24.11.2010, 22:27:09 
Offline

Registriert: 21.11.2010, 21:28:34
Beiträge: 5
also wenn mir das einer erzählt hätte, hätte ich ihn für bekloppt gehalten ;)
ich habe das problem gefunden und vielen dank für dein python programm. ich habe nicht schlecht geschaut, als ich das ausprobiert habe und es direkt geklappt hat. das problem war natürlich die mono seite.
ich habe serial.Write("" + (char) 0xC0) benutzt, was bisher auch seltsamerweise problemlos funktioniert hat (0 - 63). nur wenn mann z.b. 192 auf die karte gegeben hat, verhielt es sich seltsam und schaltete alle kanäle.

benutze ich serial.Write ( new byte[] {0xC0}, 0, 1 ) funktioniert es tadellos.

das problem ist hier wohl, dass der string nicht als bytes geschickt wird... warum auch immer.

nochmals vielen dank für dein programm und natürlich auch die optimierungen. gerade der reset bei einem power loss ist mir viel wert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 14:59:53 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
Hallo Cybso,

Hab die Relaiskarte aufgebaut und mit deiner Firmare geflasht. Die Karte soll (wenn sie denn mal funktioniert) an einem Debian System seine Arbeit verrichten. Ich wollte dein Script gerade zum Testen hernehmen, doch leider bekomme ich folgende Meldung:

Code:
addeb010:~# ./relaisboard_py_cybso.py
  File "./relaisboard_py_cybso.py", line 237
    except Exception as ex:
                      ^
SyntaxError: invalid syntax


Da ich von python kein plan habe, komme ich damit nicht weiter. könntest du mir ein Tip geben wo es dran liegt? Python und die pySerial-Bibliothek sind Installiert

Gruß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 15:25:49 
Offline

Registriert: 29.09.2010, 18:06:17
Beiträge: 10
Welche Python-Version hast du installiert? Ich hab hier 2.6.4, ich könnte mir vorstellen, dass ältere Versionen Probleme mit dieser Syntax haben.

Eventuell klappt es, wenn du die betroffene Zeile durch "except Exception, (ex):" ersetzt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 15:37:21 
Offline

Registriert: 21.11.2010, 21:28:34
Beiträge: 5
bei mir hat es unter debian problemlos funktioniert.
Code:
apt-get install python python-serial


in der python shell
Code:
from sys import version_info
version_info


sagt mir version (2, 6, 6, 'final', 0)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 16:51:29 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
f4n hat geschrieben:
Code:
apt-get install python python-serial


in der python shell
Code:
from sys import version_info
version_info


sagt mir version (2, 6, 6, 'final', 0)


hab ich genau so gemacht! Bei mir allerdings:

(2, 5, 2, 'final', 0)

Ich hab Debian 5 drauf, aber warum Python 2.5.2? Habs ja auch per apt Installiert... naja, ich guck jetzt mal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 17:23:22 
Offline

Registriert: 21.11.2010, 21:28:34
Beiträge: 5
Das wird bei mir vermutlich daran liegen, dass ich einen speziellen Build für den Seagate Dockstar nutze.

Linux debian 2.6.32-5-kirkwood #1 Fri Oct 15 13:52:51 UTC 2010 armv5tel GNU/Linux

Ich habe dir auch mal mein Testprogramm (Mono) angehängt.
Code:
apt-get install mono-devel


Zum Übersetzen:
Code:
gmcs test.cs


Zum Starten:
Code:
mono test.exe Port Wert

Der Wert muss eine Integer-Zahl sein. Ausgegeben wird alles was von der IO Karte bis zum Readtimeout von 400 Millisekunden geschickt wird.

Also z.B. zum Schalten aller Ausgänge
Code:
mono test.exe /dev/ttyACM0 63


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 19:12:11 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
geht nicht...

mono test.exe /dev/ttyACM0 63

bringt keine ausgabe und hängt dann... ich habs dann immer wieder mit ^C abgeschossen.

minicom mag sich auch nicht mit dem board verbinden. Ich habs wie von Ulrich beschrieben eingestellt :
"9600Baud, 8Datenbits, no Parity und 1 Stoppbit des weiteren kein Handshake"

Fuses sind so gesetzt wie von dir irgendwo beschrieben: lfuse 0x9F , hfuse 0xC9

/dev/ttyACM0 ist da und verschwindet auch brav wenn ich den USB Stöpsel ziehe, der AVR tickt offenbar richtig... wo mach ich denn jetzt mit der fehlersuche weiter?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 20:00:16 
Offline

Registriert: 21.11.2010, 21:28:34
Beiträge: 5
Funktioniert denn die Relaiskarte mit der Originalsoftware von Ulrich Radig problemlos?
Ich habe aktuell die Fuses wie Cybso eingestellt, um eventuelle Probleme zu vermeiden.
Mit meiner zweiten Relaiskarte gehen aber auch die alten Einstellungen.

Mit der Originalsoftware sollte auch sowas wie
Code:
echo 1 > /dev/ttyACM0
funktionieren. Da schaltet sich bei mir Port 2 und 4 an, da das Zeichen "1" interpretiert wird.

Eventuell mal die Flags von /dev/ttyACM0 prüfen. Sie sollten 666 (rwrwrw haben), jedoch habe ich das gerade mal bei mir getestet und mit ReadOnly oder WriteOnly habe ich eine Exception bekommen.

Ich habe auch nochmal eine Debug-Version des Monoscriptes angehängt. Da wird in jedem Schritt eine Ausgabe gemacht. Eventuell siehst du da, wo er hängen bleibt.


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 27.11.2010, 22:22:22 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
Es scheint so als möchte mono bei mir nicht (habs manuell installiert, mono geht nicht mehr per apt) es gibt einfach nichts aus...

keine chance per minicom an die karte ranzukommen, egal ob mit der angepassten oder orginal firmware.

in windows geht auch nix. aber überall wird das gerät angezeigt... jetzt ist erstmal schluss liegt wohl an meiner unfähigkeit


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 28.11.2010, 17:16:24 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
Moin... oh, ist ja schon nach 16:00..

unter Windows mit hilfe von Putty tut die Kiste jetzt. Warum? keine ahnung!

In Linux komm ich nicht klar:
für das script von Cybso benötige ich offenbar Python 2.6, dies gibt es aber nicht offiziell in Debian Lenny, und manuell kann ich es aus mir unbekannten Gründen nicht installieren. Mit Python 2.5 läuft das script nicht.

Mono ist offenbar eine .NET unterstützung für Linux. Ich habe im Netz einiges darüber gelesen und habe es für mich als Murks abgestempelt.

die einfachste variante: echo 1 > /dev/ttyACM0
sagt mir: -bash: echo: write error: Das Argument ist ungültig

bin ich einfach nur zu Doof? oder hätte ich lieber im Bett bleiben sollen? Ich habs übrigens auf mehreren Rechnern mit Debian probiert, das resultat ist immer das gleiche.

Ist es so schwer unter Linux die Serielle Schnittstelle anzusprechen? Ich kanns mir nicht vorstellen. Ich (vermute zumindest) habe auch mit stty die Schnittstelle richtig parametriert.

Kann mir mal jemand aufs Pferd helfen?

Gruß


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: USB Relaiskarte: Viele Firmware-Verbesserungen
BeitragVerfasst: 28.11.2010, 18:29:15 
Offline

Registriert: 27.11.2010, 14:55:32
Beiträge: 8
Cybso hat geschrieben:
Eventuell klappt es, wenn du die betroffene Zeile durch "except Exception, (ex):" ersetzt.


Danke, habe den Post in mein Hysterie gar nicht gesehen.

mit dieser Änderung läuft das Script! Allerdings komme ich mit der Syntax nicht klar ( ich bin scheinbar wirklich zu doof)
Hier ein paar versuche:
Code:
addeb010:~# ./relaisboard_py_cybso.py /dev/ttyACM0 enable all
Unexpected error:  [Errno 22] Invalid argument

addeb010:~# ./relaisboard_py_cybso.py /dev/ttyACM0 enable 1
Unexpected error:  [Errno 22] Invalid argument



Und so weiter...
Was mache ich hier wieder falsch?

Sorry wenn ich nerve, bin aber irgenwie frustriert


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 20 Beiträge ]  Gehe zu Seite 1, 2  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Deutsche Übersetzung durch phpBB.de