-         

Ergebnis 1 bis 8 von 8

Thema: Drehzahlmessung mit mega8, debugger gesucht ;)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16

    Drehzahlmessung mit mega8, debugger gesucht ;)

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    Hallihallo RN Community,

    ich versuche mir derzeit einen dzm und tacho für meine cross mit einem mega8 zu bauen. als hardware habe ich das myavr board mit lpt anschluss.
    zur ausgabe habe ich ein 16*2 display.

    ich habe in Bascom einen code geschrieben, vermute da aber noch nen haufen bugs, wo ich aber einfach nicht weiter weiß, da ich erst durch den elektrotechnik leistungskurs in der schule zur elektronik kam. die ganze mikrocontrollerei habe ich mir soweit möglich dann selbst versucht beizubringen.

    Code:
    $regfile "m8def.dat"
    $crystal = 3686400
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
    Config Lcdpin = 16 * 2
    Config Portb = Output
    
    Dim Umin As Integer                                         'Drehzahl
    Dim Speed As Integer                                        'Geschwindigkeit
    Speed = 113
    Dim Numa As Integer                                         'zahl1 für berechnung                                                     
    Dim Numb As Integer                                         'zahl2 für berechnung
    
    
    Config Int0 = Low Level                                      'int0
    Enable Int0
    On Int0 Isrcounter
    Config Timer1 = Timer , Prescale = 64                       'timer1
    Enable Timer1
    On Timer1 Isrtimer
    Enable Interrupts
    Timer1 = 36735
    
    Do
       'Waitms 100                                                'Display
       'Cls
    
       Locate 1 , 1
       Lcd "Drehzahl:"
    
       Locate 1 , 11
       Lcd Umin
    
       Locate 2 , 1
       Lcd "Speed: "
    
       Locate 2 , 8
       Lcd Speed
    
       Locate 2 , 11
       Lcd "Km/h"
    
    Loop
    End
    
    Isrcounter:
    Incr Numa                                                   'Zähler durch Interrupt
    Return
    
    Isrtimer:                                                   'Timer, alle 500ms Überlauf
    Cls
    Timer1 = 36735
    Numb = Numa * 2
    Umin = Numb * 60
    Numa = 0
    Numb = 0
    Return
    ich hatte mir gedacht durch einen timer in 500ms die anzahl der impulse zu zählen und dann auszugeben.
    das display funktioniert und zeigt mir auch was an. aber ich weiß noch nicht so recht wie ich alles beschalten mus.

    Da ich das signal gern induktiv, um das zündkabel, abnehmen möchte, tun sich mir da noch einige rätsel auf aber das wird schon noch werden. mir wäre jetzt erst einmal die software wichtig, da wenn ich dann int0 mit der masse verbinde und wieder davon weg gehe, wo ja ne fallende flanke entsteht, zeigt mir das display auch etwas an aber halt riesige zahlen und zum teil auch negative.
    nach recht kurzer zeit scheint sich der atmel dann aufzuhängen weil das display dann nur noch wirres, schnell wechselndes zeug anzeigt.

    meine vermutung es liegt an den langen isr, aber ich weiß nicht wie ich das besser machen soll.

    es wäre toll wenn mir hier geholfen werden könnte, ich bin halt einfach noch ein verdammt blutiger anfänger.

    danke im vorraus

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Hallo,
    hier mal ein paar "Fehler":

    Integer sind in Bascom ganze Zahlen mit einem Wertebereich von -32768 bis +32767, also etwa mittig um 0. Wenn du bei einem Wert von 32767 um 1 erhöhst, hat die Variable anschliessend einen Wert von -32768.
    Es gibt auch den Typ Word, ganze positive Zahlen von 0 bis 65535. Du solltest alle Variablen als Word definieren.
    Schau dir mal in der Hilfe unter Language Fundamentals nach. Da kommst du hin, wenn du z.B. das Wort Integer markierst und dann F1 drückst.

    Config Int0 = Low Level gibt an, dass die ISR angesprungen wird, wenn am Eingang PinD.2 (INT0) eine 0 anliegt. Dies passiert kontinuierlich, solange bis am Eingang eine 1 kommt. Du wirst wohl eher
    Config Int0 = Falling wollen. Dann wird die ISR nur einmal ausgeführt, und zwar dann, wenn die Spannung am Eingang das erste Mal auf 0 fällt. Danach muss erst wieder eine 1 kommen, bevor der Interrupt wieder ausgeführt wird.

    Deine Timer ISR wird nur alle 500ms aufgerufen, die Int0 ISR bei max 12.000 U/min alle 5ms. Dazwischen hat der µC nichts besseres zu tun, als andauernd die Werte zum Display zu schreiben, obwohl sich da ja garnichts ändert. Um dies zu verhindern würde ich dir empfehlen, in der Timer ISR ein Flag zu setzen, z.B. Anzeige_flag=1. In der Do Loop fragst du dann
    If Anzeige_flag=1 Then
    Anzeige_flag=0
    'alle deine LCD Befehle
    End If

    Die Anzeige wird dann sehr ruhig stehen.

    Gruß

    Rolf

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16
    Super sache! danke vielmals für die schnelle antwort!
    hat alles bestens funktioniert und läuft jetzt auf anhieb. hätte nicht gedacht dass das so fix geht. danke nochmals.

    ich poste es noch mal zur kontrolle:

    Code:
    $regfile "m8def.dat"
    $crystal = 3686400
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
    Config Lcdpin = 16 * 2
    Config Portb = Output
    
    Dim Umin As Word                                            'Drehzahl
    Dim Speed As Word                                           'Geschwindigkeit
    Speed = 113
    Dim Numa As Word                                            'zahl1 für berechnung                                                               'zahl1 für berechnung
    Dim Numb As Word
    Dim Anzeige_flag As Bit                                     'zahl2 für berechnung
    
    
    Config Int0 = Falling                                       'int0
    Enable Int0
    On Int0 Isrcounter
    Config Timer1 = Timer , Prescale = 64                       'timer1
    Enable Timer1
    On Timer1 Isrtimer
    Enable Interrupts
    Timer1 = 36735
    
    Do
    
       If Anzeige_flag = 1 Then
       Anzeige_flag = 0
                                                    'Display
       Cls
       Locate 1 , 1
       Lcd "Drehzahl:"
    
       Locate 1 , 11
       Lcd Umin
    
       Locate 2 , 1
       Lcd "Speed: "
    
       Locate 2 , 8
       Lcd Speed
    
       Locate 2 , 11
       Lcd "Km/h"
    
       End If
    
    Loop
    End
    
    Isrcounter:
    Incr Numa                                                   'Zähler durch Interrupt
    Return
    
    Isrtimer:                                                   'Timer, alle 500ms Überlauf
    Timer1 = 36735
    Numb = Numa * 2
    Umin = Numb * 60
    Numa = 0
    Numb = 0
    Anzeige_flag = 1
    Return
    kannst du mir evntl auch bei der beschaltung jetzt helfen oder muss ich da ein extra thema aufmachen?
    weil wenn ich einen draht bei int0 anschließe und den nur mit den händen berühre habe ich 3000 umin aufm display stehen. hat das was mit dem entprellen zu tun? und wenn ich dann das signal um das zündkabel abnehmen möchte müsste ich das dann ja verstärken. meine idee mit nem klassischem transistor? is das ne gute idee oder wird das nix?

    grüße, pino

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Die 3000U/min sind ok. Das entspricht 50Hz. Die strahlen ein, weil du keinen PullUp an dem Pin hast. Den PullUp kannst du in dem µC einschalten, einfach mit
    PortD.2=1
    Ich würde an deiner Stelle auch noch ein
    Config PinD.2 = 0 oder DDRD.2=0
    hinzufügen. Das ist zwar der Standard beim Einschalten, aber es wird dann in deinem Programm noch einmal deutlich, dass du den Pin als Eingang benutzen willst.

    Mit der Schaltung zum Auswerten des Zündsignals kann ich dir leider nicht helfen. Vielleicht kann dir hier jemand helfen oder du musst mal in den einschlägigen Foren nachschauen.

    Gruß

    Rolf

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16
    Super sache! ich bedanke mich recht herzlich bei dir! funktioniert 1a die software.

    nur mal noch zum verständnis, PortD.2 = 1 setzt den sozusagen auf high und wenn dann auf low geht, dann springt der mikrocontroller in die isr. Aber was genau sagt das Config PinD.2 = 0?

    MfG Pino

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16
    auch nochmal hier ein super dankeschön an dich rolf! hab jetzt durch hilfe anderer die signalaufnahme hin bekommen und läuft 1a, ohne probleme bis über 15.000 umin!

    MfG Pino

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16
    Hallihallo, nochmal ich,

    aus irgend einem grund hängt sich mein dzm ab und zu auf, manchmal nach sehr kurzer zeit, aber ich weiß noch nicht so richtig warum. ich dachte mir jetzt mal die messung der drehzahl durch das messen der zeit zwischen den impulsen zu bestimmen. einziger haken meine software macht nicht was se soll

    hier die erklärung dazu, vll könnte nochmal einer von euch mir auf die sprünge helfen. problem ist übrigenz das mein display nichts anzeigt.

    danke im vorraus

    int0 ist der interrupt der zündung
    timer1 misst die zeit zwischen den impulsen
    timer0 sollte eigentlich etwa alle halbe sekunde mein dislpay aktualisieren

    berechnung der drehzahl:
    Numb = Numa (vom timer gezählt) / 0,1229079 (Wert aus 16Bit Timer / Prescaled frequenz)
    Numc = Numb / 65536 (16Bit Timer)
    Numd = 1 / Numc
    Umin = Numd * 60

    ich hoffe das versteht einer, ist recht verwirrend, vll liegt da auch schon ein fehler?
    Code:
    $regfile "m8def.dat"
    $crystal = 3686400
    Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.0 , Rs = Portb.1
    Config Lcdpin = 16 * 2
    Config Portb = Output
    
    Config Pind.2 = 0
    Portd.2 = 1
    
    Dim Umin As Word                                            'Drehzahl
    Dim Speed As Word                                           'Geschwindigkeit
    Speed = 113
    Dim Numa As Word                                            'zahl1 für berechnung                                                               'zahl1 für berechnung
    Dim Numb As Single
    Dim Numc As Single
    Dim Numd As Single
    Dim Zahler As Word                                          'zahl2 für berechnung
    
    Config Int0 = Falling                                       'int0
    Enable Int0
    On Int0 Isrcounter
    
    Config Timer0 = Timer , Prescale = 1024
    Enable Timer0
    On Timer0 Isrdisplay
    
    Config Timer1 = Timer , Prescale = 8                        'timer1
    Enable Timer1
    On Timer1 Isrtimer
    
    Enable Interrupts
    Timer1 = 0
    
    Do
    
          If Zahler = 7 Then
    
          Zahler= 0
    
          Numb = Numa * 0.1229079                               'Berechnung umin
          Numc = Numb / 65536
          Numd = 1 / Numc
          Umin = Numd * 60
    
          Cls
    
          Locate 1 , 1
          Lcd "Drehzahl:"                                       'Display
    
          Locate 1 , 11
          Lcd Umin
    
          Locate 2 , 1
          Lcd "Speed: "
    
          Locate 2 , 8
          Lcd Speed
    
          Locate 2 , 11
          Lcd "Km/h"
    
          End If
    
    Loop
    End
    
    Isrcounter:
    Numa = Timer1
    Timer1 = 0                                                  'Zähler durch Interrupt
    Return
    
    Isrdisplay:
    Incr Zahler
    Return
    
    Isrtimer:                                                   'Wenn Timer1 Überlaufen sollte
    Umin = 0
    Return

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    03.07.2009
    Ort
    Plauen
    Alter
    28
    Beiträge
    16
    Hat denn keiner ne ahnung davon? ich glaube mein problem liegt irgendwo in dem zyklus vom refreshen des displays.

    Danke

    MfG Pino

Berechtigungen

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