Hallo The_Darkside,
ich bin der Meinung, dass dein Programm einfach zu schnell ist.
Wenn ich das richtig sehe, dann prüfst du über die "if (PIND.."-Abfragen was denn da passieren soll.
Jedes mal, wenn du also in der whileschleife bist, erhöhst bzw. verringerst du den pwm_val-Wert wenn die jeweilige Bedingung das so will.

Für wie lange sind denn die einzelnen Bits in PIND gesetzt?
Kann es sein, dass deine Schleife so schnell ist, dass du den pwm-Val-Wert innerhalb kürzester Zeit mehrfach hochzählt und somit den Wertebereich wie von SprinterSB schon angekündigt überschreitest?
(Eigendlich überschreitest du den Wertebereich nicht, da von der 16-Bit-Variablen ja nur die letzten 8 Bit in das Register OCR1A übernommen werden. [So weit ich weiss ist das ein 8-Bit-Register])

Du solltest innerhalb der while-Schleife mal ein Sleep einbauen und nach der if-Konstruktion noch die Grenzen für den pwm_val bzw. das Register OCR1A prüfen und bei über- unterschreiten korrigieren.