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

Thema: Interrupt auswertung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2004
    Beiträge
    14

    Interrupt auswertung

    Hy,
    ich hab mal wieder ein problem.
    Und zwar ich versuche ich das Tachosingal eines Stink normalen Computer lüfters auszuwerten. Bloß irgendwie klappt das nicht wirklich. Mir fällt langsam nichts mehr ein woran es liegt. Das lüftersignal liegt an Pin4 (int0) an.

    hier mal der Code:
    Code:
    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    Config Lcdpin = Pin
    
    Dim Zehler As Long
    
    On Int0 Int0_int
    
    Config Timer1 = Timer , Prescale = 256
    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall aufgerufen wird
    On Timer1 Timer_irq
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 34286
    'Hier werden die Timer aktiviert
    Enable Timer1
    'Hier wird der Timer und der Teiler festgelegt
    
    Enable Int0
    Enable Interrupts
    Start Timer1
    Zehler = 0
    Do
    Int0_int:
    Incr Zehler
    Loop
    
    
    
    
    'Dies ist der Programmteil, der in dem von ihnen gewählten
    'Intervall aufgerufen wird
    Timer_irq:
      Timer1 = Timervorgabe
    
     Cls
     Lcd Zehler
    
       Return
    
    End
    Die timer sequenz hab ich von dem Tool "rnAvr" hier von der seite.
    Als µM nehme ich denn Mega8.
    Ich hab schon denn ganzen Tag gesucht und gegoogelt aber nicht so richtig was gefunden...

    THX Cokie

    Edit:
    Achso das zählen scheint mit dem Simulator zu klappen, bloß das anzeigen der Zahl auf dem LCD funkt. nicht.

  2. #2
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Also da ist noch etwas falsches gewurschtel im Code. Was sollen diese Zeilen denn?

    Do
    Int0_int:
    Incr Zehler
    Loop

    Ein Interrupt in einer Do Loop Schleife. Das kann so nicht gehen.

    Ändere das mal so das nach der Konfigurierung folgendes kommt:

    do
    loop

    ' und nu Interrupt Routine

    Int0_int:
    Incr Zehler
    return

    Und wozu brauchst du überhaupt einen Timer? Soll der dazu dienen das ab und zu das LCD aktuallisiert wird? Ja kann man so machen. Du kannst es aber auch einfach in der do loop Schleife tun.

    Gruß Frank

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2004
    Beiträge
    14
    jetzt wo du das mit dem Timer sagst, kling logisch... werd ich mal probieren
    Und zu dem interrupt stimmt. Der Interrupt wird ja ausgelöst wenn ein signal ankommt. Ich meisel ein mist in den Code

  4. #4
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2004
    Beiträge
    14
    Also richtig funtk das auch nicht. Habs mit Do_loop schleife und dem timer probiert. in der do-loop für das LCD wird dann bloß immer 11111111111 angezeigt, und mit dem timer immer bloß 1 bzw. 0 is ja ein bisschen wenig an umdrehungen....

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Und wie siehts aus, wenn Du in der Schleife einen Wartebefehl einfügst, der etwas kürzer ist, als der Timer ist?!? (so 75% der Zeit, in der der Timer den Interrupt auslöst/ musste ausprobieren) Das Display braucht doch seine Zeit um die Zeichen aufzubauen. Wenn während dem Zeichenaufbau der "alten" Informationen aber schon wieder was neues reinkommt, dann kann es durchaus sein, das es zu einem Datenüberlauf kommt und deshalb nur "11111111" zu sehen ist.

    mfG aus P
    der E-Fan

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2004
    Beiträge
    14
    Mit dem Wait funkt. das nich weil da anscheind auch keinen Interupts reagieren. Aber mit dem Timer läufts jetzt einiger massen. hab bloß ein Return vergessen. Ich hab aber noch ein problem das das siganl nicht richtig sauber anscheinden kommt. Weil die werte zwischen 2000-8000 Pendeln... Ich denke doch wenn die drehe zahl gleich bleibt sollte doch auch das singnal gleich bleiben, oder sehe ich das falsch?!?.

  8. #8
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Eigentlich hätte es mit Wait auch gehen müssen. Kannst ruhig mal größeres Wait "Wait 3" (3 Sekunden) oder so nehmen.
    Du kannst mal einen fertigen Code wie du ihn nu hast posten, damit man weiter sehen kann.
    Die Anzeige im Timer könnte eventuell zu lange dauern. Dadurch werden dann Interrupts vom Tachogenerator übersehen.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2004
    Beiträge
    14
    So ich hab hier nochmal denn Code:

    Code:
    $regfile = "M8def.dat"
    $crystal = 8000000
    Config Lcd = 20 * 4
    Config Lcdbus = 4
    Config Lcdpin = Pin
    
    Dim Zehler As Long
    
    On Int0 Int0_int
    
    Config Timer1 = Timer , Prescale = 256
    'Hier wird das Unterprogramm festgelegt, das
    'in dem von ihnen eingestellten Intervall aufgerufen wird
    On Timer1 Timer_irq
    'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
    Const Timervorgabe = 34286
    'Hier werden die Timer aktiviert
    Enable Timer1
    'Hier wird der Timer und der Teiler festgelegt
    
    Enable Int0
    Enable Interrupts
    Start Timer1
    
    Int0_int:
    Incr Zehler
    Return
    
    
    
    'Dies ist der Programmteil, der in dem von ihnen gewählten
    'Intervall aufgerufen wird
    Timer_irq:
      Timer1 = Timervorgabe
    
     Cls
     Lcd Zehler
     Zehler = 0
    
     Return
    
    End
    Das dumme is nur jetzt zeigt er wieder bloß 1 manchmal 2 an... Ich fühle mich von dem ding langsam aber sicher verschauckelt [/quote]

  10. #10
    Administrator Robotik Einstein Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    4.943
    Blog-Einträge
    1
    Da haste wieder was falsch in den "Code gemeiselt", wie du es vorher so schön formuliert hast. Du vergisst jedesmal das das Hauptprogramm immer weiterläuft. Bei dir läuft es in die Interrupt Routine rein.
    Du musst nach der Konfigurierung eine do:loop Schleife rein hängen.
    Probier es mal so:

    Code:
    $regfile = "M8def.dat" 
    $crystal = 8000000 
    Config Lcd = 20 * 4 
    Config Lcdbus = 4 
    Config Lcdpin = Pin 
    
    Dim Zehler As Long 
    
    On Int0 Int0_int 
    
    Config Timer1 = Timer , Prescale = 256 
    On Timer1 Timer_irq 
    Const Timervorgabe = 34286 
    
    Enable Timer1 
    Enable Int0 
    Enable Interrupts 
    Start Timer1 
    
    do
    loop
    
    Int0_int: 
    Incr Zehler 
    Return 
    
    
    
    'Dies ist der Programmteil, der in dem von ihnen gewählten 
    'Intervall aufgerufen wird 
    Timer_irq: 
      Timer1 = Timervorgabe 
    
     Cls 
     Lcd Zehler 
     Zehler = 0 
    
     Return 
    
    End

    Es kann aber sein das es immer noch nicht geht, weil der LCD Befehl eventuell zu lange braucht. Dann müsstest du in der Interrupt Routine das Ergebnis in einer Variablen ablegen und in der do:loop Schleife dann diese Variable ab und zu ausgeben (ein Wait 2 oder so dann nicht vergessen).

    Viel Spaß

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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