Nein- wirklich nur ein Kanal pro Lok für die Fahrtregelung ! sonst nichts. Kein Schnick-Schnack.
Dann hast Du beim Tiny24/44/84 ja jede Menge Bein über. Zweimal Stromversorgung, Reset, zwei PWM-Ausgänge, ein Signaleingang. Bleiben acht ungenutzt. Mit drei Beinen kannst Du die konkrete Flanke festlegen (drei Bit, 2^3 Möglichkeiten). Empfehlenswert wären A0, A1, A2. In Der Schaltung dann einfach (Löt-)Jumper oder 'n Mäuseklavier gegen Gnd dran, dann kannst Du die Lok einfach von Kanal 2 auf 5 umschalten. Im Programm gibst Du dann nicht mehr Kanal"6" als Konstante vor, sondern liest PinA ein und maskierst die restlichen Pins weg (AND mit &B00000111). Statt auf "Kanal-Array(6)" zuzugreifen, greifst Du auf "Kanal-Array(PINA And b00000111)" zu. Für den High zustand werden die internen Pullups gesetzt.
Wären noch fünf Beine frei. Könnte man drei Taster dranhängen -> lege derzeitigen Messwert als "max", "min" und "null" fest.
Die letzten beiden Beine dann für Übernahme der Konfiguration ins Eeprom freihalten (ein Taster, eine LED). Da sich das Eeprom nur begrenzt of beschreiben läßt, wäre so auch leicht sicherzustellen, daß nach einem Reset nur ein mal geschrieben werden darf.
da kann soviel schieflaufen mit den Fuses usw.
Hmm... Du hast doch bereits die Frequenz des internen Oszillators geändert - das sind doch auch Fusbits. Ich habe von Bascom nie einen Programmer genutzt, das HEX-File letztlich immer über das AVR-Studio flashen lassen. Da sind die Fuses eigentlich recht übersichtlich. Ok, wenn man 'ne externe Clock oder 'n externen Quarz einstellt, und da keiner angeschlossen ist, steht der Controller. Wenn man den Resetpin disabled, kommt man mit SPI-Programming nicht mehr rein (weil das eben auch den Reset nutzt). Bei einigen Controllern könnte man sich noch mit dem debugWire aussperren.
Egal... lass es so...
wie streched man einen wert ohne fliesskomma ?
Indem Du statt single-Variablen integer oder words dividierst. Bascom dividiert dann logischerweise Ganzzahlen - ggf mußt Du dabei "intelligent" runden - ein zweiter zu beachtender Punkt ist die Genauigkeit.
Ich würde so vorgehen:
Als erstes ist der "Nullwert" zu bestimmen (oder festzulegen).
Danach ermittelst Du die Extrema ("max" und "min"). Du ziehst den Nullwert davon ab (bzw beim "min" andersrum um positive Werte zu erhalten). Die Ergebnisse sollten zwischen 0 und 4000 liegen. Bytes reichen eh nicht -> wir nutzen words (16bit).
Für eine bessere Genauigkeit beim rechnen versechzehnfachst Du die Werte - indem sie einfach viermal nach
links geschoben werden (das kann der Controller wahnsinnig schnell). Da die extrema 255 entsprechen sollen, müßtest Du die Werte durch 255 teilen (Verhältnisgleichung, Dreisatz) - das geschieht aber ganzzahlig (da words). Die Nachkommastellen würden einfach abgeschnitten werden. Deswegen (Trick15) addieren wir vor dem dividieren erstmal 127 (die hälfte von 255), und dividieren anschließend durch 255. Als Ergebnis erhältst Du je einen Divisor-Wert für max und min. (Kannst Du natürlich auch selbst berechnen, und als Konstante vorgeben, aber so kann der Controller sie selbst bestimmen).
Der Nullwert und die Divisoren für max und min sind also bekannt.
Um den duty-Sollwert eines gemessenen Kanal-Rohwertes (Kanal-Array) zu bestimmen, überprüfst Du erstmal, ob der Wert gößer oder kleiner dem "Nullwert" ist (legt den zu verwendenden PWM-Kanal fest, und welcher der beiden Divisoren zu verwenden ist), berechnest die (positive bzw absolute) Differenz zum Nullwert. Das ganze durch verschieben wieder mit 16 multipliziert. Jetzt müßte durch den Divisor geteilt werden, wieder mit demselben Runden-Trick. Da der Divisor als Konstante nicht bekannt ist, muß die vorher zu addierende Hälfte erstmal berechnet werden - durch einmaliges rechtsschieben (=/2). Danach teilst Du durch den Divisor, und hast den PWM-Sollwert. Fertig.