# libnodave und AVR von Atmel, kann man beides verheiraten?



## poppycock (29 Juni 2010)

Hallo,

eins vorweg: Mein Technikerprojekt ist abgeschlossen und wurde schon von den Lehrern bewertet.
Als Visu habe ich mir etwas in VB.net und libnodave zusammengebaut und läuft auch echt problemlos!

Jetzt habe ich Urlaub und im Moment auch keinen Schulstress, darum möchte ich nun versuchen libnodave auf einem ATMega8 oder größer zum Laufen zu bringen.
Die Sprache C werde ich nach den Ferien intensiv bekommen, jedoch ist mir schon einiges vertraut, da ich für mein Projekt Mikrocontroller in ANSI-C programmiert habe.

Als Schnittstellenumsetzer soll ein ausgedienter RS232/MPI-Adapter verwendet werden. Demnach muss der ATMega nur RS232 beherrschen.

Mein Problem liegt darin, dass libnodave eine dll benötigt, die ich nicht auf den AVR dynamisch verlinken kann, da auf dem µC kein OS laufen soll.

Hat jemand schon mal probeweise versucht libnodave auf einem AVR lauffähig zu machen?
Ich werde mir mal die Sache nochmals annehmen, denn Zottel hat mir vor längerer Zeit mal kurz geholfen, jedoch aber nicht mit Quellcodes.
Aus Zeitmangel kam das Thema in die unterste Schublade und nun bin ich wieder daran interessiert.

Gruß,
poppycock


----------



## PN/DP (29 Juni 2010)

*Warum LibNodave?*

Hallo poppycock,

warum willst Du per LibNodave mit dem ATMega kommunizieren? Dann müßtest Du 
auf dem ATMega das nicht offengelegte S7-Protokoll als Server implementieren.
Denke Dir doch ein eigenes Protokoll aus oder implementiere ein dokumentiertes 
Standard-Protokoll wie RK512 oder besser Modbus-Slave.

Gruß
Harald


----------



## poppycock (29 Juni 2010)

Hallo!



PN/DP schrieb:


> warum willst Du per LibNodave mit dem ATMega kommunizieren? Dann müßtest Du
> auf dem ATMega das nicht offengelegte S7-Protokoll als Server implementieren.


Das nicht offengelegte S7-Protokoll muss ich doch gar nicht kennen, libnodave macht doch brav seinen Dienst.



PN/DP schrieb:


> Denke Dir doch ein eigenes Protokoll aus oder implementiere ein dokumentiertes
> Standard-Protokoll wie RK512 oder besser Modbus-Slave.


In meinem Projekt bin ich den Weg über RS485 (nicht PB) gegangen, funktioniert super! Die Kommunikation mit den AVR-Teilnehmern hat ein selbstprogrammierter Baustein in der CPU übernommen.

Mein Vorhaben:
Der AVR-Master soll mit dem MPI-Adapter an die S7 angeschlossen werden.
An dem Master hängen Slaves, die vom Master abgefragt werden.
Hat der Master die benötigten Daten, soll dieser mittels UART die Daten über den MPI-Adapter an die CPU weitergeben.

Wenn du aber meinst, dass das nicht so sinnvoll ist, wie wäre dann der Weg über TCP/IP?
Ein CP343-1 ist vorhanden, ein Switch auch, jedoch kein Mikrocontroller mit Ethernetschnittstelle.
Bei diesem Weg weiß ich jedoch nicht, wie ich der CPU die Daten übermitteln kann. Ist das genau so wie eine Kommunikation mit RS232?

So könnte ich wohl auf libnodave verzichten, aber dann ist mir unklar, wie man eine Verbindung zwischen Ethernet-AVR und CP343-1 aufbaut.

Gruß,
poppycock


----------



## Gerhard Bäurle (29 Juni 2010)

PN/DP schrieb:


> warum willst Du per LibNodave mit dem ATMega kommunizieren? Dann müßtest Du
> auf dem ATMega das nicht offengelegte S7-Protokoll als Server implementieren.



Hallo,

ich denke es soll vom ATMega aus auf eine S7 zugegriffen werden.


----------



## Gerhard Bäurle (29 Juni 2010)

poppycock schrieb:


> ...
> Ein CP343-1 ist vorhanden, ein Switch auch, jedoch kein Mikrocontroller mit Ethernetschnittstelle.
> ...



Hallo,

es gibt ja Möglichkeiten, mit dem Atmega an Ethernet zu kommen:

http://www.mikrocontroller.net/topic/105851


----------



## poppycock (29 Juni 2010)

Hallo.



Gerhard Bäurle schrieb:


> ich denke es soll vom ATMega aus auf eine S7 zugegrifffen werden.


Ja, das ist richtig, und zwar über den MPI-Umweg!
Man müsste doch "nur" die Quellcodes für C auf einem ATMega lauffähig machen.
Den Rest kann man doch vorerst über Makros realisieren, quasi:

if antwort(Teilnehmer_a)
{
libnodave_uart(Daten,Teilnehmer_a);
} 

Gruß,
poppycock


----------



## poppycock (29 Juni 2010)

Gerhard Bäurle schrieb:


> es gibt ja Möglichkeiten, mit dem Atmega an Ethernet zu kommen:
> 
> http://www.mikrocontroller.net/topic/105851


 
Danke, mir würde spontan dieses in den Sinn kommen:
http://www.pollin.de/shop/dt/NjI5OTgxOTk-/Bausaetze/Diverse/AVR_NET_IO_Fertigmodul.html


----------



## PN/DP (30 Juni 2010)

poppycock schrieb:


> Mein Vorhaben:
> Der AVR-Master soll mit dem MPI-Adapter an die S7 angeschlossen werden.
> An dem Master hängen Slaves, die vom Master abgefragt werden.
> Hat der Master die benötigten Daten, soll dieser mittels UART die Daten über den MPI-Adapter an die CPU weitergeben.


OK, das habe ich so nicht aus Deinem Eröffnungsbeitrag 'rausgelesen.
Ich hab' da leider was falsches hineininterpretiert.



poppycock schrieb:


> Wenn du aber meinst, dass das nicht so sinnvoll ist, wie wäre dann der Weg über TCP/IP?


Mein Vorschlag beruhte auf einer Fehlinterpretation Deines Vorhabens. 

Trotzdem finde ich den alternativen Weg über Ethernet besser.
1. Ich schätze, das ist leichter zu programmieren, als LibNodave für den AVR umzusetzen, auch wenn der C-Quelltext 
vorliegt. Zumindest die Socket-Dienste mußt Du so oder so selber implementieren.
2. Du wärst nicht mehr auf die Zielplattform S7 festgenagelt und könntest den AVR-Master auch mit anderen Geräten 
und Steuerungen koppeln.



poppycock schrieb:


> Bei diesem Weg weiß ich jedoch nicht, wie ich der CPU die Daten übermitteln kann. Ist das genau so wie eine Kommunikation mit RS232?


Wenn erst einmal die Verbindung zur S7 aufgebaut ist, dann ist der eigentliche Datenaustausch nicht komplizierter
als eine RS232-Kommunikation. Allerdings geht das Daten-Empfangen der S7 nicht ohne deren Zutun. In der Ziel-SPS 
muß der Daten-Empfang programmiert werden. (Bei LibNodave müßte in der S7 nichts programmiert werden.)

Um der S7 die Auswertung der Empfangsdaten einfacher zu machen, würde ich zyklisch ein Telegramm fester Länge mit 
den Daten von den Slaves senden. Eventuell noch ein kleines "Verwaltungs-Protokoll" in die Telegramme legen, falls 
ein einziges Telegramm mit dem festen Aufbau für Dein Vorhaben nicht geeignet ist.
Für den S7-Programmierer ist es einfacher, wenn die Telegramme alle die gleiche Länge haben.

Der TCP-Verbindungsaufbau ist relativ einfach, ich würde aber der SPS den aktiven Verbindungsaufbau überlassen:
http://de.wikipedia.org/wiki/Transmission_Control_Protocol 
Wenn Du nur Einweg-Daten zur SPS übertragen willst, wäre auch das einfache UDP-Protokoll geeignet:
http://de.wikipedia.org/wiki/User_Datagram_Protocol 
Was in der S7-SPS zu tun ist siehe hier (besonders den Abschnitt Vergleich Protokolle):
Linkliste SIMATIC-Kommunikation über Ethernet

Dein Projekt klingt übrigens sehr interessant. Hut ab!
Und wenn ich das AVR-NET-IO - Fertigmodul von Pollin sehe, da bekomme ich fast Lust, mich selber mal mit den 
modernen Mikrokontrollern zu beschäftigen. Von dem ATMega habe ich bis jetzt so gut wie null Ahnung.

Gruß
Harald


----------



## Jochen Kühner (30 Juni 2010)

*Mhhm...*

Da könnt Ich noch diesen Thread empfehlen:

http://www.mikrocontroller.net/topic/106174

Dort gehts zwar um einen pprofibus Slave an der S7 CPU, aber so kann man ja auch daten austauschen. Und es ist ziemlich weit unten im Thread auch eine Version für AVR enthalten.


----------



## Jochen Kühner (30 Juni 2010)

*Avr*

Und ist in der libnodave nicht schon irgendwas für den AVR ausgelegt??

Zumindest gibt es AVR als Compilerschalter in der nodave.h und nodave.c...


----------



## PN/DP (30 Juni 2010)

*Der Compiler ist nicht das Problem ...*



poppycock schrieb:


> Mein Problem liegt darin, dass libnodave eine dll benötigt, die ich nicht auf den AVR dynamisch verlinken kann, da auf dem µC kein OS laufen soll.


Gruß
Harald


----------



## Jochen Kühner (30 Juni 2010)

*Ah...*

Ah so....

Aber welche DLL braucht den Libnodave? Man müsste sich halt eine Version von setport schreiben, welche irgenwie die avr schnitstelle benutzt und vielleicht noch was an den seriellen verbindungen anpassen, oder? Die ganze TCP/IP geschichte kann man ja weglassen...


----------



## poppycock (30 Juni 2010)

Hallo.

@PN/DP:
Danke für die Links, die sind sehr informativ!
Was meinst du mit "Der Compiler ist nicht das Problem ..."?
Bin ich das Problem oder die dll? 
Man müsste die Befehle aus der dll rausschreiben und "statisch" einbinden.

@Jochen Kühner:
Könntest du mir dabei helfen?
Ich brauche nur die MPI-Schnittstelle (original Siemens MPI-Adapter).
Es wird die libnodave.dll benötigt.



PN/DP schrieb:


> OK, das habe ich so nicht aus Deinem Eröffnungsbeitrag 'rausgelesen.
> Ich hab' da leider was falsches hineininterpretiert.


Macht nichts, bin doch auch für jeden Denkanstoß dankbar!



PN/DP schrieb:


> Allerdings geht das Daten-Empfangen der S7 nicht ohne deren Zutun. In der Ziel-SPS
> muß der Daten-Empfang programmiert werden. (Bei LibNodave müßte in der S7 nichts programmiert werden.)


Jetzt, nachdem ich eine Nacht darüber geschlafen habe, möchte ich doch nicht in die Hardwarekonfig der S7 eingreifen.
Es soll nach dem Motto: "Anstöpseln und freuen" funktionieren.
Eine Kommunikation ist nur mit einer S7 vorgesehen.
Es ist weder eine Schulaufgabe noch eine betriebliche. Ich interessiere mich halt dafür, wie die Daten von A nach B geschoben werden können.
Der Weg, wie das passiert, ist im Grunde egal. Dabei muss man aber Vor- und Nachteile der Wege beachten.
Habe halt gedacht, wenn ein PC diesen libnodave-MPI-Datenaustausch hinbekommt, könnte doch auch ein AVR eingesetzt werden.



PN/DP schrieb:


> Um der S7 die Auswertung der Empfangsdaten einfacher zu machen, würde ich zyklisch ein Telegramm fester Länge mit den Daten von den Slaves senden. Eventuell noch ein kleines "Verwaltungs-Protokoll" in die Telegramme legen, falls ein einziges Telegramm mit dem festen Aufbau für Dein Vorhaben nicht geeignet ist.
> Für den S7-Programmierer ist es einfacher, wenn die Telegramme alle die gleiche Länge haben.


Das stimmt! Habe ich selber gemerkt und musste im SPS-Programm eine Art "Verwaltungsprotokoll" (ist aber sehr einfach gehalten) entwickeln.



PN/DP schrieb:


> Dein Projekt klingt übrigens sehr interessant. Hut ab!


Danke! Weiter unten beschreibe ich den Datenaustausch in meiner Projektarbeit.



Jochen Kühner schrieb:


> Da könnt Ich noch diesen Thread empfehlen:
> http://www.mikrocontroller.net/topic/106174
> Dort gehts zwar um einen pprofibus Slave an der S7 CPU, aber so kann man ja auch daten austauschen.


Danke für den Link, werde mir das Thema reinziehen.
Zu beachten ist aber, dass ich dann die PB-Schnittstelle nicht auf "highspeed" laufen lassen kann, wenn die AVR-Slaves "nur" mit 19,2k senden.
Hier im Forum gibt es auch einen sehr guten Thread, der das Thema "Profibusteilnehmer selber bauen" behandelt.



Jochen Kühner schrieb:


> Und ist in der libnodave nicht schon irgendwas für den AVR ausgelegt??
> Zumindest gibt es AVR als Compilerschalter in der nodave.h und nodave.c...


Habe ich eine veraltete libnodave-Version?
Ich finde den Compilerschalter nicht. Außerdem habe ich mit diesen Schaltern noch nichts gemacht.
Muss man da etwas einstellen? Ich hatte mal probiert den Source im AVR-Studio zu kompilieren, da kam aber die Meldung, dass das OS nicht bekannt sei.

------------------------------

Nun aber zu der Datenübertragung in meiner Projektarbeit...
Die Arbeit wurde zwar schon bewertet, aber ich kenne das Ergebnis noch nicht.
Allerdings gingen bei den Lehrern alle Daumen nach oben, von daher kann ich wohl mit mindestens einer 3 rechnen! 
Darum kann ich noch nicht das Gesamtergebnis mitteilen, will ja auch nicht, dass ich Konkurrenz aus meiner Klasse bekomme! 
Anbei ist ein handgezeichneter Schaltplan, der den AVR mit der Beschaltung für die Kommunikation zeigt.
In meinem Projekt verwende ich keinen Stromsensor mehr, aber die Beschaltung habe ich für jeden Slave übernommen.
Die AVR-Slaves arbeiten als RS485-Teilnehmer, an der S7 hängt aber ein CP340 (RS232).
Darum musste ich einen RS232/RS485-Umsetzer selber bauen. Funktioniert ohne Probleme.
Da der Umsetzer relativ einfach gehalten wurde und die Datenleitungen nicht umschalten, musste ich darauf das Protokoll anpassen.
Schlimm ist die Anpassung nicht, die kommt mir sogar entgegen:
Die S7 spricht den ersten Teilnehmer an und sendet ein a auf den Bus.
Das a wird wegen der fehlenden Umschaltung der Datenleitung sofort an die S7 zurückgegeben.
Wenn nun der Teilnehmer a antwortet, sendet dieser seine Busadresse 'a' mit Daten in 'ASCII' und einem Stopzeichen '#'.
In der SPS liegt dann z.B. folgendes vor: aa1023#
Die S7 prüft das erste gesendete Zeichen mit dem zweiten. Stimmen diese überein, wird der Wert ab dritter Stelle bis zur Raute übernommen und in einen DB als Integer gespeichert.
Sollte, nachdem das erste Zeichen empfangen wurde, innerhalb von 20ms keine Antwort vom angesprochenen Busteilnehmer erfolgen, wird der nächte Busteilnehmer angesprochen.
Somit kann ich prüfen, ob der angesprochene Slave antwortet oder dieser gar ganz fehlt.
Der Master ist einzig und allein der CP340.

Gruß,
poppycock


----------



## Jochen Kühner (30 Juni 2010)

poppycock schrieb:


> @Jochen Kühner:
> Könntest du mir dabei helfen?
> Ich brauche nur die MPI-Schnittstelle (original Siemens MPI-Adapter).
> Es wird die libnodave.dll benötigt.



Hab das eigentlich nur mal als Idee gebracht, um auf Reaktionen zu warten ob das so gehen könnte... Hab in letzter Zeit nicht so viel mit den AVRs gemacht, denke nicht das Ich dir da im Moment weiterhelfen kann.

ich denke du musst halt dafür sorgen das was in libnodave in den seriell funktionen mit
di->ifwrite(di, (char*)target, targetSize);
geschrieben wird über die serielle SChnitstelle des AVRs geht.

Und genau so das was mit
i=di->ifread(di, &res,1);
halt vom AVR gelesen wird.

Ich weis nicht ob das alles machbar ist, sind nur Ideeen..



poppycock schrieb:


> Habe ich eine veraltete libnodave-Version?
> Ich finde den Compilerschalter nicht. Außerdem habe ich mit diesen Schaltern noch nichts gemacht.
> Muss man da etwas einstellen? Ich hatte mal probiert den Source im AVR-Studio zu kompilieren, da kam aber die Meldung, dass das OS nicht bekannt sei.


So wies aussieht (und Ich den Kommentar von PN/DP richtig verstanden habe) sind die Defines mit AVR nur dafür da wenn auf dem AVR ein OS läuft!


----------



## poppycock (30 Juni 2010)

Hallo Jochen Kühner,

danke für deine Ideen.

Die Hardware kann ich doch schon mal aufbauen.
Habe einen AVR mit zwei UART's, der könnte als intelligenter RS485/RS232-Umsetzer werkeln.
Somit müsste ich NICHT in die bestehenden AVR-Slaves eingreifen und kann alles so lassen, wie es ist.
Das Protokoll in der SPS muss ich dann aber auf den Umsetzer portieren.
Würde dem Umsetzer auch ein Display spendieren, auf dem der Status der Slaves zu sehen ist. Außerdem soll mit dem Display eine Datenbaustein-Einstellung vorgenommen werden können.
Der intelligente Umsetzer kann dann die Daten von den Slaves aufbereiten und in den DB übertragen.

Aufbau des Datenbausteins:
DBW0: Status (welche Teilnehmer aktiv vorhanden sind)
DBW2: Daten Teilnehmer 1 'a'
DBW4: Daten Teilnehmer 2 'b'
...
DBW52: Daten Teilnehmer 26 'z'

Was wäre dann intelligenter, erst alle Daten von den Teilnehmern sammeln und gemeinsam in einen DB schieben oder die Daten der Slaves sofort in einen DB schreiben?

Gruß,
poppycock


----------



## Jochen Kühner (30 Juni 2010)

Also Ich habs jetzt geschaft mit ein paar ifndef libnnodave mit dem avr-gcc zu kompilieren. Ich denke dann müssen vieleicht nur noch stdread und stdwrite so angepasst werden das sie den AVR seriell Port verwenden...  Kann da aber für nichts garantieren. Und kann dir auch nicht sagen wie du die funktionen anpassen musst... Aber wenn du willst lad Ich die meine libnodave und die Anweisungen zum kompielieren mal hoch...


----------



## poppycock (30 Juni 2010)

Hallo Jochen.



Jochen Kühner schrieb:


> Also Ich habs jetzt geschaft mit ein paar ifndef libnnodave mit dem avr-gcc zu kompilieren. Ich denke dann müssen vieleicht nur noch stdread und stdwrite so angepasst werden das sie den AVR seriell Port verwenden... Kann da aber für nichts garantieren. Und kann dir auch nicht sagen wie du die funktionen anpassen musst... Aber wenn du willst lad Ich die meine libnodave und die Anweisungen zum kompielieren mal hoch...


 
Es wäre super, wenn du deine Version für den AVR hochladen würdest.
Denn um die Software habe ich mich noch nicht gekümmert, werde ich aber bald wieder tun (müssen)!

Vielen Dank schonmal,
poppycock


----------



## Jochen Kühner (1 Juli 2010)

poppycock schrieb:


> Hallo Jochen.
> 
> 
> 
> ...



Also mach heut im laufe des Tages...  Aber wie gesagt, Ich weiss nicht ob das dann geht, und du musst auf jeden fall die 2 genannten Funktionen anpassen, da  Ich diese nur als leere Funktionen implementiert habe. Und noch was, kompiliert ist das ganze bei mir 116kb groß, aber man kann bestimmt noch ein paar funktionen ausklammern...


----------



## Jochen Kühner (1 Juli 2010)

So hier mal. Kompiliert, aber ob man damit was anfangen kann, kann Ich dir nicht sagen. Du musst den Include Pfad im Makefile noch abpassen! und die 2 Funktionen in nodave.c für serielles senden und empfangen müssen auf jeden fall noch implementiert werden! (Die 2 welche zwischen dem define avr_noos liegen)


----------



## Jochen Kühner (1 Juli 2010)

*Nochwas...*

Von http://www.mikrocontroller.net/arti..._UART#Empfang_von_Zeichenketten_.28Strings.29
kann man sich vielleicht die sende und empfangsfunktion klauen...


----------



## poppycock (1 Juli 2010)

Vielen Dank, Jochen! 

Ich werde mir deine Testdatei in aller Ruhe angucken und versuchen das unnütze Krams rauszuschmeißen.

Aber opfere nicht all zu sehr deine Zeit damit! Es ist nicht lebensnotwendig!
Trotzdem: Danke danke danke für deine Hilfe...

Gruß,
poppycock


----------



## Jochen Kühner (1 Juli 2010)

poppycock schrieb:


> Vielen Dank, Jochen!
> 
> Ich werde mir deine Testdatei in aller Ruhe angucken und versuchen das unnütze Krams rauszuschmeißen.
> 
> ...



mach ich schon nicht...  ;-)


----------



## Jochen Kühner (5 Juli 2010)

*Hallöchen...*

Wollte nur Fragen ob du mal was probiert hast und obs geht...

Will das nur wissen, ob Ich die Änderungen in meiner libnodave Version belasse oder wieder entferne (wenns nix bringt!).


----------



## poppycock (5 Juli 2010)

Hallo Jochen.



Jochen Kühner schrieb:


> Wollte nur Fragen ob du mal was probiert hast und obs geht...



Sorry, ich habe im Moment wieder kaum "Luft", da ich seit gestern meinen Urlaub für eine unbestimmte Zeit unterbrechen musste. :-(
Der Code lässt sich compilieren, aber ist noch ziemlich groß.
Man müsste noch einiges optimieren, aber ich denke, es sollte kein Problem sein die Daten mit dem UART vom µC an den MPI-Adapter zu schicken.

Gruß und Danke (fürs Verständnis),
poppycock


----------



## Jochen Kühner (8 Juli 2010)

Bin gerade beim stöbern auf mikrocontroller.net auf ein paar Compiler und Linker Flags gestoßen welche unbenutzte Funktionen wegoptimieren...

hab diese ins Makefile mit eingebunden...

Mfg...


----------



## poppycock (25 November 2010)

*...nach längerer Zeit mal wieder ein Lebenszeichen von mir...*

Hallo,

ich wollte mich auch mal wieder melden. 

Im Moment bin ich zeitlich noch immer sehr eingeschränkt, aber das Thema hier lässt mir eigentlich keine Ruhe...

Da ich aber hin und wieder ein paar Minuten Freizeit habe (Schule, Schichtarbeit -> ANSTRENGEND!), dachte ich mir, ich versuche es nochmal, aber in abgewandelter Form.


Ziel ist jetzt:

S7-300 via MPI-Adapter von Siemens mit einem Atmel AVR verbinden
Schnittstelle: nur seriell (RS232)
es soll nur EIN Zustand gelesen werden:
z.B. DB50.DBX2.3
Ausgabe auf LCD oder über zweite RS232-Schnittstelle am AVR
jede Sekunde soll ein Polling gestartet werden (mittels Timer)
Das eigentlich Problem ist für mich das Entschlacken der "nodave.h" und "nodave.c" für einen Atmel Mikrocontroller.
Zottel hatte ja mal in einem älteren Thread angegeben, dass es kein Problem sei libnodave auf einen AVR zu portieren.
Dazu hatte ich ihn vor längerer Zeit angeschrieben, aber leider habe ich keine Unterstützung erhalten. 
Ich will nichts vorgefertigtes, ich benötige nur Hilfe, den Code zu verstehen, um diesen für einen AVR umzusetzen.

In den ZIPs von Jochen habe ich gesehen, dass dort keine libnodave.dll eingebunden wurde.
Brauche ich diese überhaupt?

Die Ausgabe auf das LCD oder am UART ist erstmal nebensächlich, stellt auch kein Problem bei der Umsetzung dar.
Hauptsache das Programm "AVR Studio 4" kann erstmal OHNE Fehler die Initialisierung des Adapters kompilieren.

Wer bereits mehr Erfahrungen damit hat oder mir unter die Arme greifen möchte, der kann sich hier einklinken, würde mich freuen!
Tipps sind immer willkommen!

Danke und Gruß,
poppycock


----------



## Thomas_v2.1 (25 November 2010)

Eine dll benötigst du nicht, bzw. funktioniert das auf einem AVR auch garnicht weil du kein Betriebssystem hat welches eine dll laden könnte.

Die Vorgehensweise die du benötigst, ist die übersetzen Programmteile statisch zusammenzulinken.
Dann erkennt der Compiler beim Übersetzen auch welche Funktionen du aus der nodave.c überhaupt benötigst, und linkt nicht genutzte Funktionen nicht zur hex-Datei dazu.

Ob das trotzdem ohne weitere Änderungen in 8 Kb Flash passt ist eine andere Sache. Du musst auf jeden Fall prüfen dass nirgends float oder double verwendet wird, und auch kein printf() benötigt wird. Denn die Gleitkomma- und die printf() Bibliotheken machen den AVR bestimmt alleine schon halbvoll.

PS:
Wenn ich das mit einem so kleinen AVR machen müsste, würde ich das über Ethernet mit einem XPort machen, und die benötigten Telegramme fest im Flash-Speicher des AVR hinterlegen und nur noch über die serielle Schnittstelle rausschicken.


----------



## poppycock (25 November 2010)

Hallo Thomas_v2.1!



Thomas_v2.1 schrieb:


> Eine dll benötigst du nicht, bzw. funktioniert das auf einem AVR auch garnicht weil du kein Betriebssystem hat welches eine dll laden könnte.


Richtig, auf dem AVR läuft kein OS, DLL einbinden fällt da flach!
Dann brauche ich wirklich nicht die DLL, hatte gedacht, ich muss den Code, der in der DLL steht, irgendwie mitverlinken.



Thomas_v2.1 schrieb:


> Die Vorgehensweise die du benötigst, ist die übersetzen Programmteile statisch zusammenzulinken.


Und dieses muss ich mir raussuchen.
Das kann aber ein wenig (bei mir) dauern... 



Thomas_v2.1 schrieb:


> Ob das trotzdem ohne weitere Änderungen in 8 Kb Flash passt ist eine andere Sache. Du musst auf jeden Fall prüfen dass nirgends float oder double verwendet wird, und auch kein printf() benötigt wird. Denn die Gleitkomma- und die printf() Bibliotheken machen den AVR bestimmt alleine schon halbvoll.


Auf den genauen AVR-Typ hab ich mich noch nicht festgelegt, aber die ganze Sache soll ja quasi so statisch wie möglich sein.
Die Daten, die vom MPI-Adapter ausgegeben werden, sind doch schon ASCII, oder nicht? Das muss ich mir nochmal angucken, wenn ich soweit bin, aber auch float oder double werde ich verzichten. Diese schlucken echt viel Speicherplatz.

Wichtig ist erstmal, dass ich einen Verbindungsaufbau zum MPI-Adapter aufbauen kann.
Der Rest kommt nach und nach.

Gruß,
poppycock


----------



## Jochen Kühner (25 November 2010)

*Hmm...*

Mit dem was Ich dir damals geschickt habe, lässt sich die libnodave doch schon fehlerfrei compilieren...

Auf microcontroler.net gibts auch einen pb slave direkt auf dem avr. bestimmt könnte man den code auch so erweitern, das sich der avr wie ein pb programmiergerät verhält. dann könnt man libnodave vieleicht direkt verwenden, ohne den seriellen adapter ... Nur noch so als idee


----------



## poppycock (25 November 2010)

Hallo Jochen!



Jochen Kühner schrieb:


> Mit dem was Ich dir damals geschickt habe, lässt sich die libnodave doch schon fehlerfrei compilieren...


 
Bei mir geht es nicht fehlerfrei zu kompilieren, siehe Screenshot.
Anbei bemerkt, dass ich deine Files in der ZIP für jetzt auf die Schnelle als Projekt im AVR Studio 4 eingebunden habe.
Bin ja bereits selber beim Probieren und Studieren des Codes.

Hast du eventuell die *.aps für dieses Projekt?
Mein AVR Studio 4 ist Build 528, Version 4.13.
WinAVR ist die Version 20100110.

Gruß,
poppycock


----------



## Jochen Kühner (26 November 2010)

Ich nutze winavr. Wenn du dort das Makefile compilierst gehts.


----------

