CMOS-Dezimal-Counter- bzw. -Teiler-Kaskade in Bascom umsetzen

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • CMOS-Dezimal-Counter- bzw. -Teiler-Kaskade in Bascom umsetzen

      Hallo in die Runde,

      ich bin ganz neu hier und hoffe auf Hilfe und Tipps durch die Forummitglieder. Kurz zu mir: Ich bin schon etwas älter, bastel hobbymäßig sehr gern mit Elektronik, bin da aber, sagen wir, nicht ganz up to date, d.h. eher mit Retroansatz und realisiere vieles z.B. mit CMOS- und klassischen Spezial-ICs (Spielereien, Uhren, Audiotechnik usw.) Dabei macht es mir sehr viel Spaß zu überlegen, wie ich welche Funktion durch welche Zusammenschaltung erreichen kann.
      Beim Thema AVR und Bascom bin ich immer noch absoluter EInsteiger und Anfänger. D.h. ich habe via Bascom vor einigen Jahren schonmal LEDs am Atmega8 blinken lassen oder einen Servo angesteuert, bin dort aber über die ersten Schritte nicht weitergekommen. Alles total low level. Aber ich habe noch alles dafür hier und da kam mir die Idee, es ausgehend von einer aktuellen Frage- oder Aufgabenstellung, es nochmals damit zu versuchen und ich hoffe, ihr könnt mir irgendwie dabei helfen. Ich habe leider keine Ahnung wie.

      Bei einem neuen kleinen Projekt (eine besondere Uhr) möchte ich u.a auch aus Platzgründen und weil ich Lust habe, es einfach mal zu versuchen, eine CMOS-Schaltung (siehe Anhang) via µC (möglichst Atmega8, da ich die hier habe) umsetzen: eine Zähler-Kaskade (quasi eine digital-Uhr) aus sechs Dezimal-Countern CD4017 (gefüttert am ersten Zähler mit 1Hz) wobei die ersten beiden die Sekunden 1er+10er, die folgenden beiden die Minuten 1er+10er und die letzten beiden die Stunden 1er+10er (im 24h-Modus) zählen.

      Carstens Nixie Uhr Schaltplan_4017.jpg

      Ich brauche zur Ansteuerung weiterer Schaltungsteile aber nur das jeweils weiter heruntergeteilte H-Taktsignal (bezogen auf den CD 4017 also jeweils CLK und den Ausgang "0" jedes Zählers, auch vom letzten). Diese Signale sollten dann an 6 Output-Ports zur Verfügung stehen und zudem für Sekunden, Minuten, Stunden einstellbar sein.
      Das genaue 1Hz-Signal kann entweder extern erzeugt werden oder, was ich bevorzugen würde, z.B. über einen angeschlossenen Quarz oder einen DS32kHz am bzw. im µC selbst.

      Wo fange ich an bzw. wer kann mir das ggf. sogar programmtechnisch umsetzen?
      Ich freue mich auf Eure Antworten.

      Vielen lieben Dank und VG
      TK

      The post was edited 1 time, last by delatube ().

    • delatube wrote:

      Wo fange ich an
      Damit klar zu stellen wann welche Zustände (High/Low) an den Ausgängen anliegen sollen; bzw was die weiteren Schaltungsteile benötigen.
      So wie ich das verstanden haben benötigt jede Stelle einen kurzen (halbe Sekunde?) High Puls?
      Eine Möglichkeit wäre über Zählervariablen
      If Puls = 1 then
      .sekundenEinerAusgang = 1
      .incr sekundeneiner
      .if sekundeneiner >=10 then
      ..dekundeneiner = 0
      ..SekundenzehnerAusgang = 1
      ..incr sekundenzehner
      ..if sekundenzehner >= 6 then
      .....
      else
      Alle Ausgänge =0
      end if
      Der M8 kann einen 32kHz Quarz betreiben und hat damit die Quarzgenaue Pulszeit.
      Bascom hat auch die Möglichkeit damit eine Uhr zu bereiben, was in dem Anwendungsfall vermutlich nicht nötig wäre?
    • Danke für die Antwort und den Ansatz.

      Pluto25 wrote:

      So wie ich das verstanden haben benötigt jede Stelle einen kurzen (halbe Sekunde?) High Puls?
      Ja, richtig, jede Stelle (aber auch die von 23:59 benötigt einen High-Puls, halbe sec sollte ausreichen. Die Idee mit den Variablen und If-Abfragen ist interessant, übersteigt aber schon weit mein Verständnis bzw. meine Kenntnisse. Hier brauche ich bitte mehr Hilfe bei der Programmierung und Umsetzung.

      Pluto25 wrote:

      Bascom hat auch die Möglichkeit damit eine Uhr zu bereiben, was in dem Anwendungsfall vermutlich nicht nötig wäre?
      Ja, das ist hier meines Erachtens nicht nötig, u.a. da die Anzeige auf anderem Weg erfolgen soll gesteuert nur über die Pulse aus dem M8.
    • Die If können recht gut als Klartext verstanden werden z.B.
      If Puls = 1 Then
      Wenn Puls (Variable oder Pinzustand) gleich 1 (High) dann
      ..Hier alle Befehle die nur dann (=1) ausgeführt werden sollen
      else
      wenn nicht (Variable oder Pin 0/Low) dann
      ...
      end if
      Abfrage fertig, alles was nun kommt wird unabhängig von der Abfrage ausgeführt.
      Das 'sekundenEinerAusgang' ist ein realer Ausgang. Der kann beliebig belegt werden. Wenn der Adc nicht genutzt wird z.B. Portc.0
      Wer's mag kann dazu Alias verwenden: sekundenEinerAusgang alias PortC.0
      Das könnte den Code lesbarer machen, macht jedoch Simulation und Fehlersuche schwieriger.

      Schon Gedanken über die Pinbelegung gemacht? Soll er noch was anderes machen (Lcd/Usart/I2c...)? Wie wird gestellt?

      PS Variablen müssen nicht unbedingt Bandwürmer sein. Bei mir sieht ähnliches so aus:
      Dim S , Sz , Me , Mz , He , Hz As Byte (Se darf nicht als Variablen Name genutzt werden, daher heißen die Sekunden Einer nur s)
    • Hallo,

      den Schritt von rein hardwarebasierten Lösungen zu den MC habe ich bereits vor einigen Jahren vollzogen
      und es bisher nicht bereut, weil es mit des MC bei vielen Projekten bedeutend einfacher ist, sie zu realisieren.
      Dazu handelt es sich m. M. bei Bascom um eine recht schnell verständliche Software.

      Vielleicht wäre das von mir für einen Bekannten realisierte modulare Konzept zum Aufbau einer Digitaluhr
      eine Basis für die Erzeugung der benötigten Impulse.
      Bei diesem Konzept liefert ein DCF-Empfänger die Zeitinformation und relativ "frisch" ist die Anbindung eines
      RTC-Moduls über den TWI-Bus. Bei korrektem DCF-Empfang wird die RTC-Zeit synchronisiert. Damit ist beispielsweise
      eine manuelle Umstellung bei Sommer- oder Winterzeit nicht erforderlich. Im MC dienen diese Informationen dazu, eine
      interne Uhr (Zeit und Datum) laufen zu lassen.
      Eigentlich sehe ich kein Problem, bei einem Digit-Wechsel Impulse über definierte Pins an externe Baugruppen
      zu senden.
      Da es zu Beginn immer einige Änderungen an der Software geben wird, meine Fragen, inwieweit Kenntnisse für
      das Brennen der AVR-Serie bekannt sind.
      Welcher Brenner wird verwendet und ist die Bedeutung von Fuse- und Lockbits bekannt? Wäre die SMD-Bestückung
      machbar?
      Vielleicht wäre bereits eine der vorhandenen industriell hergestellter Leiterplatten nutzbar; möglich ist ebenfalls
      ein Support per Teamviewer.

      Hier finden sich weitere Details: Homepage
      Über die Startseite kommt man zu den Videolinks, die mehr erklären als tausend Worte ;) .
    • Ich denke, ich muss mir nochmals grundlegend dazu Gedanken machen zur programmtechnischen Umsetzung, zur Pinbelegung usw., auch um meine Fragen zu präzisieren.

      Pluto25 wrote:

      Die If können recht gut als Klartext verstanden werden z.B.
      If Puls = 1 Then
      Wenn Puls (Variable oder Pinzustand) gleich 1 (High) dann
      ..Hier alle Befehle die nur dann (=1) ausgeführt werden sollen
      Verstehe ich das richtig, dass ich an einem Eingang z.B. einen exakten 1Hz-Puls anlege und diesen dann zählen lasse? Oder kommt der Puls von einem der internen Timer?

      Zum Thema Stellen dachte ich an Taster, die bei Drücken mind. die Minuten- und Stundenzähler jeweils um eins erhöhen. Praktisch wäre auch eine General-Reset, hier ein L-H-L-Puls an allen sechs Ausgängen (ohne die Zähler um eins zu erhöhen), z.B. wenn zwei Taster gleichzeitig gedrückt sind.

      Ich melde mich wieder. Wird aber aus Zeitgründen ggf. etwas dauern.
    • Hallo TK,

      ich glaube, Du machst Dir über zu viele Baustellen gleichzeitig Gedanken. Das kann gerade zu Beginn frustrierend sein.
      Versuch, eine Aufgabe nach der anderen zu lösen ;)

      Zum Beispiel Deine Zeitbasis:
      Dein 1-Hz-Signal kann aus unterschiedlichen Quellen (externe Quelle, Uhrenquarz usw) kommen. Wenn Du eine exakte externe Quelle hast, kannst Du diese natürlich nutzen. Falls nicht (und Du wie beschrieben möglichst platzsparend bauen möchtest), würde sich ein Uhrenquarz (32.768 kHz) anbieten.
      Schau Dir dazu mal den Code von Dekaman im ersten Posting hier an:
      wie funktioniert Config Clock und sectic

      Hänge einen Uhrenquarz (32.768 kHz) zwischen die Pins XTAL1 und XTAL2 (PB.6 und PB.7) Deines Atmega8 und eine LED plus Vorwiderstand an PD.7.
      Wenn Du das Programm geflasht hast, sollte die LED immer eine Sekunde an und eine Sekunde aus sein (die Unterroutine "Sectic" wird automatisch durch Timer2 einmal pro Sekunde aufgerufen).
      Damit hast Du schon eine sehr brauchbare Sekunden Basis (und nebenbei auch noch eine im Hintergrund laufende Soft-Uhr) für das weitere Projekt.

      Schau mal, ob das bei Dir soweit klappt (ich hab leider keinen Uhrenquarz hier). Erst danach machst Du Dir Gedanken über die nächste Baustelle :)

      Nette Grüße
      Rob
    • Weiß nicht ob ich dein Vorhaben richtig aufgefasst habe. Mir schwebt gedanklich ein Konzept vor, in dem zwei passende Bausteine benutzt werden.
      Rein softwaremäßig müsstest du nur die entsprechenden Teilelemente abfragen, bearbeiten.

      Benötigt wird bei meiner Überlegung ein xbeliebiger Prozessor der TWI bzw I2C kann und ein Uhrenbaustein, z.B. den DS1307.
      Der liefert schon mal ein exaktes 1 Hz Signal und zusätzlich über seine internen Register alle die Timing-Anteile die du eventuell benötigst.
      Das Programm müsste somit nur die internen Register einlesen, die benötigten Einzelstellen auswerten und passend zu deinen Wünschen behandeln.

      Tja, das hört sich fast zu einfach an, zwei fertige Bauteile zu verwenden, einen Prozessor und einen Uhrenbaustein.
      Das entsprechende Programm zu erstellen dürfte nach gewisser Zeit zumindest ansatzweise gelingen, per Überlegungen was wird benötigt und was müsste
      programmtechnisch getan werden, damit das jeweils gewünschte Teilergebis erreichbar wird.

      Wie gesagt, ob mein gedanklicher Ansatz deinen Erfordernissen gerecht werden kann, weiß ich momentan noch nicht, ob ich deinen Wunsch verstanden habe.
      Ersatzweise für deine Zählerbausteine stehen in meinem Konzept die internen Register des DS1307 Bausteines.
      Die müssten programmtechnisch ausgewertet, bearbeitet werden. Schau mal, ob dieser Ansatz, Vorschlag passen könnte.

      Gruß Helmut
    • delatube wrote:

      Oder kommt der Puls
      Ganz nach belieben. Falls er nicht sowie auf der Platine zu Verfügung ist kann der Mega ihn selbst erstellen.
      Wenn er sonst nichts zu tun braucht könnte er selbst mit 32kHz arbeiten. Dann braucht er superwenig Strom :D Wenn das nicht reicht ist R2D2 Baster's Vorschlag eine einfache Methode den Puls zu bekommen. Jedoch würden zwei sectic pro Sekunde nötig. Das erreicht die Anweisung Tccr2 = 4.
      In der Sectic selber nur 'toggle Puls' oder die gesamte Signalaufbereitung.
      Die Taster an Eingängen des Mega oder einfach parallel an den Ausgängen?
      Wie schnell muss denn das L-H-L sein damit die nachfolgende Schaltung das als Reset und nicht als Puls erkennt?
    • Pluto25 wrote:

      Das erreicht die Anweisung Tccr2 = 4
      Läuft dann die Soft-Clock noch mit richtiger Geschwindigkeit?


      Pluto25 wrote:

      Jedoch würden zwei sectic pro Sekunde nötig.
      Nicht zwangsläufig. Das verlinkte Programm sollte nur der erste Schritt sein. Final würde in der sectic lediglich ein Flag gesetzt.
      Die Pulslänge hätte ich mit einem weiteren Timer mittels Timeout-Variable bestimmt/beendet.
      Wie immer führen viele Wege ans Ziel ^^

      Nette Grüße
      Rob
    • Wow. Da sind ja eine ganze Menge Ansätze und Hinweise dazu gekommen. Zugleich verwirrt mich das ganz schön und der Wald vor lauter Bäumen wird dadurch nicht lichter und der Weg nicht klarer. Für mich als absoluten Neuling in der Materie ist das alles noch zu viel Input.
      Daher möchte ich erstmal nur dem Ansatz von R2D2 folgen.

      R2D2 Bastler wrote:

      Schau mal, ob das bei Dir soweit klappt (ich hab leider keinen Uhrenquarz hier). Erst danach machst Du Dir Gedanken über die nächste Baustelle
      Das klappt und die LED blinkt, allerdings, wie von anderen Foristen erwartet, mit 0,5Hz. Die Baustelle ist also noch nicht ganz fertig und dabei wollte ich doch schon zur nächsten... ?(
    • Nun ist ja auch "alles möglich". Vielleicht die Rahmenbedingungen festlegen.
      Wie schnell soll er arbeiten? (Auslieferungszustand 1MHz - reicht ) :thumbup:
      Welche Pins sollen verwendet werden? (Für den Testcode wichtig und 'fällt' zwei Drittel der Bäume) ;)
      Wie soll der Puls generiert werden? (erledigt- mit Uhrenquarz) :thumbup:
      Soll noch was anderes angeschlossen werden? :?:
      Damit kann ein Testcode erstellt bzw ein ähnlicher übernommen werden. Und hier reingestellt werden damit wir alle vom selben sprechen. Wichtig die verwendeten Variablennamen zu kennen.
      Die Feinheiten (Timing, keine Selbstzerstörung etc) können dann später 'geschliffen' werden.
      So würde 1Hz rauskommen:

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 1000000
      3. $swstack = 64
      4. $hwstack = 64
      5. $framesize = 64
      6. Config Clock = Soft , Gosub = Sectic
      7. On Oc2 Halbsec
      8. Enable Oc2
      9. Ocr2 = 128 'bestimmt das Tastverhältnis
      10. Enable Interrupts
      11. Config Portd.7 = Output
      12. Do
      13. nop
      14. Loop
      15. End
      16. Sectic:
      17. Set Portd.7
      18. Return
      19. Halbsec:
      20. Reset Portd.7
      21. Return
      Display All

      The post was edited 1 time, last by Pluto25 ().

    • 1Hz-Basis läuft! Danke! Also kann es weiter gehen.

      Pluto25 wrote:

      Welche Pins sollen verwendet werden? (Für den Testcode wichtig und 'fällt' zwei Drittel der Bäume)
      Nach meiner Überlegung benötige ich 6 Pins als Outputs. Da ich keinen AD-Wandler benötige, wollte ich die PORTC (0-5) nutzen. Zum Stellen (ggf. bis zu 3 Input-Pins), PORTB.

      Pluto25 wrote:

      Soll noch was anderes angeschlossen werden?
      Nach derzeitigem Stand nein.

      Wie bekomme ich nun die 1Hz vom Timer in einen Progammablauf? Sorry für die Urschleimfragen, aber mir fällt das doch noch sehr schwer zu Überblicken bzw. die Grundzusammenhänge klar zu kriegen. Danke.

      Pluto25 wrote:

      Wichtig die verwendeten Variablennamen zu kennen.
      Deine Vorschläge oben fand ich hierfür sehr gut, also vielleicht S , Sz , Me , Mz , He , Hz.
    • delatube wrote:

      die 1Hz vom Timer in einen Progammablauf
      Elegant wäre über ein Flag z.B. 'Puls'

      Source Code

      1. Sectic:
      2. Puls=1
      3. Return
      4. Halbsec:
      5. Puls=0
      6. Return

      Oder direkt

      Source Code

      1. Sectic:
      2. Set Portc.0 'jede Sec.
      3. incr s
      4. If s >=10 then
      5. s = 0 'alle 10s
      6. set Portc.1
      7. incr sz
      8. if sz >=6 then
      9. sz = 0 'alle 60s
      10. set portc.2
      11. incr me
      12. ....
      13. ....
      14. end if
      15. end if
      16. Return
      17. Halbsec:
      18. Reset Portc
      19. Return
      Display All

      delatube wrote:

      Zum Stellen (ggf. bis zu 3 Input-Pins)
      Wie sollen 3 Taster 6 Ausgänge beeinflussen? Da fehlt mir jetzt der Überblick ;)
    • Pluto25 wrote:

      Oder direkt
      Wie und wo muss der 2. Code aus deinem Post in den aus Post 13 eingebaut werden und was muss wie und wo dafür noch definiert/deklariert werden?

      Pluto25 wrote:

      Wie sollen 3 Taster 6 Ausgänge beeinflussen? Da fehlt mir jetzt der Überblick
      Da bin ich vom CMOS-Plan in meinem ersten Post ausgegangen, wo Sek, Min, h von Tastern einzeln gestellt werden können, d.h. pro Tastendruck werden die Einer um eins und folglich die Zehner erhöht. Gut wäre, wenn die Uhr im Stellmodus angehalten ist.

      ceperiga wrote:

      Meine Empfehlung wäre mal einen Programmablaufplan zu erstellen
      Hast Du ein Beispiel wie das aussehen soll?
      Power on -> MC erzeugt 1Hz-Puls -> Puls wird quasi weiter runtergeteilt durch If...then-Bedingungen für Sek, Min, h, Ausgabe über 6 Ports als H-L-Puls (ca. 1-1/2s Dauer). Hier müsste irgendwo noch das Stellen der Uhr rein.

      The post was edited 1 time, last by delatube ().