Hallo,
warum denn 16-Bit Timer???
Du hast den Timer auf einen Reload von 20h=32 gestellt. Ergibt bei 24MHz
(=0,5us für ein MZ)(theortisch) eine Frequenz von f=1/2*32*0,5us =
31,250kHz. Von den gewünschten 40kHz ist das ein Stückchen weg... im
16-Bit Mode gehen noch einig MZ - bei deinem Hauptprogramm maximal 2 MZ
und nochmals 3MZ bis zum frisch gesetzten TL0-Register drauf.
Für 40kHz hast Du eine Periodendauer von 25us. Damit brauchst Du bei
24MHz (kein X2-Mode) 25MZ für eine halbe Periode (bis zu toggeln).
25MZ sind mit dem Timer im 8-Bit Mode ohne Problemchen möglich. Mit
TMOD |= 0x02;
TL0 = (256-25); // 0xe7 oder 231
TH0 = (256-25); // 0xe7 oder 231
brauchst nur in der ISR nur noch
void transmitter() interrupt 1
{
//50x wird das signal 10 01 wiederholt
zaehler++;
if(zaehler<101)
....
Mit 50 Impulsen hast Du eine Impulsfolge, die 1,25ms lang ist. Damit ist
der minimale Messabstand auf 330m/s*1,25ms = 41,25cm begrenzt. Ich habe
mit enigen Impulsen bessere Erfahrungen gemacht.
übrigens: sbit transmit0 = P1^0; ist alte RIDE-Syntax. Da kann man an
der falschen Stelle mal auf die Nase fallen (in C ist ^ das XOR).
Aktueller ist sbit transmit0 = P1_0; dazu müssen die Einzelpins in der
Include-Datei deklariert sein (bei neueren Chips eigentlich immer der
Fall - siehe c51rx2.h)
unn tschuess
Bernhard