Hab hier ein conversion Problem von float nach int bzw. umgekehrt.
Ist dies mit einem 8-bit MCU überhaupt ohne weiteres möglich?
Der Compiler wills einfach nicht bauen.
float min = 40.f;
float max = 200.f;
int adcValue = ADCH;
float adcValueNormalized = (float)adcValue / 255.f;
PWM läuft ohne Probleme in Mode 5. Habs das Signal mit dem Oszi geprüft.
Hab OCR0A auf max (float max = 200.f) gesetzt und will nun ADC und PWM abgleichen;
Der Compiler baut das sehr wohl. Der Fehler tritt beim Linken auf.
Wenn Deine Zielhardware keine native Unterstützung für Gleitkommazahlen bietet, dann solltest Du sie auch nicht einsetzen. Wie andere schon gesagt haben wird das sonst in Software emuliert. Und zack ist der Speicher (zu) voll.
Codegröße im ELF ist 460 Bytes mit avr-gcc v8, also inclusive Startup-Code und Lib-Funktionen (32-Bit Fixed-Point Multiplikation und Division mit Rundung zum Nächsten).
Mit "unsigned accum" und Konstanten (Suffix "uk") fällt die Codegröße auf unter 300 Bytes.
Mit weiterer [unsigned] accum Arithmetik wächst die Code größe dann nur noch langsam, weil man die Lib-Funktionen ja nur 1x braucht.
Der ist schon in dem Moment ausgeschöpft, wo du an float denkst.
Wie kann man auf die Idee kommen, bei insgesamt nur 1kB verfügbarem Programmspeicher eine Float Library einzubinden?
Vermutlich aufgrund meiner Unwissenheit, daß der Tiny13 keine
Hardwareunterstützung für Gleitkommazahlen bietet.
Das machen Microcontroller so gut wie nie. So etwas gibt es erst bei recht fetten Kloppern wie einem ARM-Cortex M4, der aber in einer mehrere Größenordnungen anderen Liga spielt als irgendein AVR, ob Tiny oder Mega.
Zu den allermeisten Mikrocontrollern gibt es Datenblätter. Manchmal
lohnt es sich, dort einen Blick reinzuwerfen.
Hab die 178 Seiten PDF seit gestern hier vorliegen, und sogar mal reingeschaut um herauszufinden wie ich Phase Correct PWM, ADC und Timer konfiguriere.
Habs halt nicht wie einen Roman von Anfang bis Ende gelesen. Dafür war ich zu ungeduldig.
Ich hätte ja gleich ein dicken "Klopper" genommen. Downsizen lässt sich später immer noch. Nur Upsizing ist schwierig ohne neue Hardware. Gut die Datenblätter haben dann halt mal 800 Seiten - aber hey irgendeinen Tod muss man sterben. Viel Erfolg noch :)
Werde wohl nun mit dem Attiny13 float-Operationen vermeiden.
Ich würde sogar noch einen Schritt weiter gehen: auf Mikrocontrollern mit so wenig RAM (hier 64 Bytes, für Daten und Stack) würde ich C vermeiden!
Wenn man den Compiler nicht seeehr intim kennt, fliegt man in Null-Komm-Nix auf die Schnauze. Und selbst wenn man ihn gut kennt, kommt man nicht drum herum, den generierten Kode zu überprüfen - ein Register-spill zuviel und es bleibt kein Stack für IRQs oder einen weiteren Funktionsaufruf übrig. Beim AVR kommt noch dazu, dass alle Daten (auch read-only) ins RAM kopiert werden. Wenn man da nicht ordentlich PROGMEM benutzt, reicht's evtl nichtmal für den main-Aufruf.
Insbesondere sollte man fremde Libraries, die nicht explizit auf so geringen Speicherbedarf getrimmt sind[1], nicht ohne Code-Review benutzten. Die FP-Routinen z.B. würden für jede Temp-Variable, die sie evtl benötigen, ~10% des RAMs belegen. Wieviele brauchen sie für die verschiedenen Funktionen? Wie tief sind Funktionsaufrufe geschachtelt? Usw.
Klar, man kann einfach "Augen-zu" losprogrammieren und ausprobieren - das sind dann die Programme, die undefiniert absemmeln[2] und wo dann das Problem in der HW gesucht wird (das Programm ist ja "ausprobiert" und läuft!) :-(
Assembler ist auf AVRs ziemlich angenehm - ruhig mal ausprobieren[3] ;-)
--
[1] Die geben dann an, wieviel Resourcen (Stack/RAM/ROM/Takte) sie benötigen. Bei so geringem Speicher ist das kein "nice to have" sondern zwingend notwendig!
[2] Z.B. IRQ zum unpassenden Zeitpunkt, wo der Stack gerade gut belegt war.
[3] So wenig Speicher ist einer der wenigen Fälle, wo ich Assembler propagiere ...
Ich würde sogar noch einen Schritt weiter gehen: auf Mikrocontrollern
mit so wenig RAM (hier 64 Bytes, für Daten und Stack) würde ich C
vermeiden!
Ich würde sogar noch den Schritt weitergehen, und so etwas wie den ATtiny13 überhaupt nur dann einzusetzen, wenn es dafür einen sehr, sehr guten Grund gibt. Und den gibt es beim To augenscheinlich nicht.
Ich würde sogar noch den Schritt weitergehen, und so etwas wie den
ATtiny13 überhaupt nur dann einzusetzen, wenn es dafür einen sehr, sehr
guten Grund gibt. Und den gibt es beim To augenscheinlich nicht.
Ich habe den Tiny13 gewählt, weil ich für mein Projekt genau eine PWM und ein ADC benötige. Wollte deshalb keinen größeren MCU.
Ich habe den Tiny13 gewählt, weil ich für mein Projekt genau eine PWM
und ein ADC benötige.
Dann hättest du dir vorher auch Gedanken um die weiteren benötigten Ressourcen, insbesondere hinsichtlich der Software machen sollen.
Mal ehrlich, für ein Hobbyprojekt in einstelligen Stückzahlen würde ich mir die Platzknappheit eines 1-KiB-Controllers nicht so ohne weiteres antun. Ein ATtiny25 kostet nur ein paar Cents mehr und bietet schon doppelte Ressourcen, und mit dem ATtiny85 im gleichen Gehäuse hast du reichlich Reserven während der Entwicklungsarbeit.
Bei wirklich finanziell knapp aufgestellten Projekten ist das was anderes, aber da macht man sich (s.o.) halt auch wirklich schon mal vorher Gedanken, dass die Software damit zurecht kommen kann.
Danke, ich werde eure Tipps beim nächsten Projekt beherzigen.
Die einfache PWM Steuerung ist nun fertig.
Program Memory Usage : 368 bytes 35,9 % Full
Data Memory Usage : 4 bytes 6,3 % Full
Warning: Memory Usage estimation may not be accurate if there are sections other than .text sections in ELF file