Forum: Mikrocontroller und Digitale Elektronik TSIC nur per Software auslesen. C vs C++


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Flo (Gast)


Lesenswert?

hallo leute,

ich hab mir für ein kleines projekt nen tsic 206 zugelegt und lese den 
mittels einem atmega32 aus.

das ganze klappt wunderbar, rein mittels software (ohne interrupts und 
warteschleifen). also fallende flanken detektieren, t_strobe messen und 
anschließend die 2byte auslesen.

mein problem ist jetz aber, dass ich die berechnung in eine klasse 
packen möchte. wenn ich den 100% funktionierenden code 1:1 in eine eine 
funktion einer klasse stecke und dann die berechnung ausführe, kommen 
sinnlose werte.
also in etwa so, als wenn der zu falschen zeit anfangen würde bits zu 
lesen.

ich hab schon sehr viel versucht. und bin zu dem entschluss gekommen, 
dass es an dem aufbau per klasse liegen muss :(.

ich betreib den controller momentan mit 8mhz intern (16mhz extern klappt 
irgendwie nicht -> ein controller schon verfust -.-). reicht das vllt 
nicht, weil c++ langsamer ist? oder ist das quatsch?

hat jemand eine idee oder nen hinweis?

dankeschön!

gruß
flo

von Karl H. (kbuchegg)


Lesenswert?

Flo schrieb:

> ich betreib den controller momentan mit 8mhz intern (16mhz extern klappt
> irgendwie nicht -> ein controller schon verfust -.-). reicht das vllt
> nicht, weil c++ langsamer ist? oder ist das quatsch?

Das ist Quatsch.

> hat jemand eine idee oder nen hinweis?

Code?  (wenn du freundlich bist: sowohl die C Version als auch die C++ 
Version)

von Flo (Gast)


Angehängte Dateien:

Lesenswert?

vielleicht seh ich auch nur den wald vor lauter bäumen nicht ^^.

vielen dank!

von Flo (Gast)


Lesenswert?

der code funktioniert außerdem nur mit einem ausgangspin. also ohne das 
einschalten und 85ms warten. also es wird der anfang vom packet 
abgewartet.

damit kann man den tsic nach belieben raus und reinstecken und zudem 
ständig den wert abfragen (sollte eine recht schnelle variante sein).
paritybits werden momentan nicht geprüft.

ich hätte ja die fertige klasse dann hochgeladen, aber leider klappts 
halt nich :(.

wer solchen code gesucht hat, kann meinen gerne benutzen ;). der normale 
c code funktioniert ja.

von P. S. (Gast)


Lesenswert?

Ein Fehler ist schonmal, dass du m_pDisplay keinen Wert zuweist.

Ansonsten ist das generell sehr unuebersichtlich. Die Formatierung ist 
unordentlich, ein Teil der Implementation im Header, die Variablennamen 
oft nichtssagend.

von Peter (Gast)


Lesenswert?

> Ein Fehler ist schonmal, dass du m_pDisplay keinen Wert zuweist.

ich musste auch est suchen, aber hier steht es

TSIC tsic;
tsic.m_pDisplay = &lcd;

das man von außen auf Members zugreift, verletzt aber schon mal das 
Object Prinzip.

von Peter (Gast)


Lesenswert?

was ist denn das.

> uint8_t    timeStartTSIC;

> timeStartTSIC = TCNT1L;
> timeStartTSIC |= TCNT1H<<8;

????????

von P. S. (Gast)


Lesenswert?

Peter schrieb:
>> Ein Fehler ist schonmal, dass du m_pDisplay keinen Wert zuweist.
> ich musste auch est suchen, aber hier steht es
>
> TSIC tsic;
> tsic.m_pDisplay = &lcd;

Das ist aus dem nurc.cpp, oder? Ich dachte, das waere die C-Variante und 
haette mit der C++ nix zu tun... Chaos. Loeschen. Nochmal von vorne.

von Flo (Gast)


Lesenswert?

och jungs ...

vielen dank erstmal für eure hilfe. aber ich programmier nich erst seit 
gestern.

die public-variable m_pDisplay ist nur zum test. und funktioniert ganz 
nebenbei @ frage nach zuweisung.

ich hatte ja auch nur nach ideen gefragt. der entscheidende quelltext in 
"nurc.cpp" wurde in die TSIC::run() kopiert.

mir ist klar, dass nurc.cpp eine c++ datei ist. ich habe den namen nur 
gewählt, weil der funktionelle anteil sich rein auf den inhalt von einer 
funktion (main) und lokale variblen beschränkt und nicht in einer klasse 
steckt.

@peter: die zuweisung ist dafür, dass die messung sofort anfängt und 
nicht erst auf die erste flanke wartet, um mit der zeitmessung zu 
beginnen (um den anfang vom packet zu finden)


falls noch jemand eine idee hat, wäre ich dankbar. aber bitte nicht 
sinnlos auf der formatierung o.ä. was rumhacken... danke.

von P. S. (Gast)


Lesenswert?

Flo schrieb:

> vielen dank erstmal für eure hilfe. aber ich programmier nich erst seit
> gestern.

Sieht aber so aus.

> falls noch jemand eine idee hat, wäre ich dankbar. aber bitte nicht
> sinnlos auf der formatierung o.ä. was rumhacken... danke.

Wohin dich dein Stil fuehrt, siehst du doch?

Aber du bist ja so erfahren...

von Flo (Gast)


Lesenswert?

tja, schade. man bekommts immer wieder aufs neue bewiesen, dass sämtlich 
leute im internet den respekt vorm anderen verlieren... meist sinds die, 
die im wahren leben nur ganz kleine leuchten sind und sich im internet 
herablassend über andere äußern und somit profilieren wollen.

gerade als diplomingenieur sollte man es doch eigentlich nicht nötig 
haben, andere leute auf diese weise zu kritisieren.

tu niemandem was gutes, so wiederfährt dir nichts schlechtes... diese 
klasse wollte ich zur allgemeinen verwendung vorbereiten und nicht als 
din-muster.

von Peter (Gast)


Lesenswert?

> uint8_t    timeStartTSIC;

> timeStartTSIC = TCNT1L;
> timeStartTSIC |= TCNT1H<<8;

> @peter: die zuweisung ist dafür, dass die messung sofort anfängt und
> nicht erst auf die erste flanke wartet, um mit der zeitmessung zu
> beginnen (um den anfang vom packet zu finden)

bist du sicher das die anweisung das macht was du denkst? Ich dachte du 
hast ein Problem damit das die Messung ebend zu spät beginnt. Und die 
Anweisung sieht mehr sehr merkwürdig aus.

von Flo (Gast)


Lesenswert?

jetzt wo du es "sagst" ^^, fällts mir auch auf, dass die variable nur 
als 8bit deklariert ist.
das könnte es sein, ist wirklich quatsch.

komisch ist trotzdem, dass die gleiche(!) definition bei der 
"nurc"-variante funktioniert.

ich werds heut abend probieren, was das gerät dazu sagt.

danke :)

von Peter (Gast)


Lesenswert?

> komisch ist trotzdem, dass die gleiche(!) definition bei der
> "nurc"-variante funktioniert.
nein, dort setzt du sie auf 0

von Flo (Gast)


Lesenswert?

hm, wo meinst du?
ich hab hier im konstruktor:
TSIC(){
 tStrobe = 0; // zwischen 60 und 65
 timeStartTSIC = TCNT1L;
 timeStartTSIC |= TCNT1H<<8;
 ...
}

geschrieben. überseh ich was???

von Peter (Gast)


Lesenswert?

oh ich hatte nur das gesehen

> uint8_t    timeStartTSIC = 0;

da hatte ich übersehen das du es später noch mal änderst.

von Flo (Gast)


Lesenswert?

so,
ich hab jetzt die 8bit vari auf 16bit geändert und festgestellt, dass 
die messung davon nur gering beeinflusst wird.

was ich jedoch festgestellt hab, ist dass die klasse doch funktionieren 
kann. und zwar dürfen während der messung nicht zuviele anweisungen 
ausgeführt werden.
dass heißt, der tsic wird wunderbar ausgelesen, wenn der controller 
nicht viele berechnungen in der hauptschleife drin hat.
ich denke dass die zeitfenster ganz einfach nicht eingehalten werden 
können.

die lösung sollte doch sein, während der messung (die zwei byte 
auslesen, zu je ca. 125mikrosekunden) keine weiteren berechnungen 
anstellt (bzw. wenige).
oder halt den takt auf 16mhz erhöhen.


ist das realistisch? also kann es wirklich ein timing-problem sein? 
schließlich benutz ich keine pins die auf fallende flanken reagieren und 
habe somit um einiges größeren rechenaufwand.

gruß
flo

von spess53 (Gast)


Lesenswert?

Hi

Was mir so aufgefallen ist:

>das ganze klappt wunderbar, rein mittels software (ohne interrupts und
>warteschleifen). also fallende flanken detektieren, t_strobe messen und
>anschließend die 2byte auslesen.

Dein Programm ist eigentlich eine einzige Warteschleife.

MfG Spess

von Flo (Gast)


Lesenswert?

jo klar ^^. ist im grunde jedes programm, dass sich wiederholt :P.
aber halt "nicht blockierend". also keine delay's drin, was jedoch nach 
neuesten erkenntnissen aber aufs selbe herausläuft.
also während der messung wird fast die gesamte rechenleistung 
benötigt...

von spess53 (Gast)


Lesenswert?

Hi

>jo klar ^^. ist im grunde jedes programm, dass sich wiederholt :P.
>aber halt "nicht blockierend". also keine delay's drin, was jedoch nach
>neuesten erkenntnissen aber aufs selbe herausläuft.
>also während der messung wird fast die gesamte rechenleistung
>benötigt...

Ich habe die TSIC-Abfrage auch schon mal programmiert. Allerdings in 
Assembler und Interruptgesteuert. Die Prozessorbelastung liegt bei ein 
paar Prozent, bei ca.80 Word Flash. Deine Prozessorbelastung liegt bei 
100%. Vom Speicherbedarf ganz zu schweigen.

MfG Spess

von Flo (Gast)


Lesenswert?

hallo spess,

jo klar, interruptgesteuert ist das auch kein problem (mit interrupt auf 
fallende flanke).
so kannst du den tsic aber an jedem anderen pin nutzen. ob dus brauchst 
oder nicht, sei mal dahingestellt.

und 100% auslastung ist aber gemein formuliert :P. nur wegen der while 
schleife? ... das soll ja eine reglung werden, da fängts halt immer 
wieder von vorn an.

ich bin nicht so der assembler-freund und sooviel speicherplatz braucht 
das prog nun auch nicht ;).

gruß

von spess53 (Gast)


Lesenswert?

Hi

>so kannst du den tsic aber an jedem anderen pin nutzen. ob dus brauchst
>oder nicht, sei mal dahingestellt.

Dank Pin-Change-Interrupt neuerer AVRs geht das auch an fast jedem Pin.

>ich bin nicht so der assembler-freund

Und ich bezweifle die Sinnhaftigkeit von C++ auf AVRs. Aber lass dich 
von mir nicht davon abbringen.

>und sooviel speicherplatz braucht das prog nun auch nicht ;).

Schon mal nachgeprüft?

MfG Spess

von Flo (Gast)


Lesenswert?

688 Byte. bei 32k find ich das zu verkraften.

aber das mit dem Pin-Change-Interrupt klingt super! da werd ich mir das 
mal anschauen.

c++ find ich hauptsächlich wegen der wiederverwendbarkeit und 
übersichtlichkeit gut. die pure effizienz mag es nicht sein, klar.

gruß

von Peter (Gast)


Lesenswert?

warum sollte man C Code nicht wieder verwenden könnne? Es gibt genügend 
grosse projekte die in C geschrieben sind. z.b. Der Linux Kernel.

von spess53 (Gast)


Lesenswert?

Hi

>688 Byte. bei 32k find ich das zu verkraften.

Bei 1k nicht mehr so lustig.

>c++ find ich hauptsächlich wegen der wiederverwendbarkeit und
>übersichtlichkeit gut. die pure effizienz mag es nicht sein, klar.

Wiederverwertbarkeit von Software hat nichts mit der Programmiersprache 
zu tun, nur mit dem Programmierer. Oder meinst du etwa ich schreibe z.B. 
die  Displayroutinen für einen bestimmten Displaycontroller jedes mal 
neu?

MfG Spess

von P. S. (Gast)


Lesenswert?

spess53 schrieb:

> Und ich bezweifle die Sinnhaftigkeit von C++ auf AVRs. Aber lass dich
> von mir nicht davon abbringen.

Mein aktuelles Projekt hat 23545 Zeilen Code. Ich wuesste nicht, wieso 
ich auf den erhoehten Komfort durch C++ statt C verzichten sollte.

von spess53 (Gast)


Lesenswert?

Hi

>Mein aktuelles Projekt hat 23545 Zeilen Code.

Willst du mich jetzt einschüchtern?

>Ich wuesste nicht, wieso ich auf den erhoehten Komfort durch C++ statt C 
>verzichten sollte.

Wenn man mit den Ressourcen wildern kann/darf, auf keinen Fall.

MfG Spess

von Peter D. (peda)


Lesenswert?

Durch C++ wird Code nicht automatisch besser lesbar.

Dein Problem ist, daß Du nicht modular arbeitest, sondern unhandliche 
monolithische Codemonster bastelst.

Wenn ich das programmieren müßte, würde ich zuerst eine Bitlesefunktion 
(Verzeihung: Methode) basteln.
Dann damit ne Bytelesefunktion.
Dann damit ne Wertlesefunktion.
Und dann erst das Ganze im Main aufrufen.

Der Witz daran ist, nur die Bitlesefunktion macht die ganzen Timings, 
alle anderen Funktionen sind harwareunabhängig.
Wenn man dann mal die MC-Familie wechselt, muß man nur die 
Bitlesefunktion anpassen.


Das Main mit Code zuzupflastern mag ich nicht (zu unübersichtlich).
Das Main sollte nur Funktionsaufrufe enthalten.

Ich programmiere immer nach der Methode: teile und herrsche (divide and 
conquer).


Peter

von Peter D. (peda)


Lesenswert?

Peter Stegemann schrieb:
> Mein aktuelles Projekt hat 23545 Zeilen Code.

Es dürfte allgemeiner Konsens bestehen, daß die Zeilenzahl kein Zeichen 
der Qualität oder des Funktionsumfangs von Software ist.
Es mag alle möglichen nur entfernt brauchbaren Kriterien geben, aber die 
Zeilenzahl ist keines davon.


Ich habe auch den Eindruck, daß C++ Quellen erheblich größer sind, als C 
Quellen. Insbesondere die Header-Dateien explodieren geradezu in C++.


Peter

von spess53 (Gast)


Lesenswert?

Hi

>Peter Stegemann schrieb:
>> Mein aktuelles Projekt hat 23545 Zeilen Code.

>Es dürfte allgemeiner Konsens bestehen, daß die Zeilenzahl kein Zeichen
>der Qualität oder des Funktionsumfangs von Software ist.

Naja. Für mich wäre die Grösse des resultierenden Programms mal 
interessant. Von der Plattform mal abgesehen.

MfG Spess

von P. S. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Peter Stegemann schrieb:
>> Mein aktuelles Projekt hat 23545 Zeilen Code.
> Es dürfte allgemeiner Konsens bestehen, daß die Zeilenzahl kein Zeichen
> der Qualität oder des Funktionsumfangs von Software ist.

Wenn ich so einen Satz schon lese... der gehoert in die gleiche Tonne 
wie "Ich spreche fuer die schweigende Mehrheit" und "kein vernuenftiger 
Mensch wuerde behaupten..."

> Es mag alle möglichen nur entfernt brauchbaren Kriterien geben, aber die
> Zeilenzahl ist keines davon.

Natuerlich ist die Zeilenzahl ein Hinweis auf den Umfang. So gut oder 
schlecht wie viele andere Kriterien auch.

Ich wollte Spess lediglich verdeutlichen, dass es auch umfangreiche 
Mikrocontroller-Projekte gibt. Die Diskussion gab es schon im Chat und 
dort vertrat jemand vehement die Meinung, 1000 Zeilen Assembler seien 
ein grosses Projekt und man brauche keine anderen Sprachen als 
Assembler, weil sowas damit problemlos zu handeln sei.

> Ich habe auch den Eindruck, daß C++ Quellen erheblich größer sind, als C
> Quellen. Insbesondere die Header-Dateien explodieren geradezu in C++.

Das liegt aber nicht an C++, wie denn auch? Warum der Eindruck entsteht, 
ist doch klar - wer staerker abstrahiert und modularisiert, greift eher 
zu C++ und produziert durch die hoehre Abstraktion auch eher mehr Code. 
Wenn du das gleiche Design in C und C++ aufbaust, wird dagegen der 
C-Code eher umfangreicher sein.

von Flo (Gast)


Lesenswert?

> warum sollte man C Code nicht wieder verwenden könnne? Es gibt genügend
grosse projekte die in C geschrieben sind. z.b. Der Linux Kernel.


ich meinte das mit der wiederverwendbarkeit nur gegenüber von assembler. 
klar, gehts auch. aber so eine klasse ist schöner, so wird das ganze 
projekt schön modular ...

aber wie schon gesagt - alles aus hobby-aspekten und nicht wegen 
100%iger performance. überhaupt seid ihr hier alle ganz schön angespannt 
^^ (@>Mein aktuelles Projekt hat 23545 Zeilen Code. >>Willst du mich 
jetzt einschüchtern?)

wenn man den ganzen elektrokram professionell machen würde (und nicht 
aus hobby wie ich), wird man wohl kaum so ein thema starten, sondern das 
problem - aus reinem können ;) - von selbst lösen...

also danke pst, dass du dann doch noch helfen wolltest!

gruß
flo

von P. S. (Gast)


Lesenswert?

spess53 schrieb:

> Naja. Für mich wäre die Grösse des resultierenden Programms mal
> interessant. Von der Plattform mal abgesehen.

ATMega2560, 82472 byte.

Edit: Das hier wirst du wahrscheinlich auch noch brauchen:

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .data         00000282  00800200  00013ef8  00013fac  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  1 .text         00013ef8  00000000  00000000  000000b4  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .bss          00000b26  00800482  00800482  0001422e  2**0
                  ALLOC
  3 .eeprom       0000006c  00810000  00810000  0001422e  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  4 .stab         00032d0c  00000000  00000000  0001429c  2**2
                  CONTENTS, READONLY, DEBUGGING
  5 .stabstr      000de8c1  00000000  00000000  00046fa8  2**0
                  CONTENTS, READONLY, DEBUGGING

von spess53 (Gast)


Lesenswert?

Hi

>dit: Das hier wirst du wahrscheinlich auch noch brauchen:

Und wo steht jetzt die Progragrösse?

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Progragrösse?->Programmgrösse

MfG Spess

von P. S. (Gast)


Lesenswert?

Was willst du denn wissen, Groesse des .hex-Files, des Code-Segments, 
Code + Daten...? Inklusive lib-c-Teile, ohne? Was ist fuer dich die 
"Programmgroesse"?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.