Discussion:
[ethersex-devel] IO_PORT_SET() in Control6, aber wie?
Sven Donath
2009-09-01 01:06:12 UTC
Permalink
Hallihallo,

jetzt muss ich doch mal fragen:

Kann man in Control6 die Ports mittels ECMD ansprechen?
Es geht mir um die HC595-Porterweiterung, die am selben µC hängt, der
das Control6 ausführt.
(auf die hard-ports kann ich ja mit C schreiben: PORTC = 0x23;)
Oder kann man irgendwie (komfortabel) die Funktionen in hc595.c (oder
so) nutzen?
Gibt es einen Trick?

Z.B. ADC_GET(n) funktioniert in control6, aber IO_SET_PORT() nicht.
Ich vermute es wurde noch nicht implementiert.

Kann mir jemand helfen? Vielen Dank! :-)

--
Sven Donath
Hardware: Pollin.de NET-IO mit ATMEGA644
Erweiterungen: HC595, SD-Card Reader, wip etherframe
Christian Dietrich
2009-09-13 17:16:18 UTC
Permalink
Post by Sven Donath
Hallihallo,
Kann man in Control6 die Ports mittels ECMD ansprechen?
Es geht mir um die HC595-Porterweiterung, die am selben µC hÀngt, der
das Control6 ausfÃŒhrt.
(auf die hard-ports kann ich ja mit C schreiben: PORTC = 0x23;)
Oder kann man irgendwie (komfortabel) die Funktionen in hc595.c (oder
so) nutzen?
Gibt es einen Trick?
Naja man könnte direkt die portio c funktionen verwenden:

,----[Control6 broken]-----
| #include "core/portio/portio.h"
|
| CONTROL_START
| ON STARTUP DO
| uint8_t port = 5;
| if (vport[port].write_port) vport[port].write_port(port, 0xAA);
| END
| CONTROL_END
.---------------

Damit kannst du das full featured Portio verwenden. Das if schaut
nur ob es auch wirklich ne write_port funktion fÃŒr diesen
spezifischen port gibt.
Post by Sven Donath
Z.B. ADC_GET(n) funktioniert in control6, aber IO_SET_PORT() nicht.
Ich vermute es wurde noch nicht implementiert.
naja es wÀr halt nur ein einfach define von dem oben

define(`IO_SET_PORT', `if (vport($1).write_port) vport($1).write_port($1, $2)')

grusz didi
--
No documentation is better than bad documentation
-- Das Ausdrucken dieser Mail wird urheberrechtlich verfolgt.
Sven Donath
2009-09-14 23:12:35 UTC
Permalink
Hallo didi,

vielen Dank, you saved my day, wenn nicht sogar die ganze Week! ;-)

Der Code funktioniert. Super! :-D
Ich habe das zuerst in control6/control6.src ausprobiert und dann eine Datei
control6/lang.de/50_io.m4
angelegt mit folgendem Inhalt:

################################
# IO PORT
################################
define(`IO_USED', `ifdef(`io_used', `', `dnl
define(`old_divert', divnum)dnl
define(`io_used')dnl
divert(globals_divert)
#ifndef PORTIO_FULL_FEATURED
#error Please define port-IO full support
#endif

#include "core/portio/portio.h"

divert(old_divert)')')

define(`IO_SET_PORT', `vport[$1].write_port($1, $2)')


---- 8< -------

(von RC5 abgekupfert, in 50_ps2.m4 steht übrigens noch RC5 im Kopf ;-) )
Ich habe keine Ahnung, ob das da wirklich alles so drin stehen muss.

In der control6/control6.src kann ich nun schreiben:

IO_SET_PORT(4, 0x3F);

und der Code funktioniert und wird einkompiliert, solange ich in
control6/control6.src die Zeile
#include "core/portio/portio.h"

vor
C6_HEADER(`/* This will be in control6.h */')

stehen habe. Sonst erhalte ich bei make:
control6/control6.c:151: error: 'vport' undeclared (first use in
this function)

Komisch, sollte doch eigentlich durch die control6/lang.de/50_io.m4
inkludiert sein!?
Ich denke, prinzipiell könnte man die control6/lang.de/50_io.m4 soweit
aufbohren, dass die ECMDs io set ddr/port als IO_SET_DDR(<ddr>, <dir>)
bzw. IO_SET_PORT(<port>, <byte>) und IO_GET_DDR/PORT etc. in
control6-Scripts funktionieren.
Mir ist nur nicht klar, warum das Inkludieren der portio.h in 50_io.m4
nicht geht. Hatte es auch schon in control6/00_header.m4 eingebaut.
Ging nicht.

Manchmal scheint make auch fehlzuschlagen, wenn man mit fehlerhaftem
Code experimentiert. Da hilft dann make clean oder make mrproper
(letzeres unter Verlust der .config).

Die control6/lang.de/50_io.m4 könnte man sicher auch anders nennen.
Mir fiehl nur gerade nichts Besseres ein.

Nochmals danke für die Tipps! :-)

--
Sven Donath
Hardware: Pollin.de NET-IO mit ATMEGA644
Erweiterungen: HC595, SD-Card Reader, wip etherframe
Stefan Siegl
2009-09-15 07:54:49 UTC
Permalink
Post by Sven Donath
control6/lang.de/50_io.m4
################################
# IO PORT
################################
define(`IO_USED', `ifdef(`io_used', `', `dnl
define(`old_divert', divnum)dnl
define(`io_used')dnl
divert(globals_divert)
#ifndef PORTIO_FULL_FEATURED
#error Please define port-IO full support
#endif
#include "core/portio/portio.h"
divert(old_divert)')')
define(`IO_SET_PORT', `vport[$1].write_port($1, $2)')
^ du willst da noch ein IO_USER()
unterbringen

Dann sollte es auch das tun, was du erwartest :)
--
Stefan Siegl <***@brokenpipe.de>
Das Ausdrucken dieser E-Mail ist nicht gestattet und wird bei
Zuwiderhandlung urheberrechtlich verfolgt.
Sven Donath
2009-09-15 20:27:23 UTC
Permalink
Hallo Stefan,

thank you, jetzt habe ichs.
Meine control6/lang.de/50_io.m4 sieht nun so aus und funktioniert. :-)


################################
# IO PORT
################################
define(`IO_USED', `ifdef(`io_used', `', `dnl
define(`old_divert', divnum)dnl
define(`io_used')dnl
divert(globals_divert)
#ifndef PORTIO_SCHEME==PORTIO_FULL_FEATURED
#error Please configure port-IO full featured support
#endif

#include "core/portio/portio.h"

divert(old_divert)')')

define(`IO_SET_PORT', `IO_USED()vport[$1].write_port($1, $2)')

--- 8< ---

Dein "verschlüsselter" Tipp
Post by Stefan Siegl
^ du willst da noch ein IO_USER()
unterbringen
hat das include-Problem gefixt.
Jetzt kann man das schon fast in die Distri aufnehmen.
Ich versuche jetzt noch den Rest (IO_GET_PORT, IO_SET_DDR, IO_GET_DDR)
zu implementieren.
Wie kann ich die optionale Bit-Maske da mit rein bekommen?

--
Sven Donath
Hardware: Pollin.de NET-IO mit ATMEGA644
Erweiterungen: HC595, SD-Card Reader, wip etherframe
Christian Dietrich
2009-09-17 16:55:17 UTC
Permalink
Post by Sven Donath
Hallo Stefan,
thank you, jetzt habe ichs.
Meine control6/lang.de/50_io.m4 sieht nun so aus und funktioniert. :-)
################################
# IO PORT
################################
define(`IO_USED', `ifdef(`io_used', `', `dnl
define(`old_divert', divnum)dnl
define(`io_used')dnl
divert(globals_divert)
#ifndef PORTIO_SCHEME==PORTIO_FULL_FEATURED
#error Please configure port-IO full featured support
#endif
#include "core/portio/portio.h"
divert(old_divert)')')
define(`IO_SET_PORT', `IO_USED()vport[$1].write_port($1, $2)')
--- 8< ---
Dein "verschlÃŒsselter" Tipp
Post by Stefan Siegl
^ du willst da noch ein IO_USER()
unterbringen
hat das include-Problem gefixt.
Jetzt kann man das schon fast in die Distri aufnehmen.
Ich versuche jetzt noch den Rest (IO_GET_PORT, IO_SET_DDR, IO_GET_DDR)
zu implementieren.
Wie kann ich die optionale Bit-Maske da mit rein bekommen?
Naja schau dir mal an, wie das in ecmd gemacht wird
(core/portio/ecmd.c), wenn ich mich recht entsinne. Du musst halt
den aktuellen Stand auslesen, mit der invertierten Maske verunden,
damit du die Bits die zur Maske gehören auf 0 setzt, und damm it der
was an input kommt verunden:

port: der echte hardware port (auch von vport...)
mask: maske
input: neuer wert

,----[mit maske machen]----
| (port & (~mask)) | (input & mask)
.---------------

grusz didi
--
No documentation is better than bad documentation
-- Das Ausdrucken dieser Mail wird urheberrechtlich verfolgt.
Loading...