- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Zähler

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Anzeige

    E-Bike
    Zitat Zitat von Carlos31
    config pind.x = output <--------------- dies ist laut Help korrekt
    config portd.x = output <--------------- dies ist laut Help nicht korrekt, funktioniert aber
    @ Carlos31,
    sein Code benutzte den Int0 um sofort und einmalig in eine ISR zugehen. Dies bringt bei einem Taster sicherlich Prell-Probleme mit sich, aber ansonsten wird die ISR nur einmal aufgerufen.
    Dein Code pollt den Eingang und wenn er auf 1 ist, zählt deine IF Abfrage hoch. Wenn du nicht innerhalb der 500ms loslässt, erhöht sie auch mehrfach.

    Als dritte Lösung gibt es übrigens auch noch den Debounce Befehl, der genau zum Entprellen von Tastern gemacht ist.

    @ DaveWagner
    Einen Fehler in deinem Code habe ich gerade noch gesehen. Zum Darstellen einer 5 muss das Segment an PortD.1 auf 0 sein, sonst kommt eine 9 heraus.
    Hast du das Ganze eigentlich in Hardware gemacht oder probierst du am Simulator aus?

    Gruß

    Rolf

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    31
    Beiträge
    56
    Hallo

    Danke für eure zahlreichen Antworten.
    Ich hab jetzt Teile aus Neutros Vorschlag übernommen (das heißt statt dem Unterprogramm, Incr Variable hergenommen und statt Select Case ,If Funktionen)
    Jetzt funktioniert das ganze eigentlich ganz gut.( Ich teste das ganze an Hardware, da ich es dann auch hernehmen will.

    Eine Frage habe ich noch.
    Muss ich jetzt für jede Zahl eine Deklaration schreiben oder kann man das eleganter und zeitsparender lösen.
    (Ich benutze wiegesagt Sieben-Segment-Anzeigen)
    Wenn nicht, geht es dann bei Display-Modulen ?

    Mfg
    David

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    31
    Beiträge
    56
    Hallo

    Jetzt ist doch wieder ein Problem aufgetaucht. Das Programm hängt bei bestimmten Zahlen.
    Momentan bleibt es immer bei eins stehen und läuft nicht weiter darüber hinaus.
    Vorher blieb es bei 5 oder 6 immer stehen.
    Ich hab auch schon einen anderen Controller hergenommen.
    Doch das bewirkt keinen Unterschied.
    Kann das am Prgramm liegen ?

    Hier mal mein Programm:

    Code:
     $regfile = "m8def.dat"
     $crystal = 1000000                                         ' 1MHZ crystal
    
    
     Config Portd.0 = Output
     Config Portd.1 = Output
     Config Portd.7 = Output
     Config Portd.3 = Output
     Config Portd.4 = Output
     Config Portd.5 = Output
     Config Portd.6 = Output
     Config Portd.2 = Input
     Config Portb.1 = Input
    
     Portd.2 = 1
     Portb.1 = 1
    
    
     Dim A As Integer
     A = 0
    
     Do
    
     If Pind.2 = 1 Then                                         'Zähler hochzählen
    Incr A
    Waitms 50
    End If
    
      If Pinb.1 = 0 Then                                        'Zähler runterzählen
    Decr A
    Waitms 50
    End If
    
     If A >= 10 Then                                            '10 als Maximalwert
    A = 0
    Else
    End If
    
      If A = 0 Then
      Gosub Null
    End If
    
      If A = 1 Then
    Gosub Eins
    End If
    
    If A = 2 Then
    Gosub Zwei
    End If
    
    If A = 3 Then
    Gosub Drei
    End If
    
    If A = 4 Then
    Gosub Vier
    End If
    
    If A = 5 Then
    Gosub Fuenf
    End If
    
    If A = 6 Then
    Gosub Sechs
    End If
    
    If A = 7 Then
    Gosub Sieben
    End If
    
    If A = 8 Then
    Gosub Acht
    End If
    
    
    If A = 9 Then
    Gosub Neun
    End If
    
    If A = 10 Then
    Gosub Zehn
    End If
    
    If A = 11 Then
    Gosub Elf
    End If
    
    If A = 12 Then
    Gosub Zwoelf
    End If
    
    If A = 13 Then
    Gosub Dreizehn
    End If
    
    If A = 14 Then
    Gosub Vierzehn
    End If
    
    If A = 15 Then
    Gosub Fuenfzehn
    End If
    
    If A = 16 Then
    Gosub Sechzehn
    End If
    
    If A = 17 Then
    Gosub Siebzehn
    End If
    
    If A = 18 Then
    Gosub Achtzehn
    End If
    
    If A = 19 Then
    Gosub Neunzehn
    End If
    
    
    
    
    
    
    
    
    
    
    
    
    Loop
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     Unterprogramm:
     A = A + 1
    
     Return
    
    
     Null:
        Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.4 = 1
        Portd.5 = 1
        Portd.6 = 0
        Waitms 450
        Return
    
     Eins:
    
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 0
        Portd.4 = 0
        Portd.5 = 0
        Portd.6 = 0
        Portd.0 = 0
        Waitms 450
        Return
    
     Zwei:
        Portd.0 = 1
        Portd.1 = 1
        Portd.6 = 1
        Portd.4 = 1
        Portd.3 = 1
        Portd.5 = 0
        Portd.7 = 0
        Waitms 450
        Return
     Drei:
        Portd.0 = 1
        Portd.1 = 1
        Portd.6 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.5 = 0
        Portd.4 = 0
        Waitms 450
        Return
    
     Vier:
        Portd.5 = 1
        Portd.6 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.4 = 0
        Portd.3 = 0
        Portd.0 = 0
        Waitms 450
        Return
    
     Fuenf:
        Portd.0 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.4 = 0
        Portd.1 = 0
         Waitms 450
        Return
    
     Sechs:
        Portd.0 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.4 = 1
        Portd.3 = 1
        Portd.7 = 1
        Portd.1 = 0
         Waitms 450
        Return
    
    
     Sieben:
        Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 0
        Portd.4 = 0
        Portd.5 = 0
        Portd.6 = 0
        Waitms 450
        Return
    
     Acht:
        Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.4 = 1
        Portd.5 = 1
        Portd.6 = 1
         Waitms 450
         Return
    
     Neun:
        Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.4 = 0
        Waitms 450
        Return
    
     Zehn:
            Portd.0 = 1
            Portd.1 = 1
            Portd.7 = 1
            Portd.3 = 1
            Portd.4 = 1
            Portd.5 = 1
            Portd.6 = 0
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
        Waitms 450
        Return
    
     Elf:
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
            Portd.1 = 1
            Portd.7 = 1
            Portd.3 = 0
            Portd.4 = 0
            Portd.5 = 0
            Portd.6 = 0
            Portd.0 = 0
     Waitms 450
     Return
    
     Zwoelf:
    
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
            Portd.0 = 1
            Portd.1 = 1
            Portd.6 = 1
            Portd.4 = 1
            Portd.3 = 1
            Portd.5 = 0
            Portd.7 = 0
    
     Waitms 450
     Return
    
     Dreizehn:
    
    
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
        Portd.0 = 1
        Portd.1 = 1
        Portd.6 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.5 = 0
        Portd.4 = 0
    
        Waitms 450
        Return
    
     Vierzehn:
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
        Portd.5 = 1
        Portd.6 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.4 = 0
        Portd.3 = 0
        Portd.0 = 0
     Waitms 450
     Return
    
     Fuenfzehn:
    
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
    
        Portd.0 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.4 = 0
        Portd.1 = 0
        Waitms 450
        Return
    
     Sechzehn:
    
            Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
            Portd.0 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.4 = 1
        Portd.3 = 1
        Portd.7 = 1
        Portd.1 = 0
    
     Waitms 450
     Return
    
     Siebzehn:
    
              Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
    
               Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 0
        Portd.4 = 0
        Portd.5 = 0
        Portd.6 = 0
    
        Waitms 450
        Return
    
     Achtzehn:
    
           Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
              Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.4 = 1
        Portd.5 = 1
        Portd.6 = 1
    
        Waitms 450
        Return
    
     Neunzehn:
    
      Portc.1 = 1
            Portc.2 = 1
            Portc.0 = 0
            Portc.5 = 0
            Portc.6 = 0
            Portc.4 = 0
            Portc.3 = 0
    
               Portd.0 = 1
        Portd.1 = 1
        Portd.7 = 1
        Portd.3 = 1
        Portd.5 = 1
        Portd.6 = 1
        Portd.4 = 0
    
      Waitms 450
      Return
    Frohe Weihnachten

    David

  4. #14
    Erfahrener Benutzer Roboter Experte Avatar von Neutro
    Registriert seit
    28.10.2007
    Ort
    Ostfriesland
    Alter
    45
    Beiträge
    642
    Nun das dürfte daran liegen das die Eingänge auf eine logische 0 (GND) reagieren sollten weil die Internen Pull ups aktiviert sind
    Also If PinXX = 0 Then ....
    Mir ist auch aufgefallen das du den CPort nicht Configuriert hast.
    Hast du dich eigentlich überhaupt schon mal mit den Bascom AVR Grundlagen beschäftigt? Schau noch mal ins Wiki rein.

    Mfg

    Neutro
    Jemand mit einer neuen Idee ist ein Spinner, bis er Erfolg hat.
    (Mark Twain)

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Hallo David,
    ich hoffe, dass deine Anzeige nicht bis 99 gehen wird, sonst wird das ja ein riesiges Programm.
    Du kannst auch einen ganzen Port mit einem Befehl setzen.
    Anstelle von:

    Portd.0 = 1
    Portd.1 = 1
    Portd.7 = 1
    Portd.3 = 1
    Portd.4 = 1
    Portd.5 = 1
    Portd.6 = 0
    Portc.1 = 1
    Portc.2 = 1
    Portc.0 = 0
    Portc.5 = 0
    Portc.6 = 0
    Portc.4 = 0
    Portc.3 = 0

    wäre das dann für die "10" einfach

    Portd=191 'oder auch PortD = &B10111111, damit du die einzelnen Bits noch siehst
    Portc=6

    Und der nächste Schritt wäre dann, diese Werte in ein Array abspeichern:
    Segmente_zehner(1)=6
    Segmente_Einer(0)=191 'siehe Bemerkung unten

    Damit hättest du dann auch die ganzen Ifs eingespart und dein Programm sähe dann recht übersichtlich aus:

    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000                                          ' 1MHZ crystal
    $sim
    Ddrd = &B11111101                       'Pind.2 ist ein Eingang
    Ddrc = &B11111111
    Config Pinb.1 = Input
    
    Portd.2 = 1
    Portb.1 = 1
    
    Dim Segmente_einer(10) As Byte , Segmente_zehner(10) As Byte
    
    Dim A As Byte                           '256 Werte reichen doch
    Dim Einer As Byte , Zehner As Byte
    
    Segmente_einer(1) = &B10000011          'bit 2 muss immer gesetzt sein, weil das der Pullup für PORTD.2 ist
    Segmente_einer(2) = &B01011111          'bit 2 muss immer gesetzt sein, weil das der Pullup für PORTD.2 ist
    '......                                 'hier musst du noch die anderen Werte hinschreiben
    Segmente_einer(10) = &B10111111         'Arrays fangen leider mt Index 0 an, deshalb nehmen wir die 10 für die 0
    
    Segmente_zehner(1) = &B00000110
    '......                                 'hier musst du noch die anderen Werte hinschreiben
    
    A = 0
    
    Do
       If Pind.2 = 1 Then                   'Zähler hochzählen
          Incr A
          Waitms 50
       End If
    
       If Pinb.1 = 1 Then                   'Zähler runterzählen
          Decr A
          Waitms 50
       End If
       If A > 19 Then                      '10 als Maximalwert
          A = 0
       End If
    
       Zehner = A / 10
       If Zehner = 0 Then Zehner = 10       'siehe oben
       Einer = A Mod 10
       If Einer = 0 Then Einer = 10
    
       Portd = Segmente_einer(einer)
       Portc = Segmente_zehner(zehner)
       Waitms 450
    Loop
    
    End
    Das wäre alles.

    Ich habe den Taster an PINB.1 genauso abgefragt wie den an PIND.2, oder funktioniert der tatsächlich anders herum?

    Gruß

    Rolf

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

12V Akku bauen