Hallo toraX,
wenn ich das richtig sehe, dann holst du in der Funktion get_key() ja den ADC-Wert in die Variable i.
Diese Variable hast du in der Funktion LOKAL definiert. So weit ist es noch OK.
In deiner main()-Funktion hast du eine WEITERE LOKALE i-Variable angelegt.
Es sieht so aus, dass du erwartest, dass i aus get_key() in main() den gleichen Inhalt hat.
In main() bekommst du aber den Wert, den du in get_key() über 'return taste' zurückgibst. Da taste in get_key() aber nur die Werte 0xff, 4, 3, 2, 1, und 0 annehmen kann, sollte dein write() immer nur diese Werte senden.

Um den ADC-Wert aus get_key() nach main() zu bekommen kannst du eine GLOBALE Variable ausserhalb aller Funktion anlegen.
Z.B.:
Code:
unsigned int adc_wert;

int main (void)
{
   to was;

   atoi (adc_wert, buffer, 2);
   write (buffer);

   to was anderes;
}

unsigned int get_key(void)
{
   tu hier auch was;

   adc_wert = ADCH;

   if (adc_wert < 36)
      taste = 4;
   ...

   return taste;
}