Bei den begrenzten SRAM-Möglichkeiten des ATTiny26 würde ich auf die Verwendung von Functions mit byval Parameter-Übergabe und einigen internen Variablen verzichten und anstatt dessen mit einem GOSUB - RETURN Konstrukt arbeiten.

Bei der Durchsicht Deines Programmes sind mir einige Dinge aufgefallen:

Warum verwendest Du nicht die BASCOM-Funktion GETADC(channel)?

Du stellst den ADC auf linksbündige Ausgabe und verwendest nur das High-Byte der Ausgabe und machst aus einem 10Bit AD-Wandler einen 8-Bit AD-Wandler und verschenkst damit 2 Bit der Auflösung?

Das High-Byte der linksbündigen ADC Ausgabe kann den höchsten Wert 255 haben. Du zählst 3 solcher Ausgaben in einer Byte Variablen zusammen um daraus einen Mittelwert zu bilden. Sofern die Summe aller 3 Ausgaben größer als 255 wird, hast Du einen Overflow und damit ein falsches Ergebnis?

Wenn Du zur Mittelwertbildung für die Sample-Anzahl eine 2-Potenz Zahl nimmst wie 2, 4, 8, .... kannst Du die Division durch eine Shift rechts Operation ersetzen. Shift Right,1 ist dividiert durch 2, Shift Right,2 ist dividiert durch 4, Shift Right, 3 ist dividiert durch 8 usw.
Eine Shift-Operation ist nicht nur wesentlich schneller als eine Division sondern braucht auch weniger Programm-Speicher.

Schau Dir mal folgender Code an (nicht auf Hardware getestet)

Code:
Config Adc = Single , Prescaler = Auto

Start Adc


Dim ADCNum as Byte
Dim wADCWert as Word
Dim bADCWert as Byte
Dim bCounter as Byte

ADCNum = 0     ' Kanal setzen


Gosub HoleADC

' End



HoleADC:
wADCWert = 0
' 4 AD-Werte einlesen und Mittelwert bilden
For bCounter = 1 to 4
wADCWert = wADCWert + getADC(ADCNum)
next

' Hier könnte man wADCWert als Pseudo-12Bit-Wandlung verwenden
' RETURN


' oder in einen 10Bit Wert umwandeln (Mittelwert bilden)
' Shift wADCWert, Right, 2
' Return


' oder wenn es ein Byte-Wert sein muss (8Bit)

Shift wADCWert, Right, 4
bADCWert = wADCWert

RETURN