Hallo,
zu Deiner Frage: regelmäßige Aufrufe von Funktionen macht man bei Mikrocontrollern mit einer Interrupt-Routine, die von einem der eingebauten Zeitgebern (Tmer) ausgelöst wird. Zum Einlesen eignet sich das AVR Tutorial von Mikrocontroller.net.
Zu Deinem Code: Leider muss man sich bei 8-Bit Mikrocontrollern etwas mehr Gedanken machen, was die Datentypen können und was nicht, als bei einem ausgewachsenen PC. So wird Deine HSV-Berechnung so leider nicht funktionieren: Du setzt H auf Temp*6, S und V auf 1. In H ist also in dem Beispiel 78.
hi setzt Du auf H / 60, also auf 1 (da hi ein uint_8 ist, wird der Komma-Anteil einfach abgeschnitten). f setzt Du auf H/60 (also 1, da der komplette Ausdruck in Integer gerechnet wird) - hi (=1), also auf 1-1 = 0. Das ändert sich für <10°C auf hi=0 und f=0, für 20°C-30°C auf hi=2 und f=0, für 30°C-40°C auf hi=3 und f=0 u.s.w. f ist also immer 0. Damit ist aber p = 0, q = V (=1) und t=0 (und zwar unabhängig von der Temperatur).
Damit wird in Abhängigkeit der Temperatur Rot (<10°C und >50°C), Grün(10°C-30°C) oder Blau (30°C-50°C) ganz schwach leuchten. Schwach deswegen, da V=1 und damit R, G, B entweder 1 oder 0. Damit werden aber die entsprechenden LEDs bei i=0 (bzw. 255) eingeschaltet und im übernächsten Durchlauf (der sehr schnell sein kann) wieder ausgeschaltet.
Damit hast Du hier zwei Hauptprobleme: Dadurch, dass die Berechnungen in uint_8 (bzw. int16) durchgeführt werden, bekommst Du nicht den Fabmix, den Du haben willst, und es leuchtet kaum (bei double-Berechnung wäre der Wertebereich von p,q,t zwischen 0 und 1). Du solltest hier die Variablen als Fixkomma-Variale mit Skalierung verwenden - also die Berechnung z.b. in int16 durchführen (dabei allerdings die Berechnung von f durch den Modulo-Operator durchführen), H in Abhängigkeit von dem gewünschten Temperaturbereich skalieren, so dass es zwischen 0 und 240 liegt (dann aber auch nicht durch 60, sondern durch 40 teilen) und S und V auf 255 setzen - H ist also im Vergleich zum Wikipedia-Artikel mit 2/3, S und V mit 255 multipliziert. Da f dann weiterhin zwischen 0 und 1 liegen würde, muss es entsprechend skaliert werden (geschieht, indem man einfach f= H % 40 statt f=H/40-hi rechnet - dies entspricht einer Multiplikation mit 40). Zuletzt noch die p,q,t-Berechnungen passend skalieren, indem die erste 1 durch eine 255 ersetzt wird und dafür der Gesamtausdruck durch 255 geteilt wird.
Jetzt gibt es nur noch zwei Sachen: erstens müssen die Produkte von f durch 40 geteilt werden (da f ja mit 40 skaliert worden ist) - allerdings muss im Ausdruck (1-f) dafü auch die 1 durch eine 40 ersetzt werden. Zum Anderen ergibt sich ein Genauigkeitsverlust bei q und t, da zwei relativ kleine Zahlen voneinander abgezogen werden. Dies kann man dadurch verbessern, dass man das Teilen durch 40 erst nach der Subtraktion durchführt - dann muss allerdings die Konstante auch passend skaliert werden.
Es ergibt sich somit für die Berechnung von p,q und t folgendes:
hi = H / 40
f = h % 40
p = (V * (255-S)/255
q = (V* ( ( (255*40) - (S*f))/40)) / 255
t = (V *( ( (255*40) - (S*(40-f)))/40))/255
p, q und t liegen damit im Bereich zwischen 0 und 255 und damit in dem Bereich, den Du erwartest. Du musst nur noch dafür sorgen, dass Dein H im Bereich zwischen 0 und 240 liegt.
Neben dem Einlesen derTemperatur-Werte und Berechnen der RGB-Größen in einem Interrupt, solltest Du Dir überlegen, ob Du nicht auch die PWM in einen Timer-Interrupt ausagern möchtest. Das reduziert dann die Rechenlast erheblich. Auch würde sonst der Temperatur-Task die PWM stören, und die LED würde unregelmäßig flackern.
Und um noch einen möglichen Stolperstein im Vorraus aus dem Weg zu räumen: Globale Variablen, die in Interrupt-Routinen verwendet werden, müssen als volatile gekennzeichnet sein, damit der Compiler weiss, dass diese Variable jederzeit geändert werden kann (sonst können eventuell Optimierungen dazu führen, dass die Variable nicht so verwendet wird, wie du es erwarten würdest.
Ansonsten noch viel Spass mit der Schulaufgabe - falls Du meine Erklärung zu Festkommazahlen-Arithmetik nicht verstanden haben solltest, könnte Dir auch hier eventuell die Wikipedia weiterhelfen.
Schöne Grüße,
Martin