PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme bei Ansteuerung eines Ultraschallmoduls



webbuddah
24.10.2008, 08:53
hallo,

versuche mit dem myAVRUSB-Board folgendes US-Modul anzusteuern:
http://www.projet.de/produkte-bauteile.html

und mir die Ergebnisse über RS232 ausgeben zu lassen. Doch leider ist der Erfolg nur mäßig!

verwende folgendes programm:



$regfile = "m8def.dat"
$crystal = 3686400
$baud = 19200

Dim Zeitmessung As Word
Dim Entfernung As Word

Config Portc.2 = Output

Do
Portc.2 = 1
Pulseout Portc , 2 , 500
Pulsein Zeitmessung , Pinc , 2 , 0
Zeitmessung = Zeitmessung * 10 'mal 10 da Pulsein in 10uS Einheiten Ergebnis ermittelt
Entfernung = Zeitmessung / 58 'Umrechnen in Zentimeter
Print "Entfernung: " ; Entfernung ; " cm"
Wait 1
Loop

End


leider scheinen die PULSE-Funktionen von bascom nicht so zu erfüllen, wie ich es mir denke. kann mir da eventuell jemand auf die sprünge helfen?
die entfernung beträgt immer 0 cm, da es zu einem overflow in der pulsein-funktion kommt.

grüße

webbi

p.s. vllt sollte das ganze in die software-ecke verschoben werden?!

Che Guevara
27.10.2008, 17:01
hallo knomic,

so ein ähnliches problem hatte ich auch schon mal. ich wollte ein ir-signal senden und dann empfangen.

mein problem, und das ist wahrscheinlich das gleiche wie bei dir, war, dass der µC nicht schnell genug ist!

häng doch einfach den pin, an dem das teil hängt, an einen interrupt pin (t0) und dann sendest du das signal!
direkt danach setzt du pin t0 auf eingang und dann müsste normalerweise ein interrupt kommen, der dann in die interruptroutine von t0 springt.
so würde ich das zumindest machen!

gruß
chris

webbuddah
18.11.2008, 09:47
hallo che,

erstmal danke für deine antwort :)! hab mich auch entschlossen das ganze via interrupt zu messen. am oszi habe ich erstmal den grundablauf des programmes überprüft, doch leider hapert es jetzt an der automatischen vermessung via interrupts. kannst du mir eventuell dabei helfen?

hier der quellcode:


'################################################# ########
'Füllstandsmessung mit Ultraschallsensor USM-18A
'
'Aufgabe:
'Entfernung wird gemessen und in Zentimetern ausgegeben
'
'
'Autor: Micha
'Datum: 11.09.2008
'Version: 0.11
'
'Changelog:
'0.11: Zeitmessung zw. Interrupts integriert
'0.1: erste Version, Grundfunktionen der Entfernungsmessung
'################################################# #########

'Die üblichen Definitionen bei Standardprogrammen auf Miniboard
$regfile = "m8def.dat"
$crystal = 3686400
$baud = 19200
$hwstack = 32
$swstack = 10
$framesize = 40

Dim Overflow As Integer
Dim Zeitmessung As Single
Dim Entfernung As Single

'LED1 an PC0
Led1 Alias Portc.0
Config Led1 = Output
Led1 = 0


'Timer konfigurieren
Config Timer1 = Timer , Prescale = 1
On Timer1 Timer_int

'Timervorgabe = 61536 -> Overflow = Anzahl ms bei 4MHz Quarz
Const Timervorgabe = 0

'Wenn der Interrupt INT0 auftritt, dann springe zum Label On_int0
On Int0 On_int0 Nosave

'INT0 auf fallende Flanke
Config Int0 = Falling

'PortC.3 als Trigger-Ausgang für Oszimessungen
Config Portc.3 = Output
Portc.3 = 1

'Globale Interrupts freischalten
Enable Interrupts

Do
Print "Loop Anfang!"

'Low-Puls von 250us um US-Modul zu aktivieren
Config Portd.2 = Output
Portd.2 = 0

'Timer starten
Enable Timer1
Overflow = 0

Toggle Portc.3

Waitus 250

'US-Pin auf Input und Pull-UP setzen
Config Portd.2 = Input
Portd.2 = 1
Toggle Portc.3

'INT0 einschalten um Echo-Puls zu detektieren
Enable Int0

Waitms 50

Print "Loop Ende!"
Print "Entfernung: " ; Entfernung ; "m"
Loop

End

On_int0:
'Quick'n'Dirty Interrupt ausschalten um Streuungen nicht zu detektieren
Disable Int0

'Timerwert auslesen
Zeitmessung = Timer1
Print "Zeit:" ; Zeitmessung

Disable Timer1

If Zeitmessung <> 0 Then
Print "Overflow" ; Overflow
Overflow = Overflow * 65536
Zeitmessung = Zeitmessung + Overflow
Zeitmessung = Zeitmessung / 1000
Entfernung = 0.1715 * Zeitmessung
End If

Toggle Led1
Print "Interrupt!!!"

Return

Timer_int:
Timer1 = Timervorgabe
Overflow = Overflow + 1
Return

'Berechnung der Entfernung: s = 0,343*t/2; t in ms -> s in m