Forum: Mikrocontroller und Digitale Elektronik Geeigneter Controller der AVR-Familie gesucht


von libre95 (Gast)


Lesenswert?

Hallo zusammen,

ich versuche Mal mein "Problem" auf das Geringste runterzubrechen - 
eigentlich ganz simpel: Im Rahmen eines Projekts versuche ich, die Zeit 
zwischen zwei steigenden Flanken an einem IO-Pin auszulesen und zu 
speichern, um sie nachfolgend zu verwerten. Dies habe ich bereits mit 
dem Input Capture Mode innerhalb der STM32-Programmierung realisiert. 
Besonders zufriedenstellend war das nicht, da ich dafür die 
vorgefertigte HAL-Library benutzt habe.

Gerne würde ich mich nun erstmals - besonders was das Thema Timer angeht 
- auf die Assembler-Ebene begeben und dachte da direkt an die 
AVR-Familie, denn dort könnte ich mit dem AVR-GCC starten, weil ja dort 
doch sehr viele hardwarenahe Befehle implementiert sind und ich in C(++) 
eigentlich ganz guten Überblick habe.

Mein Auswahlkriterium bezieht sich erstmal nur auf das oben beschriebene 
Problem: Habe gesehen, dass es bei den 16-Bit-Timern vieler 
Mikrocontroller der Familie auch einen solchen Input Capture Mode gibt. 
So weit so gut, gerne würde ich aber die absolut minimalste Peripherie 
verwenden, um meine Aufgabe zu lösen. Bräuchte beispielsweise auch nur 5 
IO's.

Deshalb: Ist es grundsätzlich möglich, die oben beschriebene Aufgabe mit 
einem einfachen 8-Bit-Timer ohne Input Capture Mode zu realisieren?

Vielen Dank für eure Hilfe!

von Falk B. (falk)


Lesenswert?

libre95 schrieb:

> Besonders zufriedenstellend war das nicht, da ich dafür die
> vorgefertigte HAL-Library benutzt habe.

Wo liegt das Problem? Die HAL mag nicht die schönste und beste sein, 
aber wenn man das Problem damit lösen kann, reicht es.

> Gerne würde ich mich nun erstmals - besonders was das Thema Timer angeht
> - auf die Assembler-Ebene begeben und dachte da direkt an die

Warum? Assembler bringt hier keinen Vorteil. Man kann Register auch ohne 
HAL in C direkt setzen. Und gerade die Input Capture Funktion entspannt 
das Timing ungemein, so daß man eben NICHT jeden Takt mit Assembler 
möglichst effizient nutzen muss.

> Mein Auswahlkriterium bezieht sich erstmal nur auf das oben beschriebene
> Problem: Habe gesehen, dass es bei den 16-Bit-Timern vieler
> Mikrocontroller der Familie auch einen solchen Input Capture Mode gibt.
> So weit so gut, gerne würde ich aber die absolut minimalste Peripherie
> verwenden, um meine Aufgabe zu lösen. Bräuchte beispielsweise auch nur 5
> IO's.

Na dann nimm halt einen ATtiny24, der hat einen 16 Bit Timer1 und nur 14 
Pins.

> Deshalb: Ist es grundsätzlich möglich, die oben beschriebene Aufgabe mit
> einem einfachen 8-Bit-Timer ohne Input Capture Mode zu realisieren?

Sicher.

von Jasson J. (jasson)


Lesenswert?

Bei der Frage fehlen die wichtigen Angaben zur Periodendauer des zu 
messenden Signales und wie genau du es aufgelöst haben möchtest.
So ist die Frage nicht zu beantworten.

Aber du hast schon mal erkannt, dass es devices mit einem 
Hardware-Input-Capture gibt.

Entweder, du hast Glück und jemand kennt zufällig die Antwort, wenn du 
oben genannten Parameter bereitstellst, oder du musst dich durch die 
Parameter-Suche wühlen.
Das wird dir eher keiner abnehmen.

Ich könnte höchstens noch eine Idee zu einem anderen Konzept beisteuern:
Je nachdem, wie dein Signal und deine Anforderungen an die Messung sind, 
kannst du das auch in Software lösen.
Dann kannst du die kleinen Dinger aus der Attiny Serie nehmen.
Ich hab mich da mal im Bereich Modelbau ein bisschen mit rumgeschlagen 
:>
Beitrag "RC Servo Signalmessung mit ATTiny85 und Konsorten"

von Jasson J. (jasson)


Lesenswert?

Wenn die SW-Lösung für dich passt - währe der Tiny85 ein heißer 
Kandidat. Der hat 8 Pins minus VCCpin minus MassePin minus Resetpin = 5 
:)

Sofern dein Messpin in 5 Pins gehört :>

von Thilo L. (bc107)


Lesenswert?

> gerne würde ich aber die absolut minimalste Peripherie
> verwenden, um meine Aufgabe zu lösen.

Früher hatte ich auch die Einstellung, nicht mehr als unbedingt nötig in 
meinen vorhandenen AVR Chips ungenutzt zu lassen bzw. den absolut 
assenden AVR-Typ zu nutzen/kaufen.
Aber was genau ist denn nun Grund deines (selbst auferlegten?) 
Minimalismus? Preis der Chips, verfügbarer Platz auf der Platine, das 
Gefühl, im benutzten Chip nicht allzuviel ungenutzt zur Verfügung zu 
haben, Masochismus? Oder was ganz Anderes?
Ich würde Dir raten, nimm einen AVR, den Du bereits in der Schublade 
hast, der ist garantiert günstiger als jeder, den Du ansonsten extra 
kaufen musst. Wenn es allerdings echte Kriterien hinsichtlich 
Gehäuse-Größe gibt, dann nimm den lesitungsfähigsten, der in den 
vorhandenen Platz passt.

von libre95 (Gast)


Lesenswert?

Jasson J. schrieb:
> Bei der Frage fehlen die wichtigen Angaben zur Periodendauer des
> zu
> messenden Signales und wie genau du es aufgelöst haben möchtest.
> So ist die Frage nicht zu beantworten.

Sind solche Angaben nicht nur für die Taktfrequenz des MCU wichtig? 
Verstehe nicht genau, was das mit dem Vorhandensein eines Input Capture 
Modes bzw. der größe des Timers zu tun haben soll... /o\

Die zu messende Zeitspanne beträgt 44us, die Auflösung kann als grob 
angenommen werden bzw. ist zunächst egal.

> Ich könnte höchstens noch eine Idee zu einem anderen Konzept beisteuern:
> Je nachdem, wie dein Signal und deine Anforderungen an die Messung sind,
> kannst du das auch in Software lösen.
> Dann kannst du die kleinen Dinger aus der Attiny Serie nehmen.
> Ich hab mich da mal im Bereich Modelbau ein bisschen mit rumgeschlagen
> :>
> Beitrag "RC Servo Signalmessung mit ATTiny85 und Konsorten"

Vielen Dank für die Verlinkung! Das hat mir direkt ein paar Denkanstöße 
gegeben und mich gleichzeitig ein bisschen gegruselt... :) Vielleicht 
versuche ich es doch erstmal mit dem Input Capture selbst... :)

Noch eine Frage, die du mir bestimmt schnell beantworten kannst: Mit dem 
einen Timer möchte ich wie gesagt den Input Capture realisieren - 
darüberhinaus würde ich gerne noch ein delay über einen Timer 
implementieren (ohne die Delay-Funktion zu nutzen). Benötige ich dann 
dafür zwei von einander unabhängige Timer oder kann ich das mit ein und 
dem selben Timer realisieren?

LG

von libre95 (Gast)


Lesenswert?

Thilo L. schrieb:
>> gerne würde ich aber die absolut minimalste Peripherie
>> verwenden, um meine Aufgabe zu lösen.

> Aber was genau ist denn nun Grund deines (selbst auferlegten?)
> Minimalismus?

Vielleicht bin ich einfach du von früher. :) Die Anforderung, die 
Platine so klein wie möglich zu halten, besteht... allerdings wird ein 
ATtiny mit einem 16-Bit-Timer wahrscheinlich nicht viel größer sein als 
derjenige mit einem 8-Bit-Timer. :D Ein bisschen Masochismus und 
Weiterbildung á la "sowas wie input capture brauch ich bestimmt nicht, 
das bekomm ich selber hin!" mischt bestimmt auch mit :)

von m.n. (Gast)


Lesenswert?

libre95 schrieb:
> Dies habe ich bereits mit
> dem Input Capture Mode innerhalb der STM32-Programmierung realisiert.
> Besonders zufriedenstellend war das nicht, da ich dafür die
> vorgefertigte HAL-Library benutzt habe.

Die Timer beim STM32 sind dafür eigentlich gut geeignet.

Jasson J. schrieb:
> Bei der Frage fehlen die wichtigen Angaben zur Periodendauer des zu
> messenden Signales und wie genau du es aufgelöst haben möchtest.
> So ist die Frage nicht zu beantworten.

So sieht es aus.

Ein einfacher Ansatz mit ATmega88, ohne die genauen Anforderungen zu 
kennen: Beitrag "Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88"
Ein anderer Ansatz mit STM32: 
http://www.mino-elektronik.de/FM_407/fmeter_407.htm#a5

libre95 schrieb:
> Benötige ich dann
> dafür zwei von einander unabhängige Timer oder kann ich das mit ein und
> dem selben Timer realisieren?

Es reicht ein Timer, sofern er mehrere Output-Compare-Register hat.

von Falk B. (falk)


Lesenswert?

libre95 schrieb:

> Die zu messende Zeitspanne beträgt 44us, die Auflösung kann als grob
> angenommen werden bzw. ist zunächst egal.

Naja, wenn es egal ist, reicht auch eine "Puls da oder nicht da" 
Erkennung. Reicht das? 44us sind schon recht kurz, immerhin muss in der 
Zeit der Interrupt für das Auslesen und Umkonfigurieren des Input 
Capture erfolgen. Geht noch in C, wird aber schon sportlicher.

> Noch eine Frage, die du mir bestimmt schnell beantworten kannst: Mit dem
> einen Timer möchte ich wie gesagt den Input Capture realisieren -
> darüberhinaus würde ich gerne noch ein delay über einen Timer
> implementieren (ohne die Delay-Funktion zu nutzen). Benötige ich dann
> dafür zwei von einander unabhängige Timer oder kann ich das mit ein und
> dem selben Timer realisieren?

Dafür reicht ein Timer, denn der kann, wenn man es richtig macht (tm) 
mit der Output Compare Funktion eben diese Verzögerung erreichen.

von Carsten-Peter C. (carsten-p)


Lesenswert?

Hallo,
Du könntest einen Zähler frei laufen lassen und einen INT bei einer 
steigenden Flanke auslösen und in der ISR den Zählerwert auslesen und 
anschließend zurücksetzen. So ähnlich habe ich mal Tasten entprellt. Für 
mehrere Eingänge kannst Du den Zählerstand einfach zwischenspeichern und 
in der Hauptschleife jeweils vom vorigen Wert subtrahieren. Für PCINT 
könnte das so ähnlich aussehen
PC_ISR:
.if NS
  sbic PINB, 6    ;nur beim Impuls =0 prüfen
.else
  sbis PINB, 6    ;nur beim Impuls =1 prüfen
.endif
  reti
  push AL
  in AL,SREG
  push AL
  …….Deine Werte speichern
  pop  AL
  out  SREG,AL
  pop  AL
  reti

Gruß Carsten

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

libre95 schrieb:
> Gerne würde ich mich nun erstmals - besonders was das Thema Timer angeht
> - auf die Assembler-Ebene begeben und dachte da direkt an die
> AVR-Familie, denn dort könnte ich mit dem AVR-GCC starten, weil ja dort
> doch sehr viele hardwarenahe Befehle implementiert sind und ich in C(++)
> eigentlich ganz guten Überblick habe.

Das ganze Spiel geht auch problemlos mit den STM32/Cortex-M. Auch dafür 
gibt es einen GCC und auch da kann man in Assembler arbeiten. Dazu mein 
Tutorial:
ARM-ASM-Tutorial. Wobei ich auch keinen Grund sehe warum man Timer 
nicht in C oder C++ ansteuern soll. Die Timer der STM32 sind schon sehr 
gut geeignet so etwas in sehr präzise zu messen.

von libre95 (Gast)


Lesenswert?

Falk B. schrieb:

> Naja, wenn es egal ist, reicht auch eine "Puls da oder nicht da"
> Erkennung. Reicht das?

Reicht so beschrieben für mich zunächst aus!

> 44us sind schon recht kurz, immerhin muss in der
> Zeit der Interrupt für das Auslesen und Umkonfigurieren des Input
> Capture erfolgen. Geht noch in C, wird aber schon sportlicher.

Das heißt? Wie hoch muss meine Taktfrequenz sein? Eigentlich bin ich von 
einem Timer ausgegangen, der einfach in Mikrosekunden hochzählt.... 
kenne mich mit der Materie eben noch nicht so aus.

> Dafür reicht ein Timer, denn der kann, wenn man es richtig macht (tm)
> mit der Output Compare Funktion eben diese Verzögerung erreichen.

Vielen Dank, dahingehend werde ich mich auch noch einmal informieren. 
Auch Danke an deinen Vorposter.

von Falk B. (falk)


Lesenswert?

libre95 schrieb:
>> 44us sind schon recht kurz, immerhin muss in der
>> Zeit der Interrupt für das Auslesen und Umkonfigurieren des Input
>> Capture erfolgen. Geht noch in C, wird aber schon sportlicher.
>
> Das heißt? Wie hoch muss meine Taktfrequenz sein? Eigentlich bin ich von
> einem Timer ausgegangen, der einfach in Mikrosekunden hochzählt....
> kenne mich mit der Materie eben noch nicht so aus.

Na dann nimm 8 MHz, ggf. einfach mittels internem RC-Oszillator erzeugt.

von libre95 (Gast)


Lesenswert?

Niklas G. schrieb:

> Das ganze Spiel geht auch problemlos mit den STM32/Cortex-M. Auch dafür
> gibt es einen GCC und auch da kann man in Assembler arbeiten. Dazu mein
> Tutorial:
> ARM-ASM-Tutorial. Wobei ich auch keinen Grund sehe warum man Timer
> nicht in C oder C++ ansteuern soll. Die Timer der STM32 sind schon sehr
> gut geeignet so etwas in sehr präzise zu messen.

AVR war wie gesagt nur mein erster Gedanke - vielen Dank für die 
Verlinkung, auch hier werde ich mich weitergehend informieren! :)

Habe ja selbst gemerkt, wie unglaublich gut die Timer der STM32 
funktionieren - das alles hat wirklich nur mit Weiterbildung zu tun, 
denn es kann mmn nicht schlecht sein, etwas mehr über die Register ö.ä. 
innerhalb von MCUs zu lernen.

von libre95 (Gast)


Lesenswert?

Falk B. schrieb:
> Na dann nimm 8 MHz, ggf. einfach mittels internem RC-Oszillator erzeugt.

An 8MHz hatte

Carsten-Peter C. schrieb:
> Hallo,
> Du könntest einen Zähler frei laufen lassen und einen INT bei einer
> steigenden Flanke auslösen und in der ISR den Zählerwert auslesen und
> anschließend zurücksetzen. So ähnlich habe ich mal Tasten entprellt. Für
> mehrere Eingänge kannst Du den Zählerstand einfach zwischenspeichern und
> in der Hauptschleife jeweils vom vorigen Wert subtrahieren. Für PCINT
> könnte das so ähnlich aussehen
> PC_ISR:
> .if NS
>   sbic PINB, 6    ;nur beim Impuls =0 prüfen
> .else
>   sbis PINB, 6    ;nur beim Impuls =1 prüfen
> .endif
>   reti
>   push AL
>   in AL,SREG
>   push AL
>   …….Deine Werte speichern
>   pop  AL
>   out  SREG,AL
>   pop  AL
>   reti
>
> Gruß Carsten

Auch hier vielen Dank für den Denkanstoß! :)

von libre95 (Gast)


Lesenswert?

libre95 schrieb:
> Falk B. schrieb:
>> Na dann nimm 8 MHz, ggf. einfach mittels internem RC-Oszillator erzeugt.
>
> An 8MHz hatte
>

.......ich auch schon gedacht. /o\ Vielen Dank!

von c-hater (Gast)


Lesenswert?

libre95 schrieb:

> Deshalb: Ist es grundsätzlich möglich, die oben beschriebene Aufgabe mit
> einem einfachen 8-Bit-Timer ohne Input Capture Mode zu realisieren?

Nur mit Abstrichen bezüglich der erreichbaren Messgenauigkeit. Mit 
InputCapture kann man halt auf einen Systemtakt genau messen, ohne 
beträgt die Ungenauigkeit immer mindestens drei Systemtakte, bei 
unglücklich konstruierter Software auch noch beliebig mehr.

> Die zu messende Zeitspanne beträgt 44us, die Auflösung kann als grob
> angenommen werden bzw. ist zunächst egal.

Na wenn die Auflösung dir egal ist, dann ist das auch kein Problem. Das 
Intervall ist endlos. 44µs sind bei 8Mhz Systemtakt 352 Takte. Das 
stellt auch in C noch keinerlei Problem dar.

Ein sinnvoll geschriebenes C-Programm sollte also etwa 1,7% maximalen 
Messfehler erreichen, genau wie ein entsprechendes Assembler-Programm. 
Dazu ist allerdings noch der Fehler durch Abweichungen des Systemtaktes 
vom 8MHz-Sollwert zu addieren, der auch leicht mal bei 2% liegen kann, 
aber immerhin quasi-statisch ist, solange Betriebstemperatur und 
Spannung einigermaßen konstant bleiben. Auch das gilt aber natürlich 
vollkommen unabhängig von der verwendeten Sprache.

Was ich nicht verstehe: Wie kann dir die Auflösung egal sein? Also mich 
interessiert bei jeder Messung als Erstes die erreichbare Auflösung 
(natürlich in Relation zur notwendigen Auflösung). Mit Bullshit wie 
"grob bis egal" kann niemand etwas sinnvolles anfangen. Da sollte schon 
wenigstens ein oberer Grenzwert für den zulässigen Fehler angegeben 
werden.

von Dyson (Gast)


Lesenswert?

libre95 schrieb:
> So weit so gut, gerne würde ich aber die absolut minimalste Peripherie
> verwenden, um meine Aufgabe zu lösen. Bräuchte beispielsweise auch nur 5
> IO's.

Mit dem Attiny 24/44/84a bist du da am nächsten dran.

von Heiner (Gast)


Lesenswert?

Eher so der Vollständigkeit halber: 16 Bit Timer/Counter mit Input 
Capture und "wenigen" GPIOs (5, für den 6. müsste man den Reset opfern) 
gäbe es z.B. im ATtiny102. Im Gegensatz zu den bereits genannten 
ATtiny24 (mehr Pins als benötigt) und ATtiny85 (kein 16 Bit Timer) 
sollte der alle deine Anforderung erfüllen und ist - soweit ich es sehe 
- der einzige 8-Pinner AVR dieser Art.

Gibt es allerdings nur als SMD (SOIC und UDFN), aber wenn es um Platz 
geht, sollte das selbstverständlich sein. Wenn es DIL sein muss, geht es 
beim ATtiny44A weiter, ist aber auch nur die nächstgrößere Klasse (14 
Pins). Fun fact: Als BGA nimmt der weniger als die halbe Fläche des 
SOIC8 in Beschlag.

Wenn es wirklich um Platz gehen würde und man unbedingt leiden möchte, 
geht es um das Package, nicht die Pins. Ich muss aber Thilo L. absolut 
recht geben: Es lebt sich viel entspannter, wenn man sich auf eine Hand 
voll Controller beschränkt, die man regelmäßig einsetzt. Das schont die 
Nerven und vereinfacht die Beschaffung, ganz besonders in 
Bastel-Kleinmengen.

von c-hater (Gast)


Lesenswert?

Dyson schrieb:

> Mit dem Attiny 24/44/84a bist du da am nächsten dran.

Na wenn's schon 14-Pinner sein müssen, dann aber gleich richtig: 
ATtiny214/414/814 (XMega-Architektur) oder ATtiny441/841 ("klassische" 
Architektur).

Die haben zwar allesamt 14 Pins, aber dafür immerhin mindestens einen 
16Bit-Timer mit InputCapture-Funktion.

von Jasson J. (jasson)


Lesenswert?

@libre95

Du hast ja jetzt diverse Denkanstöße.

Nu interessiert mich aus Neugier, was deine Applikation ist :)
Grundsätzlich war das schon mal gut, dass du am Anfang deine Frage auf 
das nötigste fokussiert hast.

von Der Robs (Gast)


Lesenswert?

libre95 schrieb:
> Hallo zusammen,
>
> ich versuche Mal mein "Problem" auf das Geringste runterzubrechen -
> eigentlich ganz simpel: Im Rahmen eines Projekts versuche ich, die Zeit
> zwischen zwei steigenden Flanken an einem IO-Pin auszulesen und zu
> speichern, um sie nachfolgend zu verwerten. Dies habe ich bereits mit
> dem Input Capture Mode innerhalb der STM32-Programmierung realisiert.
> Besonders zufriedenstellend war das nicht, da ich dafür die
> vorgefertigte HAL-Library benutzt habe.
>
> Gerne würde ich mich nun erstmals - besonders was das Thema Timer angeht
> - auf die Assembler-Ebene begeben und dachte da direkt an die
> AVR-Familie, denn dort könnte ich mit dem AVR-GCC starten, weil ja dort
> doch sehr viele hardwarenahe Befehle implementiert sind und ich in C(++)
> eigentlich ganz guten Überblick habe.
>
> Mein Auswahlkriterium bezieht sich erstmal nur auf das oben beschriebene
> Problem: Habe gesehen, dass es bei den 16-Bit-Timern vieler
> Mikrocontroller der Familie auch einen solchen Input Capture Mode gibt.
> So weit so gut, gerne würde ich aber die absolut minimalste Peripherie
> verwenden, um meine Aufgabe zu lösen. Bräuchte beispielsweise auch nur 5
> IO's.
>
> Deshalb: Ist es grundsätzlich möglich, die oben beschriebene Aufgabe mit
> einem einfachen 8-Bit-Timer ohne Input Capture Mode zu realisieren?
>
> Vielen Dank für eure Hilfe!

Hallo,

eine paar ganz wichtige Infos fehlen noch: Wie genau muß das denn sein, 
und wie soll der µC mit dem Rest der Welt reden?
Die Aussage 16Bit sind halt etwas "unpräzise". 16 Bit heißen ja nur, daß 
man bis 65536 zählen kann. Das muß halt mit der Taktquelle und internen 
Prescalern halt auch zu Deiner "Signallänge" passen.

Hintergrund sind die Taktquelle - einfach ausgedrückt:
- intern: billig, einfach, ungenau (bis zu +-10% je nach Device)
- extern: teuer, aufwendiger, genau (Genauigkeit "beliebig" je nach 
Geldbeutel)

Kommunikation mit Rest der Welt:
µC sinnvollerweise so wählen, daß bevorzugte Kommunikation (z.B. 
UART,SPI, I²C etc.) in HW unterstützt wird.

Auflösung 16 Bit:
Es nutzt wenig, einen µC mit z.B. 8 MHz zu wählen (1 Takt=125ns) und 
dann mit einem 16-Bit Timer ein Signal mit z.B. 5µs auszuwerten. Dann 
hätte man auch nur 40 Schritte (d.h. nur gut 5 Bit im Timer genutzt).

Solange man diese Randbedingung nicht kennt, sind wir hier vollständig 
im Glaskugelmodus bei der µC Auswahl.

Robert

von Georg M. (g_m)


Angehängte Dateien:

Lesenswert?

ATtiny1616-MNR
20-Pin VQFN 3x3mm
Flash: 16 kB
SRAM: 2 kB
EEPROM: 256 bytes
16-bit Timer/Counter type A (TCA): 1
16-bit Timer/Counter type B (TCB): 2
12-bit Timer/Counter type D (TCD): 1

von Peter D. (peda)


Lesenswert?

libre95 schrieb:
> Benötige ich dann
> dafür zwei von einander unabhängige Timer oder kann ich das mit ein und
> dem selben Timer realisieren?

Input-Capture und Output-Compare kann man getrennt benutzen (separate 
Interrutpvektoren).
Assembler bereitet nur unnötigen Ärger und Fehlerquellen (push/pop, 
keine Datentypen, keine Variablenverwaltung usw.).
Wer C kann, muß mit dem Klammerbeutel gepudert sein, wenn er Assembler 
macht.

Beitrag #6707569 wurde von einem Moderator gelöscht.
Beitrag #6707574 wurde von einem Moderator gelöscht.
von Pandur S. (jetztnicht)


Lesenswert?

Hoert mit den Tinies auf. die sind superguenstig fuer hohe Stueckzahlen, 
dafuer vielen Restirktionen. Unterhalb einem Mega sollte man sich nicht 
antun.

von Einer K. (Gast)


Lesenswert?

libre95 schrieb:
> ich versuche Mal mein "Problem" auf das Geringste runterzubrechen -

Steht im Widerspruch zu:
Pandur S. schrieb:
> Hoert mit den Tinies auf.

Der/Die/Das libre95 ist der Gott seines Projektes.
Darum auch der Wunsch das Himmelreich.
Ihm ist die Entscheidung, der Geldbeutel und die Arbeit.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

nur mal so als Tipp. Die AVRxDB Serie hat einen Timer namens TCB der hat 
spezielle Messfunktion dafür. Man kann die Frequenz oder Pulsweite oder 
Frequenz + Pulsweite in 16Bit messen. 32Bit mittels Kaskadierung. 
Prescaler stehen alle von TCA zu Verfügung. Noch genauer gehts nichts.

von c-hater (Gast)


Lesenswert?

Veit D. schrieb:

> nur mal so als Tipp. Die AVRxDB Serie hat einen Timer namens TCB der hat
> spezielle Messfunktion dafür.

Die schon mehrfach im Thread genannten neuzeitlichen Tinys haben genau 
denselben Timer...

von Veit D. (devil-elec)


Lesenswert?

c-hater schrieb:
> Veit D. schrieb:
>
>> nur mal so als Tipp. Die AVRxDB Serie hat einen Timer namens TCB der hat
>> spezielle Messfunktion dafür.
>
> Die schon mehrfach im Thread genannten neuzeitlichen Tinys haben genau
> denselben Timer...

Stimmt. :-)  Allein die Kaskadierung bleibt den AVRxDA/DB vorenthalten. 
Wird der TO nicht benötigen wenn er bekannte 44µs messen möchte.

: Bearbeitet durch User
Beitrag #6708058 wurde von einem Moderator gelöscht.
von Moby (Gast)


Lesenswert?

Peter D. schrieb:
> Assembler bereitet nur unnötigen Ärger und Fehlerquellen (push/pop,
> keine Datentypen, keine Variablenverwaltung usw.).
> Wer C kann, muß mit dem Klammerbeutel gepudert sein, wenn er Assembler
> macht.

In Assembler schreibt man gerade deshalb um nicht von der zusätzlichen 
Hochsprachenbürokratie belästigt zu werden und ALLE Freiheiten mit 
minimalsten Anforderungen an die Programmierumgebung genießen zu können!

von c-hater (Gast)


Lesenswert?

Moby schrieb:

> In Assembler schreibt man gerade deshalb um nicht von der zusätzlichen
> Hochsprachenbürokratie belästigt zu werden und ALLE Freiheiten mit
> minimalsten Anforderungen an die Programmierumgebung genießen zu können!

Das kann ein Aspekt sein. Für mich ist aber meist eher der entscheidende 
Punkt: Asm dann zu benutzen, wenn die Lösung auf gegebener Hardware mit 
C schwierig bis unmöglich wird, mit Asm aber noch geht, vielleicht sogar 
gerade noch geht.

Denn genau diese Grenzfälle zeigen oft sehr deutlich auf, dass 
C-Compiler eben immer noch recht weit davon entfernt sind, für jeden 
Anwendungsfall optimalen Code zu erzeugen. Was natürlich nicht wirklich 
überraschend ist, da wesentlich Aspekte eines Gesamtsystems dem Compiler 
halt garnicht als Information zur Verfügung stehen bzw. ihn auf Grund 
seiner (doch recht beschränkten) Arbeitsweise zumindest nicht weiter 
interessieren.

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> ... ganz viel ...

Ich schätze, das ist der "vernünftigste" Beitrag, den ich je von dir 
gesehen habe.

Ich fasse es mal so zusammen:
1. Keine Sprache ist ideal bzw. immer optimal
2. ASM ist einsetzbar, insbesondere, wenn es keine Alternativen gibt.

von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Ich fasse es mal so zusammen:
> 1. Keine Sprache ist ideal bzw. immer optimal

Natürlich nicht. Den entscheidenden Punkt hast du aber übersehen: die 
EINZIGE Sprache, die das theoretische Leistungsmaximum SICHER 
bereitstellen kann, ist: ASM.

Natürlich ist hier zu 100% der Programmierer dafür verantwortlich, es 
auch tatsächlich zu erreichen.

Keine Chance, die Verantwortlichkeit auf irgendeine andere Instanz 
abzuwälzen, wie es C-Programmierer so gerne tun. Da ist halt LibXYZ 
Schuld, wenn's nicht geht. Armselige Schutzbehauptungen inkompetenter 
Programmierer...

> 2. ASM ist einsetzbar, insbesondere, wenn es keine Alternativen gibt.

Und auch oft, wenn es es durchaus Alternativen gäbe, also nicht die 
Performance eine Rolle spielt, sondern die einfache Implementierung ohne 
viel Syntax-Gebabel.

Was halt für SEHR viele kleine µC-Anwendungen durchaus der Fall ist.

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> Was halt für SEHR viele kleine µC-Anwendungen durchaus der Fall ist.

Ergänzend vielleicht: Alles, was in einen AVR8 passt, ist aus meiner 
Sicht eher "klein". Klein genug, um es auch in Asm problemlos 
beherrschen zu können.

von libre95 (Gast)


Lesenswert?

Jasson J. schrieb:
> @libre95
>
> Du hast ja jetzt diverse Denkanstöße.
>
> Nu interessiert mich aus Neugier, was deine Applikation ist :)
> Grundsätzlich war das schon mal gut, dass du am Anfang deine Frage auf
> das nötigste fokussiert hast.

Hab den Hallsensor HAL 15xy vorliegen, der hat einen implementierten 
Power-On Self-Test, den ich mittels MCU ausgewertet habe. Quasi 
überhaupt nichts Großes: Zeit zwischen den beiden steigenden Flanken 
(aus dem Datenblatt) beträgt 44us => Grüne LED leuchtet. Andernfalls 
eine rote. Habe den Self-Test natürlich zuvor ohne MCU getriggert und 
mir das Ganze auf dem Oszi angeschaut, da wurden bei ca. 50 Durchläufen 
mit verschiedenen Sensoren niemals über 44us erreicht, wenn das Ding 
funktioniert hat. Deshalb habe ich mich bisher auch nicht wirklich um 
eine eventuelle Messgenauigkeit bzw. Toleranz (z.B. +/- 1us) gekümmert. 
Wollte eben erstmal, dass es prinzipiell funktioniert und das tut es 
eigentlich auch. /o\

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.