-         
+ Antworten
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Impulszähler zur drehzahlbestimmung in Basom

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    11.01.2004
    Beiträge
    44

    Impulszähler zur drehzahlbestimmung in Basom

    Hallo zusammen,

    hab ein Timingproblem mit dem AVR s2313 und Bascom. Für meinen Roboter möchte ich per Gabellichtschranke die Impulse eines Rades über 1 Sekunde zählen. Die Taktfrequenz des 2313 ist 4096000 Hz. Wenn ich nun prescale für den Timer1 auf 1024 stelle und das reload auf 4000, dann zählt er 1 sekunde lang. Der Int0 zählt andauernd die Impulse am Rad. Wenn Timer1 startet übernimmt er den Zählerstand vom Int0, und löscht den Zähler, wenn er nach ner Sekunde wieder reinschaut, sind dann wieder die Impulse entsrechend angehäuft worden. Das müßte doch so gehen oder? Wenn ich das Programm laufen lasse scheint es zu gehen, wenn ich aber die Print ausgabe im Int0 weglasse kommen viel zu hohe Zahlen (siehe Listing). Und das ist mein Problem!! Außerdem braucht die Schaltung einige Sekunden bis der Timer1 richtig läuft!! Also irgendwas ist faul im listing. Hoffentlich hatt einer ne Idee.
    Angehängte Dateien Angehängte Dateien

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Hi Stevensen,

    so kurze Beispielprogramme am besten direkt in den Beitrag posten und mit CODE markieren. Dadurch kann man schneller reinschaun und helfen.
    Bist du wirklich sicher das die Werte ohne PRINT zu hoch sind? Könnte es nicht vielmehr sein das die Werte mit dem Print zu klein sind? Der Print Befehl über RS232 ist ja relativ langsam, dadurch könnten Impulse verloren gehen.
    Überprüf das doch nochmal genau und poste auch mal die Ergebnisse/Zahlen!

    Gruß Frank


    Code:
    $regfile = "2313def.dat"
    $crystal = 4000000
    $baud = 9600
    Const Reload = 4000
    
    Dim Zaehler As Word
    Dim Halbe As Byte
    Dim Umdrehungen As Word
    Config Portd = Output
    Config Timer1 = Timer, Prescale = 1024
    
    
    Config Int0 = Falling        'Low Level oder Falling
    
     Portd 0.2 = 1
     Portd 0.6 = 1
    
    On Timer1 Timer1_isr
    On Int0 Onrts
    
    Umdrehungen = 0
    Zaehler = 0
                                           
    Enable Int0
    
    Enable Timer1
    
    Enable Interrupts
    
    Print "los gehts"
    Do
    
    Print Umdrehungen
    
    Loop
    
    End
    
    
    Timer1_isr:
    Load Timer1, Reload
    
    Portd.5 = Not Portd.5   ' Led togglet
    
    If Portd.5 = 1 Then
                Umdrehungen = Zaehler
    
                'Print Umdrehungen
                 Zaehler = 0
    
                 End If
    Return
    
    Onrts:
        Incr Halbe
    
        If Halbe = 4 Then
                      Halbe = 0
                      Portd.6 = Not Portd.6
                      Incr Zaehler
                      Print Zaehler ' !!!!! Wenn diese Print Ausgabe vorhanden ist scheint es zu gehen, wenn sie fehlt kommen zu große Zahlen.
    
                End If
                                                     'Int0-Routine
      Return

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.02.2004
    Beiträge
    33
    hallo,
    ich möchte gerne mit meinem s4433 (4mhz)die daten meines futaba ppm empfängers auswerten.
    dazu möchte ich jeweils die highzeiten messen, da diese variiren.
    das was aus dem empänger rauskommt ist ein signal für Servos welches ja bekanntlich eine lowzeit von etwa 20 ms hat und einer high-zeit im bereich von 1,1 bis 2,1 ms. leider durchschaue ich den obigen code nicht, sodass ich ihn auch nicht auf meine bedürfnisse umschreiben kann

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    @stevensen: Das Programm sieht so aus, als könnte es höchstens mal Impulse "verpassen" (besonders mit dem Print im Interupt). Wenn tatsächlich zu viele 'rauskommen, könntest du höchstens noch extrem kurze(bis hinunter zur Größenordnung der Taktfrequenz) Störungen auf der Interuptleitung haben, die dann als Impulse verstanden werden (je nachdem, wie lange deine Impulse dauern, kannst du es ja mal mit 'nem geeigneten Kondensator probieren.). Wäre aber seltsam, wenn die sich mit den Verlusten durch Print ausgleichen würden. Hast du bei deinem Fehler bei jeder Geschwindigkeit gleich viele Impulse zu viel oder sind es um einen bestimmten Faktor zu viele?

    @Red Dragon: Ein Programm zum "Verstehen" von Servosignalen hab' ich auch mal geschrieben (wenn dir das ASM-Programm hilft, kann ich es ja mal posten.).
    Was verstehst du denn an dem Beispiel genau nicht?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.02.2004
    Beiträge
    33
    ASM hilft mir ledier noch weniger. Da ich ein basic autodidakt bin, bin ich froh das ich soweit basic kann. Doch die ganze sache mit den interrupts hab ich noch garnicht verstanden. Auch die bascomhilfe und google haben mich beim verstehen nicht wirklich weiter gebracht. welches interrupt für welchen port? wie den timer auswerten? bis jetzt war ich halt immer nur bei "normalem" AN/AUS-code um serielle oder paralelle signale auszuwerten oder mototren zu steuern.
    habt ihr vielleicht ne internetseite zur einführung?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    02.03.2004
    Ort
    Paderborn
    Alter
    32
    Beiträge
    614
    @Red Dragon: Unter "ENABLE" und "ON" findest du in der Bascom-Hilfe, wie du Interupts verwendest (du bist bestimmt nicht der erste, der das nicht findet. Die Stichpunkte sind, wenn man nicht schon vorher weis, wie der Befehl heist, nicht gerade naheliegend.).
    Welcher davon welchem Port/Pin entspricht, steht im Datenblatt zum AVR (Pinbelegung).
    wie den timer auswerten?
    "Config Timer0 = Timer" und
    "Start Timer1" (oder Timer0) macht den jeweiligen Timer an.
    "Timer1=0" setzt ihn zurück
    "Variable=Timer1" liest den Wert in eine andere Variable ein.
    In der Hilfe zum Timer steht, welcher Zeit das dann entspricht.

    Eine nette Seite dazu kannte ich mal, aber die hab' ich jetzt nicht gefunden.

  7. #7
    Gast
    ich hab mir jetzt mal aus allem was ich gefunden habe was zusammengesucht. gefunzt hat es leider nicht

    Code:
    Config Timer1 = Counter , Edge = Rising
    On Timer1 Timer1over
    Enable Timer1
    Enable Interrupts
    Timer1 = 0
    Dim Zeit As Integer
    Do
    Lcd Zeit
    Loop
    
    
    Timer1over:
    Zeit = Timer1
    bitte um hilfe und verbessreung

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo Gast,
    was grundsätzliches:
    1.Du musst den Timer auch starten (vgl.Gottfreak's Posting)
    2.Ein Sprung in eine (Unter-)Routine braucht ein Return.
    Gruss, Michael

  9. #9
    Gast
    aber auch so
    Code:
    Config Timer1 = Counter , Edge = Rising
    On Timer1 Timer1over
    Enable Timer1
    Enable Interrupts
    Start Timer1
    Timer1 = 0
    Dim Zeit As Integer
    Do
    Lcd Zeit
    Loop
    
    
    Timer1over:
    Zeit = Timer1
    return
    klappt es nicht. ich bin halt noch nicht so erfahren in Bascom und mit den avrs wie manch anderer hier.

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo Gast,
    das funktioniert schon, leider wissen wir nicht, was du mit dem Interrupt machen willst.Und deinem Programm hast du es auch nicht gesagt...
    Ausserdem fällt es mir beim Namen 'Gast' nicht leicht, die Beiträge zuzuordnen (Du könntest sowohl stevensen als auch Red Dragon sein. Beide benutzen z.B.verschiedene Controller...)
    Gruss, Michael

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •