www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 8051 Ultraschall problem


Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab nur das Datasheet vom Hersteller.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist ein Taster um das Signal nochmal zu senden.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard Spitzer (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard Spitzer (b_spitzer)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.