-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Hilfe bei Zeitsteuerung

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341

    Hilfe bei Zeitsteuerung

    Anzeige

    Hallo ich möchte in Bascom eine Zeitsteuerung umsetzen. Das klappt vom Grundprinzip auch. Nur aus irgendeinem Grund geht der Zähler um 1 sek vor.

    Code(aufs wichtige reduziert):

    Code:
    $crystal = 16000000
    .....
    Config Portb.3 = Input
    .....
    Dim Minuten As Byte
    Dim Sekunden As Byte
    .....
    Config Timer1 = Timer , Prescale = 256
    Const Timervorgabe = 3036
    On Timer1 Timer_irq
    Enable Interrupts
    ..... 
    Minuten = 0
    Sekunden = 0
    .....
    Do
    If Pinb.3 = 1 Then
       Gosub Automodus
    End If
    Loop 
    .....
    Automodus:
    Enable Timer1
    Do
    Locate 2 , 1
    Lcd Sekunden
    If Minuten = 0 And Sekunden = 10 Then
    "Mach was"
    End If
    Loop
    ..... 
    Timer_irq:
      Timer1 = Timervorgabe
      Incr Sekunden
      If Sekunden = 60 Then
        Incr Minuten
        Sekunden = 0
      End If
    Return
    Jemand eine Idee wodran das liegen kann ?

    mfg Blamaster

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    42
    Beiträge
    1.140
    Code:
    If Sekunden = 60 Then
        Incr Minuten
        Sekunden = 0
    Hier liegt der Fehler, würde ich sagen.
    Eine Uhr Springt von der 60. Sekunde auf die erste Sekunde der neuen Minute. Bei dir gibt es noch eine "nullte" Sekunde, Deine Minute hat so also 61 Sekunden. Wenn Du nach dem hochzählen der Minute die Sekunde also auf 1 setzt, sollte es stimmen.

    askazo

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Stimmt. Daran hatte ich nicht gedacht. Ändert aber bei meinem Code ja trotzdem nicht wirklich was, da er ja ab der 1. sekunde falsch zählt und das halt schon bevor die 1. Minute rum ist.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Zitat Zitat von askazo
    Code:
    If Sekunden = 60 Then
        Incr Minuten
        Sekunden = 0
    Hier liegt der Fehler, würde ich sagen.
    Eine Uhr Springt von der 60. Sekunde auf die erste Sekunde der neuen Minute. Bei dir gibt es noch eine "nullte" Sekunde, Deine Minute hat so also 61 Sekunden. Wenn Du nach dem hochzählen der Minute die Sekunde also auf 1 setzt, sollte es stimmen.

    askazo
    Ich glaube du irrst dich:

    Eine Uhr zählt ja von X:00 bis X:59..
    d.h. wenn du die 60.sekunde hast, musst du die minute um 1 erhöhen und die sekungen auf null setzen:
    0:58 - 0:59 - 1:00

    Das sollte so stimmen!

    @Blamaster:
    Was genau ist denn jetzt das Problem?
    Fängt er einfach bei 1 an zu zählen, aber sonst klappt alles?

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    jenau das ist es. und somit wird die aktion schon nach 4 anstelle der angegebenen 5 sekunden ausgeführt.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Ich kenne mich jetzt mit Bascom leider nicht so genau aus, wie Bascom den Timer konfiguriert.
    Aber wenn er beispielsweise bei 0 anfängt, unf herunter zählen lässt, bekommst du logischerweise direkt am Anfang einen IRQ und somit steht der Zähler schon am Anfang auf einer Sekunde.

    edit: sorry ich bin grad irgendwie nich beim AVR gewesen, der müsste eigentlich immer hochzählen!
    Aber vielleicht wird der zähler am anfang irgendwie vorgeladen und erreicht daher direkt einen overflow?!?
    Am besten mal debuggen und schauen wie die Timer Register aussehen, nachdem der Timer initialisiert wurde!

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Und wie genau geht das?

    "Am besten mal debuggen und schauen wie die Timer Register aussehen, nachdem der Timer initialisiert wurde!"

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Update.

    Hab ebend gerade in die Timer_irq nochmal eine Lcd Ausgabe gesetzt, um zu sehen wann der Timer Interrupt das 1. mal ausgelöst wird.

    Sobald ich den Taster drücke springt er sofort in die Timer_irq.

    Woran kann das liegen ?

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Ja also das debuggen funktioniert nur, wenn du einen JTAG Programmierer hast. Hat Bascom nicht auch einen Simulator? Dann könnte man da einfach mal gucken wie die Timer Register gesetzt werden.

    Versuche mal unter
    Const Timervorgabe = 3036
    direkt den Timer1 zu setzten:
    Timer 1 = Timervorgabe

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Hmmmm, bringt leider auch nichts. Kann es daran liegen, das Enabel Interrupts schon erfolgt, bevor der Taster gedrückt wurde ?

    Eins ist aufjedenfall sicher, der 1. Interrupt Aufruf erfolgt nicht nach einer Sekunde.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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