Forum: Mikrocontroller und Digitale Elektronik 8051 Ultraschall problem


von Michael (Gast)


Angehängte Dateien:

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

von Gast (Gast)


Lesenswert?

Hast du ein verwendbares Datenblatt für diesen Microcontroller? Das was 
ich finde ist leider immer stark Lückenhaft.

von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab nur das Datasheet vom Hersteller.

von Gast (Gast)


Lesenswert?

Ok, welchen Sinn und Zweck erfüllt dein Pin 3.2? Der wird ja nur in der 
while schleife abgefragt und sonst nie verwendet

von Michael (Gast)


Lesenswert?

Das ist ein Taster um das Signal nochmal zu senden.

von Gast (Gast)


Lesenswert?

Ok, dann in deiner transmitter Funktion? Was soll da bitte

transmit0 = !transmit0;
transmit1 = !transmit1;

bewirken? Wenn du die Pins invertieren willst, dann solltest du ein ~ 
verwenden

von Gast (Gast)


Lesenswert?

Wann wird diese Transmitter Funktion denn auch aufgerufen? Bei was für 
einem interrupt? Ohne ein vernünftiges Datenblatt ist es da schwer zu 
folgen und ich habe keinen Nerv da rumzusuchen.

von Michael (Gast)


Angehängte Dateien:

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.

von Bernhard S. (b_spitzer)


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

von Bernhard S. (b_spitzer)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.