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

Thema: Timer geht vor

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370

    Timer geht vor

    Hallo,
    habe eine Uhr erstmal zum testen programmiert. WAS HABE ICH FALSCH GEMACHT? Die Zeit geht zu schnell. Muss man "probieren", bis die uhr genau genug läuft? das prog. soll später auf nem Mega8 laufen...



    $regfile = "m128def.dat"
    $crystal = 16000000
    $baud = 9600

    Config Timer1 = Timer , Prescale = 1024

    Dim Sekunde As Byte
    Dim Minute As Byte
    Dim Stunde As Byte
    On Timer1 Timer1int
    Load Timer1 , 15625
    Enable Interrupts
    Enable Timer1
    Start Timer1

    'HAUPTPROGRAMM
    Stunde = 10 'uhrzeit stellen
    Minute = 29

    Do
    Waitms 100
    Loop
    End


    Timer1int:
    Load Timer1 , 15625 '1ne Sekunde
    Sekunde = Sekunde + 1
    If Sekunde = 60 Then
    Sekunde = 0
    Minute = Minute + 1
    If Minute = 60 Then
    Minute = 0
    Stunde = Stunde + 1
    If Stunde = 24 Then Stunde = 0
    End If
    End If
    Print Chr(12)
    Print Stunde ; ":" ; Minute ; ":" ; Sekunde
    Return

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo sebastian.heyn,
    dadurch, daß dein Timer1 ja überläuft, und dadurch den Interrupt auslöst, mußt du den errechneten (15625) vom maximalen Timerwert (65535) abziehen.
    Dein Timer muß im Interrupt also mit 65535-15625 = 49911 geladen werden. Dann sollte der Sekundenwert auch stimmen.
    Gruß, Michael

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    MMHH,
    so läufts zu langsam.. Gibts noch ne andre oder evtl bessere möglichkeit nen interrupt auszulösen?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    ich hab mal nachgeguckt und festgestellt das dein reloadwert falsch ist...

    reloadwert bei prescaler 256 = 3036

    also timervorgabe=3036 NICHT 65536 - 3036

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    lach mich bitte nicht aus, aber auf welcher berechnungsgrundlage beruht das? Ich dachte ich muss clock also 1600000 (hoffe ich habe alle nullen) / prescalewert rechnen? Oder hab ich was nicht verstanden? (wie öfters mal)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    habe mir gerade die software aus dem forum gezogen DANKE NOCHMAL AN FRANK FÜRS BEREITSTELLEN.

    mal schauen wies damit läuft!

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    HAHA......... neeeeeeeeiiiiiiiiiiiin ich lach nicht

    keine angst ich kanns im prinzip auch nicht so gut ich habs jetzt mit rnAVR gemacht das geht ganz gutt damit!

    muss ich auch immer nachgucken falls ich grad keinen rechner mit rnAVR dabei hab

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    47
    Beiträge
    1.244
    Hallo sebastian.heyn,
    jetzt hab ich extra mal ein Atmega8-Board aufgebaut, um das zu testen.
    den Befehl:
    Load Timer1 , 15625 '1ne Sekunde
    hatte ich bisher nicht genutzt.
    Bei mir läuft es damit auch zu schnell
    Ich habe also den Befehl durch:
    Timer1 = 49911
    ersetzt und siehe da, die Zeit läuft richtig, ts, ts. Genau eine Sekunde pro Interrupt.
    Gruß, Michael

  9. #9
    Gast
    So gehts in jedem Fall, hier ist der komplette Code den das Tool rnAVR generiert hat:

    Code:
    '##############################################################
    ' Timer Beispiel für das universelle Controllerboard
    ' RN-Control mit mega 16 oder mega 32
    ' Ausführliche Infos zum Controller Board findet man
    ' unter www.robotikhardware.de als auch im
    ' www.roboternetz.de
    '
    ' Dieses ruft einen Timer Interrupt in ihrer gewählten Frequenz auf.
    ' Bei jedem Interrupt wird der Zustand der LED einmal umgeschaltet, dadurch
    ' blinkt die LED genau in der halben Frequenz
    ' Der generierte Code kann direkt in den Bascom-Compiler kopiert
    ' und kompiliert werden. Natürlich läßt sich der Code auch in
    ' bestehende Programme integrieren
    
    ' Autor: CodeGenerator rnAvr vom roboternetz.de
    ' Weitere Beispiele und Beschreibung der Hardware
    ' unter http://www.Roboternetz.de oder robotikhardware.de
    ' Eigene Programmbeispiele sind im Roboternetz gerne willkommen!
    '##############################################################
    
    
    
    'wenn mega 32, dann ändern in  $regfile = "m32def.dat"
    $regfile = "m16def.dat"
    
    'Quarzfrequenz, entsprechend ihren Angaben
    'der passende Quarz muss in die Fassung gesteckt werden
    $crystal = 16000000
    
    'nur notwendig wenn RS232 benutzt werden soll
    $baud = 9600
    
    'Hier wird der Timer und der Teiler festgelegt
    Config Timer1 = Timer, Prescale = 256
    
    'Der Port mit der dritten LED auf RN-Control wird als Ausgang programmiert
    Config Pinc.2 = Output
    'Hier geben wir der Definition einen schöneren Namen
    Led3 Alias Portc.2
    
    'Hier definieren wir den RN-Control Piepser als Ausgang
    Config Pind.7 = Output
    'Hier geben wir der Definition einen schöneren Namen
    Piepser Alias Portd.7
    
    '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 = 3036
    
    
    'Hier werden die Timer aktiviert
    Enable Timer1
    Enable Interrupts
    
    'Hier ist die Programmhauptschleife
    Do
    'Hier könnte Ihr Hauptprogramm stehen
    Loop
    
    
    
    'Dies ist der Programmteil, der in dem von ihnen gewählten
    'Intervall aufgerufen wird
    Timer_irq:
      Timer1 = Timervorgabe
    
    'Hier könnte nun ihre beliebige IRQ-Routine stehen
    'Dabei sollte man darauf achten das diese nicht mehr Zeit
    'benötigt, als das Intervall zuläßt
    
    'Der Zustand der LED wir umgekehrt, wodurch sich blinken in der halben Frequenz ergibt
    'Hohe Frequenzen sind natürlich nicht mehr sichtbar
       Toggle Led3
    'Der Zustand des Piepsers wird umgekehrt, wodurch sich ein Ton in der halben Frequenz ergibt
       Toggle Piepser
    
       Return
    Das Tool geht auch bei Mega128 und anderen AVR-Controllern

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    03.11.2004
    Beiträge
    370
    Ja habe meinen Code gestern auch angepasst (laut dem Beispiel in rnAVR) scheint echt zu passen. wollte heute früh gucken aber da hatter der controller irgendwie nen reset bekommtn, warscheinlich über das ISP kabel beim hochfahren des rechner (wie dumm). gestern lief sie noch nach 5 stunden recht genau soweit ich erkennen konnte.

+ Antworten
Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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