- LiTime Speicher und Akkus         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 34

Thema: einstellbarer zähler mit bascom???

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380

    einstellbarer zähler mit bascom???

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo,
    ich hab hier jetzt wieder mal sehr viel gesucht aber nix ähnliches für mein vorhaben gefunden.
    also ich brauche für mein projekt einen zähler. dieser soll mit 2 7 segmentanzeigen funktionieren.

    sprich er kann 9.59 minuten mehr nicht. mehr brauche ich auch nicht.
    nun soll man des so wie bei ner mikrowelle halt einstellen können wie viele minuten er rückwärts laufen soll.
    sprich am anfang steht er auf 0 und dann stellt man seine zeit an wie lange er laufen soll.
    timer0 ist denk ich mir mal ganz gut geeignet damit ich da auch was lerne. ich habe auch das Buch von rowalt. bloß blick ich da net so ganz durch. deswegen frage ich jetzt hier mal was ich da genau machen muss.
    ich danke euch schon mal.

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    33
    Beiträge
    485
    Hi,
    ich denke mal so würde es gehen:
    Du stellst den Timer0 so ein, dass er z.B. 100 mal pro Sekunde die ISR aufruft. In der ISR hast du eine Variable i die du jedes mal inkrementierst. Außerdem hast du in einer anderen Variable den gewünschten Wert eingestellt ("stellt man seine zeit an wie lange er laufen soll") in Sekunden. Zum Beispiel 300. Jetzt brauchst du noch eine Variable x, die du inkrementierst, wenn die Variable i 100 erreicht und setzt dabei i wieder auf 0.

    In x ist dann gespeichert wieviele Sekunden schon vergangen sind. Dann kannst du einfach x mit dem gewünschten Wert vergleichen und wenn beide gleich sind eine Funktion aufrufen.

    MfG

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380
    könntest du mir da mal en beispiel geben is en bischen schwierig zu verstehen.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    33
    Beiträge
    485
    Hi,
    ungefähr so würde ich es machen:
    Code:
    Config Timer0 = Timer, Prescale = 1024
    On Timer0 Timer0_ISR
    Const Timervorgabe = 100
    
    Enable Timer0
    Enable Interrupts
    
    Dim I as Integer
    Dim sec_vorgabe as Integer        
    
    
    do
    loop
    
    
    Timer0_ISR:
      Timer0 = Timervorgabe
      If I = 100 Then 
        I = 0 
        Decr sec_vorgabe  
      Endif
     
      Incr I  
    
      If sec_vorgabe = 0 Then
         'Hier was nach der abgelaufenen Zeit passieren soll
      Endif
    
    Return
    In sec_vorgabe speicherst du die vorgegeben Zeit in Sekunden. Alle 100 ISR Aufrufe (also jede Sekunde einmal) wird sec_vorgabe um eins verkleinert, weil ja eine Sekunde vergangen ist.
    Danach wird überprüft ob sec_vorgabe null erreicht hat, weil dann die Zeit um wäre. Natürlich könntest du auch außerhalb der ISR überprüfen ob sec_vorgabe 0 ist.

    MfG

    Edit: Wie du den Timer genau einstellst solltest du mit dem Programm rnAvr ausrechnen. Die Einstellungen im Beispiel sind für einen 16 Mhz Quarz

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380
    also jetzt hab ich mal folgendes



    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    Config Timer0 = Timer , Prescale = 64
    Config Portb.0 = Output
    
    
    Led3 Alias Portb.0
    Dim Intzaehler As Byte
    Dim Zehntelsek As Byte
    Dim Sekunde As Byte
    
    Start Timer0
    Enable Timer0
    Enable Interrupts
    On Timer0 Timer0_isr
    
    
    Do
    Loop
    End
    
    Timer0_isr:
    Tcnt0 = 26
    
    Intzaehler = Intzaehler + 1
    
    If Intzaehler > 25 Then
        Zehntelsek = Zehntelsek + 1
           If Zehntelsek < 5 Then
                Led3 = 1
           Else
                Led3 = 0
           End If
           If Zehntelsek > 9 Then
                Zehntelsek = 0
           End If
        Intzaehler = 1
    End If
    Return
    End
    also des funzt jetzt soweit mein sekundentakt hab ich nun wie baue ich des jetzt ein dass er bis zb 5 minuten zählt. da muss ich ja if zehntelsek>9 then sekunde +1 sein oder irre ich mich da?

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380
    kann mir da keiner en tip geben???

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    33
    Beiträge
    485
    Du zählst eine Variable I im Sekundentakt hoch, wenn diese Variable 300 erreicht sind 5 Minuten vorbei. Bei jedem Befehl, der vor Ablauf der Zeit passieren soll (z.B. LEDs blinken lassen), überprüfst du ob I kleiner als 300 ist.

    MfG

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380
    also gut ich versuchs mal meld mich wenn ich mal was gemacht habe.

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    11.05.2006
    Ort
    Oberschopfheim
    Alter
    36
    Beiträge
    380
    jetzt hab ich mal ne saublöde frage wie schließe ich das display hier überhaupt an? ich meine brauche ich da nicht ein bcd decoder? oder wie mache ich dass dann kann ichs mir besser vorstellen.

    hab jetzt hier mal was aber ich schätze da hab ich wieder ewig viele sachen doppelt reingebaut. naja könntest du vll trotzdem mal drüberfliegen obs so stimmt oder jemand anders wär echt super.
    also was ich eigentlich vorhabe ist eine einstellbare uhr für einen belichtungsapparat. vll kann man sich des auch dann besser vorstellen.

    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    $baud = 9600
    Config Timer0 = Timer , Prescale = 64
    Config Portb.0 = Output
    Config Pinc.0 = Input
    Config Pinc.1 = Input
    Config Pinc.2 = Input
    
    Portc = &B00000111
    
    Led3 Alias Portb.0
    Dim Intzaehler As Byte
    Dim Zehntelsek As Byte
    Dim Sekunde As Byte
    Dim Minute As Integer
    Dim sec_vorgabe as Integer
    
    Start Timer0
    Enable Timer0
    Enable Interrupts
    On Timer0 Timer0_isr
    
    
    Do
    Loop
    End
    
    Timer0_isr:
    Tcnt0 = 26
    
    Intzaehler = Intzaehler + 1
    
    If Intzaehler > 25 Then
        Zehntelsek = Zehntelsek + 1
           If Zehntelsek < 5 Then
                Led3 = 1
           Else
                Led3 = 0
           End If
           If Zehntelsek > 9 Then
                Zehntelsek = 0
           End If
           If Zehntelsek > 9 Then
           Sekunde = Sekunde + 1
           End If
           If Sekunde > 59 Then
           Minute = Minute + 1
           End If
           If Minute = 5 Then
           Intzaehler = 0
           Zehntelsek = 0
           Sekunde = 0
           Minute = 0
           Decr sec_vorgabe
           End If
           Intzaehler = 1
    
           Incr Minute
           If Sec_vorgabe = 0 Then
           Intzaehler = 0
           Zehntelsek = 0
           Sekunde = 0
           Minute = 0
           End If
    
    
    End If
    Return
    End

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2006
    Ort
    Biberach
    Alter
    33
    Beiträge
    485
    Hi,
    es stimmt du hast einiges doppelt drin


    Ich hab hier mal den Code zusammengefasst (nur ISR):
    Code:
    Timer0_isr:
    Tcnt0 = 26
    
    Incr Intzaehler
    
    If Intzaehler = 25 Then
      Intzaehler = 0
      Incr Zehntelsek
    End If
    
    If Zehntelsek = 10 Then
      If Minute < 5 Then
        Toggle Led3
      End If
      Incr Sekunde
      Zehntelsek = 0
    End If
    
    If Sekunde = 60 Then
      Incr Minute
    End If
    
    
    Return
    So dürfte es funktionieren, wobei es natürlich auch nicht ganz das Beste ist, du könntest noch Ressourcen sparen, in dem du die Minute Variable weglässt und einfach stattdessen mit Sekunden "rechnest". Ungefähr so:

    Code:
    Timer0_isr:
    Tcnt0 = 26
    
    Incr Intzaehler
    
    If Intzaehler = 25 Then
      Intzaehler = 0
      Incr Zehntelsek
    End If
    
    If Zehntelsek = 10 Then
      If Sekunde < 300 Then
        Toggle Led3
      End If
      Incr Sekunde
      Zehntelsek = 0
    End If
    
    
    
    Return
    Hoffe es klappt so.

    MfG

Seite 1 von 4 123 ... LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus