8051 Ultraschall problem

Gast #1294148
Lesenswert?

Guten Tag,

ich hoffe ihr könnt mir helfen. Ich bin gerade daran für den Atmel 
89C5131 ein Programm zu schreiben um per Ultraschall den Abstand zu 
messen. Das 40khz Signal wird über einen Timer erzeugt (Quarz 24mhz) und 
an P1.0 u. P1.1 ausgegeben. Dieses Signal wird dann 50x wiederholt. 
Danach wird der Empfänger scharf gemacht und an P1.3 müsste der Port von 
1 auf 0 springen. Doch das scheint irgendwie nicht zu funktionieren.

P1.0  | 0 1 |0
P1.1  | 1 0 |1...

Danke schon mal für eure Hilfe

Gruß Michael
Angehängte Dateien:
Gast #1294309
Lesenswert?

Die Funktion Transmitter ist eine Timer Service Routine. Wenn also der 
Timer überläuft wird diese ausgeführt. Hier für wir nicht der Prozessor 
gebraucht da der Timer auf Hardware ebene ausgelöst wird. Auf Port P1.0 
und P1.1 ist der Ultraschallsender angeschlossen. Ich habe diese 
lediglich in meinem Programm als transmit0 und transmit1 deklariert. Der 
Timer soll durch Invertieren der Ports dieses Signal erzeugen siehe 
anhang.
Angehängte Dateien:
#1306278
Lesenswert?

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
#1306283
Lesenswert?

Michael schrieb:
> Auf Port P1.0 und P1.1 ist der Ultraschallsender angeschlossen.
öhmmm... Direkt, ohne Treiber???? Das wird nicht funktionieren. Die 8051 
haben nur einen relativ schwachen Pull-Up Widerstand am Port. Der kann 
bei einer 1 keinen Ultraschall-Sender treiben. Da muss ein Treiber 
dazwischen.
Ich verwende da eine Parallelschaltung aus mehreren CMOS-Invertern. 
74HCT04 oder CD4049B oder CD4069B. Einer Davon kann auch das Signal von 
P1_1 erzeugen. Spart einen Portpin.

unn tschuess
Bernhard

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren