1

Freitag, 18. April 2008, 22:04

Mal wieder eine Frage .

HAllo ,
nachdem es Jetzt mit der Tastatur und alles geklappt hat .
Habe ich jetzt ein kleines problem .
Und komme gerade nicht vorran .

Also ich möchte Messen wie lange es dauert bis sich eine Welle genau
einmal gedreht hat .
Dafür habe ich mir einen Halter gebaut wo 2 Hallsensoren genau 20° auseinander sind .

Und darüber Dreht sich ein Magnet .
Jetzt möchte ich das der Timer Startet wenn der Magnet den ersten Sensor Passiert und aufhört wenn er am zweiten vorbei kommt.
Und danach soll alles auf Display.

DAs ich das Ganze mit den Timern mache ist klar .
Aber ich kriege es nicht in den Kopf wie das gehen kann.
Oder wie das Programm aussehen muß.
Hat da jemand einen vorschlag ?
Oder eine Seite oder Programm wo soetwas schon Realisiert wurde ?

Gruß
Holger
Aller Anfang ist schwer...
Colco Apache AH 64
Silverlit PicooZ DHL Edition :D

2

Samstag, 19. April 2008, 01:34

http://www.roboternetz.de/wissen/index.php/Bascom_Interrupts

Du konfigurierst und startest einen Timer. Dein Impuls wird auf einen Interrupteingang gelegt und der Interrupt ebenfalls freigegeben. Dann brauchst du eine ISR in die verzweigt wird, in selbiger wird erst der Timer ausgelesen und anschliessend wieder auf Null gesetzt. Im Hauptprogramm kannst du den gesicherten Timerwert dann auswerten.

Ich hatte kürzlich meiner Drehbank eine Drehzahlanzeige verpasst, dabei wurden pro Umdrehung vier Reflexmarken erfasst und die Drehzahl auf einer 4-stelligen LED-Anzeige ausgegeben.

Zitat

'***********************************************************
'
' Drehzahlmesser für Drehmaschinen
' (c) AnKoTec (März 2008)
' 4-stellige Version
' 4 Markierungen auf der Spindel

' Hardware:
' ---------
' PD6: Signaleingang
' PB0-PB6: 7-segment - Segment A bis G
' PD1-PD5: 7-segment - Ziffer - Select

'***********************************************************
'* Deklarationen *
'***********************************************************

$regfile = "ATtiny2313.dat" 'ATTiny2313
$crystal = 8000000 '8MHz Quarz
Ddrb = &B11111111 'PortB = Ausgang
Ddrd = &B10111111 'PortD = Ausgang bis auf PD6


Dim Stelle(4) As Byte 'Einzelstellen 1-4 der Anzeige
Dim Casedummy As Integer 'Dummy für Case-Abfrage
Dim Schleife1 As Byte 'Schleifenzaehler für flackerfreie Anzeige
Dim Zaehler As Byte 'Allg. Schleifenzähler 1-4 für Anzeigestellen
Dim Intzaehler As Byte 'Zähler in interrupt-routine
Dim Impulse As Integer 'Impulse von Sensor
Dim Zeit1 As Long 'Puffer für Timerergebnis
Dim Messung As Word 'Messwert
Dim Messpuffer(4) As Word 'Messwertpuffer zur Anzeigeglättung
Dim Mittelwert As Integer 'Mittelwert Drehzahl
Dim Umdrehung As String * 4 'Umwandlung Drehzahl in String um Nullen zu entfernen
Dim Stringlaenge As Byte 'Länge Drehzahlstring um Nullen zu entfernen
Dim Stri(4) As String * 1 'Einzelstellen als String

On Icp1 Oncapture 'Sprungziel Interrupt
On Ovf1 Onoverflow 'Sprungziel Overflow
Config Timer1 = Timer , Prescale = 1024 , Capture Edge = Rising 'Timerkonfiguration auf 31250Hz
Enable Icp1 'Interrupteingang freigeben
Enable Ovf1 'Overflow freigeben
Enable Interrupts 'Interrupt freigeben




'***********************************************************
'* Hauptschleife - Werte berechnen, LED-Anzeigen ansteuern *
'***********************************************************

Do

'-----------------------------------------------------------
' Neuer Messwert?
' - Neuen Mittelwert bilden
' - Zahl in String umwandeln, Länge ermitteln,
' vorne mit SPACE ergänzen
' - String in Einzelzahlen zerlegen
'-----------------------------------------------------------

Umdrehung = Str(messung)
Stringlaenge = Len(umdrehung)
Select Case Stringlaenge
Case 1 : Umdrehung = " " + Umdrehung
Case 2 : Umdrehung = " " + Umdrehung
Case 3 : Umdrehung = " " + Umdrehung
End Select

For Zaehler = 1 To 4
Stri(zaehler) = Mid(umdrehung , Zaehler , 1)
Stelle(zaehler) = Val(stri(zaehler))
Stelle(zaehler) = Stelle(zaehler) + 48
Next Zaehler


'-----------------------------------------------------------
' LED-Anzeige jeweils 25x leuchten lassen,
' dann nächste Stelle
'-----------------------------------------------------------

For Schleife1 = 1 To 127

For Zaehler = 1 To 4
Casedummy = Stelle(zaehler)
Select Case Casedummy
Case 48 : Portb = 64
Case 49 : Portb = 121
Case 50 : Portb = 36
Case 51 : Portb = 48
Case 52 : Portb = 25
Case 53 : Portb = 18
Case 54 : Portb = 2
Case 55 : Portb = 120
Case 56 : Portb = 0
Case 57 : Portb = 16
Case Else : Portb = 127
End Select
Portd.zaehler = 0
Waitus 100
Portd.zaehler = 1
Next Zaehler

Next Schleife1

Loop



'***********************************************************
'* Interrupt-Routine: *
'* - Interrupt blockieren *
'* - Impulszähler erhöhen und Abfrage ob 4 Impulse = eine Umdrehung *
'* - Zeit messen, Timer rücksetzen, Messwert berechnen, Mittelwert bilden *
'* - Bei nahendem Timerüberlauf Messung = 0 *
'* - Impulszähler rücksetzen *
'* - Interrupt wieder freigeben *
'***********************************************************

Oncapture:
Disable Icp1
Incr Impulse
If Impulse = 4 Then
Zeit1 = Timer1
Timer1 = 0
If Zeit1 < 65535 Then
Messung = 2812500 / Zeit1
Messpuffer(4) = Messpuffer(3)
Messpuffer(3) = Messpuffer(2)
Messpuffer(2) = Messpuffer(1)
Messpuffer(1) = Messung
Mittelwert = 0
For Intzaehler = 1 To 4
Mittelwert = Mittelwert + Messpuffer(zaehler)
Next Intzaehler
Messung = Mittelwert / 4
Else
Messung = 0
End If

Impulse = 0
End If
Enable Icp1
Return


'***********************************************************
'* Overflow-Routine (rein formal) *
'* - Messung = 0 *
'***********************************************************

Onoverflow:
Messung = 0
Return


Kannst ja mal versuchen dich reinzudenken.
Schöne Grüsse
Toenne

3

Montag, 21. April 2008, 15:33

Warum misst Du nicht die Zeit, die die Welle braucht, um sich genau einmal zu drehen?

Dafür reicht doch schon ein Sensor?!

Die 20° kannst Du auch niemals so genau abmessen/positionieren, wie die 360°, die eine ganze Umdrehung ganz von selbst hat.

Grüße
Malte