-         

Ergebnis 1 bis 10 von 10

Thema: Verzögerung ATMega8

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22

    Verzögerung ATMega8

    Anzeige

    ich bau mir grade mit dem ATMega8 eine Drehzahlanzeige fürs Moped. funktioniert auch soweit. nun möchte ich die LCD Anzeige einfrieren, wenn die Auslasssteuerung aufmacht. funktioniert zwar prinzipiell auch, allerdings dauert es unterschiedlich lange, bis der Eingang erkannt wird (bis zu 1 s)

    als Drehzahlgeber verwende ich einen Interrupt, der andere Eingang ganz normal.
    zum testen habe ich geschrieben:

    if PinB.2 = 1 then
    set PortB.1
    end if

    wie gesagt, wenn ich den Eingang nur kurz betätige bleibt die LED am PortB.1 meistens dunkel.

    das Programm wird doch mit der Taktfrequenz abgearbeitet und normalerweise müßte der Eingang doch im Millisekundenbereich abgefragt werden und auch ausgegeben werden, oder sehe ich da was falsch?
    Ich habe auch extra den "waitms" befehl zum display löschen rausgenommen.

    jemand ne allgemeine erklärung oder braucht es dazu das komplette programm?

    danke schon mal...

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.09.2007
    Ort
    Berlin
    Alter
    24
    Beiträge
    1.544
    Hallo kawamaha,

    der gesamte Code währe schon nicht schlecht und evtl. auch noch der Schaltplan, oder du sagst einfach, was wie wo angeschlossen ist!

    Gruß
    Chris

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    mal das test programm:
    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400                                          'ext. Quarz
    Config Lcd = 16 * 2                                         'LCD-Typ
    
    Config Lcdmode = Port                                       'Ports zur Ansteuerung benutzt
    
    Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
    
    On Icp1 Oncapture                                           'Port B0 ist Interupt
    
    Dim Wcapture As Word
    Dim Stopuhr As Word
    
    
    Ddrb.0 = 0                                                  'Eingang B0  Drehzahl
    Ddrb.1 = 1                                                  'Ausgang B1  LED 6000U/min
    Ddrb.2 = 0                                                  'Eingang B2  KIPS
    Ddrb.3 = 0                                                  'Eingang B3  LCD normal/einfrieren
    Portb.0 = 1                                                 'Eingang hochziehen
    Portb.1 = 0                                                 'Ausgang LED
    Portb.2 = 1                                                 'Eingang hochziehen
    Portb.3 = 1                                                 'Eingang hochziehen
    
     Dim Merker As Bit                                          'Selbsthaltung KIPS Eingang B
     Dim Timerword As Word                                      'Rückwärtszähler als Timer
    Timerword = 15000
    
    
    
    Tccr1a = &B00000000                                         'Timer1 Register A
    Tccr1b = &B10000101                                         'Timer1 Register B Bit7:noise cancel, Bit6: fall.Flanke
    
    Timsk.ticie1 = 1                                            'Capture IR ein
    Sreg.7 = 1                                                  'IR global ein
    
    
    
    Main:
    
     If Pinb.2 = 0 Then                                         'KIPS Stellung
      Set Merker                                                'Selbsthaltung
      Set Portb.1                                               'Test Ausgang
      End If
    
    
     If Merker = 0 Then                                         'Timer LCD Anzeige
    Decr Timerword
    End If
    
    If Timerword = 10000 Then
       Cls                                                      'Display löschen
       Lcd Wcapture                                             'neuen Wert in Display schreiben
       End If
    
       If Timerword = 10000 Then
       Timerword = 15000
       End If
    
    
    
       Goto Main
    
    
    Oncapture:
    Timer1 = Timer1 - Capture1
    Wcapture = Capture1                                         'Anz in 1/100s
    
     Wcapture = 10000 / Wcapture                                'Anzeige in Zehntel Hz
     Wcapture = Wcapture * 6                                    'Anzeige in U/min
    
    
    
    
    'If Wcapture > 6000 Then                                     'LED an über 6000U/min
    'Set Portb.1
    'End If
    
    
    
    
    
    Return
    
    
    
    
    End
    hab noch n fehler entdeckt. Eingang hochgezogen und benutze ind. Näherungsschalter, der ein 1 signal bei betätigung liefert. werd das erstmal beheben..

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    Zitat Zitat von Besserwessi
    Die Datenübertragung zum Display kann schon recht lange dauern, auch wenn man kein explizites Waitms mehr drin hat.
    hmm, dann versuch ich mal das display dunkel zu lassen und erst wenn der eingang kommt den wert auszugeben

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    also wenn folgendes im programm steht:
    Cls
    Lcd Wcapture

    kommts zu der verzögerung. ich habs auch in ein unterprogramm rein - genau das gleiche.
    jetzt noch ne frage, bitte nicht steinigen, ich weiß es gibt ein datenblatt, aber ich bräuchte ca. bis 2017, bis ich das kapiert hab.
    hat der ATMega 8 noch einen zweiten Interrupt? ich verwende ICP1, finde aber keinen ICP0 oder ICP2.
    wenn ja, würde das funktionieren und der Eingang sofort bearbeitet werden?

    grazie

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Hi,
    ICP1 ist kein Interrupt, sondern ein Input Capture für den Timer 1.
    Damit kannst Du mit einem externen Signal den Timer beeinflussen, ohne den Prozessor damit zu belasten. Den hast Du auch für die Erfassung Deiner Drehzahl richtig verwendet.

    Die externen Interrupts sind INT0 und INT1. Die wären dann die optimale Wahl, um auf kurze Signale zu reagieren und werden für Dein Problem auch die Lösung sein.

    Gruß,
    askazo

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    jo, danke für die antwort! muß ich mich jetzt echt mit den interrupts befassen
    ich probier erstmal die leitungen zum LCD aus, ob da nicht eine dabei ist, die mir die anzeige einfriert , ansonsten, auf in den kampf...

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Du könntest aber natürlich auch in der ICP Interrupt Routine den Port abfragen ein Bit setzen und dann in der Hauptroutine für die Displaysteuerung dieses Bit für die Anzeigensteuerung verwenden.

    Das hätte den Vorteil ,das die letzte gültig gemessen Drehzahl auch auf das Display kommt.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    21.12.2007
    Beiträge
    22
    hat funktioniert! danke euch

Berechtigungen

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