PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wegstrecke mit CNY36 messen



Jon
11.06.2006, 17:49
Hallo,
ich habe mir bei Reichert die Gabellichtschranke CNY36 gekauft. Die habe ich so auf meine Platine gelötet, dass die Gabel über eines der drei Zahnräder geht. Das Zahnrad hat an einer Stelle ein Loch, sodass ich, wenn das Loch zwischen der Schranke ist, ein Aussignal habe.
Ich habe als Programm zum Messen mal das aus dem Wissensbereich für den Sharp GP1A030 umgeschrieben, also sie Schritte auf eins gestellt (ich weiß nicht, ob das so geht).
Aber ich habe kein ordentliches Ergebnis bekommen.
Hat vieleicht jemand eine Idee, wie das gehen könnte oder hat jemand einen Quellcode oder so.
Ich würde mich über jede Hilfe freuen.

jon

Jon
16.06.2006, 17:30
Ich habe nochmal etwas experimentiert und habe dann dieses Programm herausbekommen:


$regfile = "m32def.dat"
$crystal = 1000000
$baud = 1200

Dim Umdr As Integer

Config Portd.7 = Output
Config Pinc.0 = Input
Portc.0 = 1

Do
If Pinc.0 = 1 Then
Portd.7 = 1
Umdr = Umdr + 1
Print "Umdrehungen: " ; Umdr
Else
Portd.7 = 0
End If
Loop

End


Das Programm zählt zu der Variable Umdr +1 dazu, wenn das Loch zwischen der schranke ist.
Jetzt ist mein Problem, dass, wenn das Rad langsam ist, so lange das Loch zwischen der Schranke ist, dass es so lange +1 rechnet.
Wie kann ich das umgehen?
Gibte es eine Befehl, der sagt, dass er so lange warten soll, bis das Signal wieder an ist und dann erst zu Do springt?

Für den Anfang wäre das so erst mal in Ordnung. Ich kann halt wärenddessen nichts anderes machen.

Trotzdem wäre es sehr schön, wenn noch jemand eine Idee hätte.
Ich würde mich sehr freuen, da ich fast schon am verzweifeln bin.
Kaum funktioniert mal die Elektronik bekomme ich kein ordentliches Programm hin!!

Also ganz habe ich die Hoffnung noch nicht aufgegeben!!

jon

Hanni
16.06.2006, 18:14
Folgende Lösungansätze:
[list=1]
du missbraucht einen Timer als Zähler.
Im Klartext: der Zähler zählt immer dann eins weiter, wenn er eine fallende oder steigende Flanke entdeckt. (Infos dazu im Datenblatt -> Timer -> Clock Sources)
Die bisherigen Umdrehungen stehen damit im TCNT? Register. Vom Prinzip her musst du dort nur noch den Überlauf abfangen und kannst die Umdrehungen überall wenn du sie gerade brauchst abrufen.

Du nutzt einen Interupt um die Umdrehungen zu zählen.
Prinzip: INT0 oder INT 1 auf eine fallende oder steigende Flanke konfigurieren und in der ISR die Umdrehungen um 1 erhöhen.
Auch hier kannst du die aktuellen Umdrehungen überall abrufen.

Der Vorteil beider Lösungen:
Sie laufen so nebenbei und kosten nur ein minimum an Rechenzeit.

Ich hoffe dir damit geholfen zu haben.

Grüße,

da Hanni.

Jon
16.06.2006, 18:54
Danke für die Antwort!!
Von den beiden Lösungen gefällt mir am besten die zweite.
Nur irgendwie kann ich mir das als Programm nicht so wirklich vorstellen. Vor allem habe ich das mit dem Programmieren der ISR nicht so ganz verstanden (da habe ich im Internet nur was Theoretischen gefunden).
Von daher die Frage:
Hast du einen Quellcode oder so??
Wäre auf jedenfall sehr schön.

jon

Hanni
16.06.2006, 19:01
Naja, nen Quellcode könnt ich sicherlich schreiben, nur wäre der dann nicht in Basic .... (sondern in Assembler).
Daher dürfte dir das eher weniger etwas bringen.

Jon
16.06.2006, 19:40
Da kannst du ja wohl nichts machen. Schadeeee!
Machtnichts.
Aber vielleicht kann jemand mir einen Quellqode oder so zu Verfügung stellen. Ich bin mir ziemlich sicher, dass ich das verstehe, wenn ich es mal als Programm sehen würde.
Wie gesagt, wäre schön.

jon

Jon
18.06.2006, 10:01
Ich habe mitlerweile eine Lösung gefunfen.
Ich habe einen Timer missbraucht und dann aus einem Buch ein Programm so umgeschrieben, das es jetzt endlich geht.
Danke für die Hilfe Hanni, sonst wäre ich nicht auf diese Idee gekommen.

jon