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
Hast du ein verwendbares Datenblatt für diesen Microcontroller? Das was ich finde ist leider immer stark Lückenhaft.
Ok, welchen Sinn und Zweck erfüllt dein Pin 3.2? Der wird ja nur in der while schleife abgefragt und sonst nie verwendet
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
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.