Welche Teile deines Programms hast du unabhängig von allen anderen
getestet?
Wenn du jetzt sagst: keine
dann hast du IMHO den Kardinalfehler schlechthin gemacht. Du hast zuviel
Code auf einmal geschrieben ohne dir zu überlegen in welcher Reihenfolge
du die Dinge einzeln während der Entwicklung in Betrieb nehmen kannst.
Leg in dem Fall dein Programm beiseite und fang noch einmal mit einem
neuen an.
Aber: arbeite diesmal in Etappen.
Ein guter Einstieg ist es zb immer, wenn man zunächst sicherstellt, dass
"Ausgaben" klappen, was auch immer dann "Ausgaben" konkret sein mögen.
Bei dir ist das eine LED.
Also soll dein erstes Programm einfach nur die LED einschalten.
Gegentest: LED ausschalten.
Dann weist du schon mal: Der Pin funktioniert, die LED funktioniert, der
Prozessor funktioniert, ich kann Programme übertragen.
Dann gehts weiter mit der PWM.
Aber bitte nicht mit Tabelle und allem Drum und Drann. Einfach nur Timer
konfigurieren, einen fixen Wert ins OCR Register und die LED muss eine
bestimmte Helligkeit einnehmen. Den Wert variieren und die Helligkeit
muss sich verändern.
Dann kommt der ADC ins Spiel
In einem ersten Schritt reicht es völlig aus, den ADC Wert auszulesen
und wenn der über 512 ist (oder was die Grenze sein soll) eine LED
einschalten. Ist der Wert unter der Grenze die LED ausschalten.
Den Schritt könnte man überspringen, indem man den ADC Wert geeignet
skaliert direkt ins OCR Register schreibt. Gegebenenfalls die PWM
Obergrenze auf 1024 setzen (also 10 Bit PWM) oder den ADC Wert
entsprechend zurechschieben, damit Der ADC Wert die PWM auch voll
aussteuern kann.
Und dann kannst du deine Tabelle zur optischen Linearisierung einbauen.
Wichtig: Den nächsten Schritt, das nächste Zwischenziel erst dann in
Angriff nehmen, wenn das vorhergehende zur Zufriedenheit funktioniert.
Sonst gehts dir nämlich so wie jetzt: Du stehst mit einem Haufen Code da
der nicht funktioniert und hast keine Ahnung wo du mit Suchen anfangen
sollst.
Und den meisten hier wirds so ähnlich gehen wie mir: Wir haben keine
Lust, da jetzt 5 Subsysteme auf mögliche Fehler abzuklopfen, wenn wir
uns auf nichts Getestetes stützen können und einzig die Fehlermeldung
"Geht nicht" haben. Der Fehler kann etwas ganz einfaches sein (wird es
wahrscheinlich auch sein), aber er kann überall sein, weil nichts in
seiner einfachsten Form getestet wurde.
Das schlimmste was du tun kannst, ist von der Annahme auszugehen, dass
du ein fehlerfreies Programm auf Anhieb abliefern kannst. Das kann
niemand. Daher arbeitet man in Etappen, damit man möglichst schnell und
möglichst oft testen kann.