Bascom Softclock mit Ds1307 Uhr im Programm stellen

Kampfkartoffel

Neues Mitglied
10. März 2015
14
0
1
Sprachen
Hallo

Ich habe schon viel und lange rumgegooglet und kam leider auf kein Ergebnis bisher.
Ich habe folgendes Problem:
Ich arbeite an einem größeren Projekt und fange gerade mit kleinigkeiten an.
Nun arbeite ich mit dem DS1307. Soweit funktioniert mit dem Beispielprogramm von Pirnaer alles.
Die Uhrzeit kann am Anfang mit Time$ gestellt werden, und wird auch im RTC gespeichert und wieder ausgegeben wenn man den AVR vom Strom trennt.
Jezt möchte ich aber, dass ich das RTC auch direkt am AVR stellen kann. Es handelt sich im übrigen um einen ATmega8a auf dem Myavr Board.
Ich habe schonmal eine Simple Uhr in bascom geschrieben daher habe ich auch meine Stellroutine genommen.
Jedoch funktioniert das irgendwie nicht:
Wenn ich die Variable von der Config Clock verändern möchte geht das einfach nicht.
Ich zähle meine Variable hoch aber sie wird sofort wieder auf den urpsprünglichen Wert auf dem RTC zurückgesetzt.

Im Untenstehenden Code steht, wie ich meine Sekunden Variable stellen möchte.
in späteren Code wird die "Sekunde" Variable dann in die _sec Variable gepackt. Resettet sich jedoch immer wieder.

Ich hoffe ihr könnt mir helfen

Code:
If Pinb.1 = 0 Then
   Do
   Loop Until Pinb.1 = 1
   Cls
   Do
    Locate 1 , 1
    Lcd "Sekunde"
    Locate 2 , 1
    Lcd Sekunde
      If Pinb.2 = 0 Then
         Sekunde = Sekunde + 1
         Waitms 100
      End If
   Loop Until Pinb.1 = 0
   Do
   Loop Until Pinb.1 = 1
End If
 
Hallo Kampfkartoffel!

Willkommen im AVR-Praxis Forum! :ciao:


Es wäre seeehr hilfreich, wenn du erst mal den ganzen Programmcode hier einstellen würdest!
Dein Problem befindet sich nämlich nicht in dem von dir hier eingestellten Abschnitt. :wink:

Außerdem.....
Deinen kleinen Programmauszug könnte man jetzt schon ein wenig optimieren, aber darum geht es ja jetzt nicht.


Ich gehe jetzt einfach mal davon aus, dass deine RTC im Programm permanent abgefragt wird und die Systemuhr "einstellt".
Aus dem Grunde kannst du in deinem Programm auch eingeben was du möchtest......
nach dem nächsten Abfragen der RTC wird die Systemuhr wieder "richtig" eingestellt.

Was wäre also zu tun?
Du musst einfach NACH dem Einstellen der Variable, aber VOR dem Verlassen der Subroutine das Aktualisieren der RTC veranlassen! :wink:

Wenn du das Aktualisieren der RTC mit dem neuen Wert vergisst, wird deine Systemuhr beim nächsten Abfragen natürlich wieder auf den alten Wert eingestellt.
Klingt doch logisch, oder? :)


Wie aber schon geschrieben.....
Richtig helfen können wir erst, wenn du den gesamten Programmcode hier einstellst!


Grüße und viel Spaß weiterhin,
Cassio


EDIT:
Soweit funktioniert mit dem Beispielprogramm von Pirnaer alles.

Ähm....
das Beispielprogramm von wem?
Primaer? :hmmmm:
 
Danke für die Aufnahme und die Schnelle Antwort hier :)

Hier erstmal der komplette Code:

Code:
$regfile "m8adef.dat"                                       'ATmega8a auswählen
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 3686400                                          'Prozessor auf 3,6864 MHz setzen
$baud = 19200                                               'Datenrate Setzen

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
'LCD pins Konfigurieren
Config Lcd = 16 * 2                                         'LCD Größe
Initlcd                                                     'LCD Initalisieren
Cursor Off                                                  'Schreibmarke nicht anzeigen
Cls                                                         'LCD Löschen

Config Portd = Output                                       'LCD Pins sind output
Config Portb.0 = Input
Portb.1 = 1
Config Portb.1 = Input
Portb.2 = 1

Dim Sekunde As Byte
Dim Minute As Byte

Config Sda = Portc.4                                        ' I2C Bus konfigurieren
Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1

Config Clock = User                                         ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .

' Stellen der Uhr, muss nur einmal ausgeführt werden
'Time$ = "11:55:00"
'Date$ = "08.01.07"

' Main Loop
Do
Locate 1 , 1 : Lcd Date$
Locate 2 , 1 : Lcd Time$

'Code zum Stellen Der Uhr Zunächst nur mit Sekunde um zu testen ob sich diese Stellen lässt
If Pinb.1 = 0 Then
   Do
   Loop Until Pinb.1 = 1
   Cls
   Do
    Locate 1 , 1
    Lcd "Sekunde"
    Locate 2 , 1
    Lcd Sekunde
      If Pinb.2 = 0 Then
         Sekunde = Sekunde + 1
         Waitms 100
      End If
   Loop Until Pinb.1 = 0
   Do
   Loop Until Pinb.1 = 1
End If

Loop

' Unterprogramme für die Bascom Date/Time-Funktionen
Dim Weekday As Byte
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
_sec = Sekunde                                              'Hier wird die Sekundenvariable mit dem gestelltetn Wert ersetzt.
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return

End

Ist mir auch klar, dass man den kleinen Code schnipsel verbessern kann (aka Debounce und so :D ) ist halt erstmal nur ein kleiner Test, bevor ich mir die Mühe mache und das sauber aufschreibe :)
Ich frag mich auch, wie genau die ganze Geschichte mit Config Clock=user funktioniert.
Es gibt die 3 Subs Getdatetime setdate und settime
Ich frag mich halt, wann BASCOM, auf welche Routine zugreift.

Weiterhin habe ich mir so gedacht:
wenn Bascom z.b. jede sekunde die Zeit schreibt und abfragt, kann man dies für die Dauer des stellen irgendwie deaktivieren?
dann wäre es ja (denke ich mal) relativ einfach.

das wäre ja ungefähr so:

Interne Uhr deaktivieren
Uhrstellen mit tastern oder wie auch immer
Uhrzeit ins RTC schreiben
Uhr wieder aktivieren

diese hohlt sich dann die Neuen Daten vom RTC und es sollte eigentlich funktionieren :D

LG
 
Hallo!

Leider habe ich jetzt nicht genug Zeit um dir alles im Detail zu erklären.....
aber ein paar Denkanstöße kann ich dir schon geben. :wink:

Die drei Subroutinen zum Stellen und Auslesen der RTC werden "automatisch" aufgerufen, sobald die Uhr oder das Datum gestellt bzw. abgefragt werden.
BASCOM sorgt also intern dafür, dass bestimmte ASM-Routinen dafür aufgerufen werden.


Ich habe mich damit zwar noch nicht persönlich befasst, bin aber der Meinung, dass es folgender Maßen funktioniert:

Wenn du also z.B. schreibst:
Code:
Time$ = xx.xx.xx

Ist dies natürlich ein Stellen der Uhr......
also wird auch die entsprechende Subroutine zum Stellen der RTC aufgrufen.


Schreibst im Programmcode aber:
Code:
Lcd "Zeit=" ; Time$

wird automatisch das Lesen der RTC veranlasst.


Eine Möglichkeit wäre also die Systemvariablen (_min, _hour, _sec usw.) in Ruhe zu lassen und separate Variablen zu verwenden, in der du deine neue Zeit einstellst.
Anschließend wandelst du es in einen "Timestring" (z.B. Uhrzeit) und stellst die RTC dann mit:
Code:
Time$ = Uhrzeit


Eine andere Möglichkeit wäre, dass du eine Bytevariable verwendest und diese Einstellst.
Sobald du "fertig" bist kopierst du die Variable in die Systemvariable (z.B. _sec) und rufst dann auch gleich die Settime-Subroutine direkt auf mit:
Code:
Gosub Settime



Ansonsten kann ich dir noch die BASCOM-Hilfe empfehlen :wink:
und auch das Beispiel "datetime_test1.bas" im Samples-Ordner von BASCOM.


Grüße und viel Spaß dabei,
Cassio


EDIT:
Ach vergessen.....
Wo sind eigentlich die Einstellungen für den Timer1 ("Sekundentick") geblieben?
Schau bitte noch mal in die Hilfe von BASCOM, dort ist das recht gut erklärt!
 
Vielen dank für den Denkanstoß das hat so ne Blockade in mir gelöscht ;)
habe mich für den Letzten entscheiden und jezt funktioniert die Uhr schonmal ganz gut.
Wenn ich Zeit und Lust habe mache ich das Ganze noch fürs Datum was sich denke ich mal etwas schwieriger gestalten wird.

Zu dem sekundentimer:
Weder in den Bascom Samples noch im Pirnaer Beispiel (Wo der Hauptteil meines Codes herkommt) Link: http://www.pirnaer.de/bascom_fuer_myavr_ds1307_(echtzeituhr,rtc).html
wird Timer 1 gesetzt.
Auch bei mir wird wunderbar die Zeit auf dem LCD dargestellt und aktualiesiert.
Das liegt denke ich mal daran, dass jedes mal wenn ich mit Time$ die Uhr abfrage, die Leseroutine gestartet wird.
Und der RTC zählt ja die Sekunden auch weiter.

Hier nocheinmal mein aktualisierter Code, mit dem man die schon einmal die Uhr Korrekt stellen kann :)

Code:
$regfile "m8adef.dat"                                       'ATmega8a auswählen
$framesize = 32
$swstack = 32
$hwstack = 64
$crystal = 3686400                                          'Prozessor auf 3,6864 MHz setzen
$baud = 19200                                               'Datenrate Setzen

Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
'LCD pins Konfigurieren
Config Lcd = 16 * 2                                         'LCD Größe
Initlcd                                                     'LCD Initalisieren
Cursor Off                                                  'Schreibmarke nicht anzeigen
Cls                                                         'LCD Löschen

Config Portd = Output                                       'LCD Pins sind output
Config Portb.1 = Input
Taster1 Alias Pinb.1
Portb.1 = 1
Config Portb.2 = Input
Taster2 Alias Pinb.2
Portb.2 = 1

Dim Weekday As Byte

Dim Sekunde As Byte
Dim Minute As Byte
Dim Stunde As Byte

Config Sda = Portc.4                                        ' I2C Bus konfigurieren
Config Scl = Portc.5
Const Ds1307w = &HD0                                        ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1

Config Clock = User                                         ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .

' Stellen der Uhr, muss nur einmal ausgeführt werden
'Time$ = "11:55:00"
'Date$ = "08.01.07"

' Main Loop
Do
Locate 2 , 1 : Lcd Date$
Locate 1 , 1 : Lcd Time$
Debounce Taster2 , 0 , Stellen , Sub


Loop

' Unterprogramme für die Bascom Date/Time-Funktionen
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
_sec = Sekunde
_min = Minute
_hour = Stunde
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return


Stellen:
Cls

Do
Loop Until Taster2 = 1

Sekunde = _sec
Minute = _min
Stunde = _hour


Do
Locate 1 , 1
Lcd "Stunde"
Locate 2 , 1
Lcd Stunde
If Taster1 = 0 Then
   Stunde = Stunde + 1
   Waitms 100
End If
Gosub Zaehler
Loop Until Taster2 = 0
Do
Loop Until Taster2 = 1

Cls

Do
Locate 1 , 1
Lcd "Minute"
Locate 2 , 1
Lcd Minute
If Taster1 = 0 Then
   Minute = Minute + 1
   Waitms 100
End If
Gosub Zaehler
Loop Until Taster2 = 0
Do
Loop Until Taster2 = 1

Cls


Do
Locate 1 , 1
Lcd "Sekunde"
Locate 2 , 1
Lcd Sekunde
If Taster1 = 0 Then
   Sekunde = Sekunde + 1
   Waitms 100
End If
Gosub Zaehler
Loop Until Taster2 = 0
Do
Loop Until Taster2 = 1

Cls

Gosub Settime
Return


Zaehler:
If Sekunde > 59 Then
   Sekunde = 0
   Cls
End If
If Minute > 59 Then
   Minute = 0
   Cls
End If
If Stunde > 23 Then
   Stunde = 0
   Cls
End If

Return

End

Ich habs jezt so gelöst, dass nach meinem Stell sub Settime aufgerufen wird und damit dann die Uhr gestellt wird.

LG und vielen dank für die Hilfe :) Echt ein Super Forum hier
 
Hi,

funktionieren tut das sicherlich, ABER Du lastest den Rechenzwerg damit aus, ununterbrochen die Zeit auf's Display zu schreiben (auch wenn sich nichts ändert), und den Stell-Taster zu debouncen. Außerdem vermute ich, daß Bascom dann pro Schleifendurchlauf 2x die RTC ausliest - auch wenn sich nichts geändert hat.
Der Controller könnte immerhin bis zu 3,68... Millionen Instruktionen pro Sekunde abarbeiten; selbst wenn die Schleife 100.000 Takte kostet, läuft die 30mal pro Sekunde durch...

Jedesmal, wenn Du Zeit/Datum liest (Zugriff auf Date$/Time$), wird wegen Clock=User die Getdatetime aufgerufen, die die RTC jeweils komplett ausliest. Pro Hauptschleifendurchlauf (mindestens) 2x.

Mit den anderen beiden Softclock-Optionen würde Bascom einen Timer-IRQ nutzen, um die Zeit ticken zu lassen.

Eigentlich ist das aber gar nicht nötig - die RTC selbst kann ja auch einen genauen Takt ausgeben, einstellbar auf unterschiedliche Frequenzen (bis zu 1Hz).
Man könnte also auch einfach einen Pin pollen/als externen IRQ verwenden, und den 'ne Softclock treiben lassen. Da die aus der RTC selbst abgeleitet werden, muß die RTC eigentlich nur einmal beim Reset ausgelesen werden, danach läuft die Softclock im AVR ja synchron mit. Um sich mit dem Datum, Wochentagen, Schaltjahren in der Software nicht rumschlagen zu müssen, könnte man aber zusätzlich auch nach Mitternacht oder jeder vollen Stunde nochmal auslesen lassen.

Als Alternative zu den häufig eingesetzten DS1307 gibt es übrigens auch kleine RTC-Module, wo der Quarz bereits drinn ist. Hier zum Beispiel.
 
habe mich für den Letzten entscheiden und jezt funktioniert die Uhr schonmal ganz gut.


Hallo!

Fein, dass es nun wenigstens funktioniert und du das Prinzip ein wenig verstanden hast! :)

Die Bedenken von LotadaC teile ich allerdings ebenfalls und du solltest es dir zu Herzen nehmen! :tee:


Ich würde auch sagen.....
Betrachte das derzetige Programm lediglich als Übung und Spielerei!
Für einen echten Verwendungszweck ist es nicht zu gebrauchen! :lollypop:

Ich weiß jetzt nicht welches Ziel der Autor des ursprünglichen Programmes mit der Veröffentlichung verfolgt hat, aber ich hoffe es ging ihm nur um die Demonstration der RTC. :wink:


Im ersten Posting von dir hattest du geschrieben, dass du etwas "größeres" Entwickeln möchtest und nun erst mal mit einer Kleinigkeit, wie eben der RTC, beginnst.
Auch wenn deine RTC und das Anzeigen von Datum sowie Uhrzeit nun funktioniert, kannst du nun nicht einfach weiter machen und darauf aufbauen!
Betrachte das derzeitige RTC-Programm einfach nur als Funktionstest...... und mehr nicht.

Vielleicht magst du uns ja mal schreiben was du eigentlich entwickeln möchtest und wie dein persönlicher Wissensstand von Elektronik und Programmierung ist.
Anschließend kann dir dann meist auch schneller und direkter geholfen werden. :)


Viele Grüße,
Cassio
 
Aaalso:
Mein "großes Projekt" ist ein Schulprojekt.
Meine Gruppe hat sich als Projekt eine sogenannte HDD-Uhr ausgesucht.
dabei wollen wir diese Uhr (https://youtu.be/kPdYpST_yoE?t=2m39s) nachbauen, mit dem Unterschied,
dass wir eine 3,5 Zoll statt einer 2,5 Zoll Festplatte verwenden.

Unserer Bisheriger Stand ist, dass wir die Festplatte zerlegt haben, dabei jedoch die Ansteuerungselektronik
für den Motor in Ruhe gelassen haben.
Also ein Problem weniger :)
Die Festplatte dreht laut Datenblatt mit 5,2k Umdrehungen.
Weiterhin haben wir uns die LED's bereits vorgenommen: Diese werden über einen MOSFET geschaltet
da der µc ja nur 40mA ausgeben kann.
Nun habe ich mich an den RTC gemacht. das Problem haben wir ja hier ausführlich gelöst :)
Als nächstes steht dann an, die Platte wo die Zahlen drauf sind
mit Eagle zu erstellen und zu Fräsen (Fräse steht uns zur Verfügung).
Dann wollen wir mit einen Hall Sensor die Position bestimmen, um die LED's zu syncen.
Wenn die LED's sync sind und noch Zeit ist, hatten wir vor evtl. noch ein DCF77 Modul einzubauen.

Falls bei irgendeinen Dieser Schritte Probleme auftauchen sollten, werde ich mich hier auf jeden Fall noch einmal melden.

Zu dem RTC Programm: klar ist das erstmal nur ein Test. im späteren Verlauf wird die Uhrzeit dann nur noch Sekundentakt oder
ein bisschen weniger abgefragt, um den µc zu entlasten, dass er Die Aufgabe des LED's Schalten schafft :)

Beim Programmieren bin ich kein Blutiger Anfänger mehr. Die Programmierung in Bascom macht mir Spaß und interesiert mich.
Ich hatte bisher hauptsächlich Analog und Binärdaten ausgelesen und eingegeben.
Also Taster einlesen LED's anteuern, Poti auslesen etc.
Das läuft mittlerweile alles mit Leichtigkeit :D

In der Elektronik allgemein dürfte ich ein so Grundkenntnisse haben, erweitere
diese jedoch gerne um weiter :)

LG
 
Hallo,

Aaalso:
Mein "großes Projekt" ist ein Schulprojekt.
Meine Gruppe hat sich als Projekt eine sogenannte HDD-Uhr ausgesucht.
dabei wollen wir diese Uhr (https://youtu.be/kPdYpST_yoE?t=2m39s) nachbauen, mit dem Unterschied,
dass wir eine 3,5 Zoll statt einer 2,5 Zoll Festplatte verwenden.

:vollkommenauf: :flute: es ist wieder soweit :rolleyes: Die Schulprojekte fangen wieder an ;)

Hier noch der Rest von der "Vorlage" da ja im Video die Uhr bereits läuft und man nicht wirklich viel sehen kann.
http://hotchk155.blogspot.de/2012/02/digital-pov-clock-working-mostly.html
https://github.com/hotchk155/DigiPovClock

Wieviel Zeit ist denn? Das wäre wichtig um zu wissen ob das zu schaffen ist oder eher eine Panikattacke angebracht ist :p

Unserer Bisheriger Stand ist, dass wir die Festplatte zerlegt haben, dabei jedoch die Ansteuerungselektronik
für den Motor in Ruhe gelassen haben.
Also ein Problem weniger :)
Die Festplatte dreht laut Datenblatt mit 5,2k Umdrehungen.
Weiterhin haben wir uns die LED's bereits vorgenommen: Diese werden über einen MOSFET geschaltet
da der µc ja nur 40mA ausgeben kann.

Die LEDs für die einzelnen Stellen müßt ihr dann ja auch noch gegeneinander abschirmen damit nicht alles hell ist. Dran gedacht?

5200 Umdrehungen/min ist schon nicht ohne. Das sind etwa 87 pro Sekunden oder alle 11ms eine Umdrehung. Die komplette Berechnung und Steuerung der LEDs muß also in 11ms erledigt werden. Ich würde da auf die neureren Atmel-Type setzen. Die können auch 20MHz Takt und damit habt ihr etwas mehr Luft. Programme optimieren ist nämlich nicht so ganz ohne wenn die Luft bei den Möglichkeiten langsam dünn wird.

Nun habe ich mich an den RTC gemacht. das Problem haben wir ja hier ausführlich gelöst :)
Als nächstes steht dann an, die Platte wo die Zahlen drauf sind
mit Eagle zu erstellen und zu Fräsen (Fräse steht uns zur Verfügung).
Dann wollen wir mit einen Hall Sensor die Position bestimmen, um die LED's zu syncen.
Wenn die LED's sync sind und noch Zeit ist, hatten wir vor evtl. noch ein DCF77 Modul einzubauen.

Für die saubere synchrone Darstellung werden die Timerinterrupts schon ganz gut feuern. Man muß ja nicht nur die 11ms rechnen sondern man hat ja kleinere Kreissegmente und damit auch weniger Zeit zwischendurch. Da noch die Interruptgesteuerte DCF-Routine von Bascom zwischenwürfeln ist echt ne Aufgabe :p

Wenn man da nicht aufpaßt dann wird entweder die Anzeige zucken oder die Softclock bzw DCF-Routine kommt aus dem Tritt da sich die Ausführungszeiten gegenseitig beharken.

Ihr braucht auf jeden Fall eine saubere Planung aller Ausführungszeiten der einzelnen Programmteile.

Falls bei irgendeinen Dieser Schritte Probleme auftauchen sollten, werde ich mich hier auf jeden Fall noch einmal melden.

Ich bin gespannt wie es sich entwickelt.

Zu dem RTC Programm: klar ist das erstmal nur ein Test. im späteren Verlauf wird die Uhrzeit dann nur noch Sekundentakt oder
ein bisschen weniger abgefragt, um den µc zu entlasten, dass er Die Aufgabe des LED's Schalten schafft :)

Ich hab bei mir ein ähnliches Problem in einem Programm gehabt. Allerdings nicht ganz so krass. Man sollte auf jeden Fall so viel wie möglich in die Hardware schieben (vor allem das I2C) damit Sachen gleichzeitig laufen können ohne sich gegenseitig zu stören.

Beim Programmieren bin ich kein Blutiger Anfänger mehr. Die Programmierung in Bascom macht mir Spaß und interesiert mich.
Ich hatte bisher hauptsächlich Analog und Binärdaten ausgelesen und eingegeben.
Also Taster einlesen LED's anteuern, Poti auslesen etc.
Das läuft mittlerweile alles mit Leichtigkeit :D

In der Elektronik allgemein dürfte ich ein so Grundkenntnisse haben, erweitere
diese jedoch gerne um weiter :)

Dann besteht ja Hoffnung :cool: Denn mal viel Glück bei der Umsetzung.

Gruß
Dino
 
Also wir haben bis anfang Juni Zeit, das Projekt zu beenden. Ich denke mal, das soolte genug Zeit sein :D
@Dino03 welchen Atmega würdest du nehmen? Wir dürfen jeden microkontroller von Atmel verwenden :) .
Ich denke auch, dass das schwierigste an dem ganzen Projekt sein wird, die LEDs sauber zu programmieren. Es wäre auch möglich, 2 atmegas einzusetzen (einer zum ansteuern der leds, der andere zum uhrzeit auslesen etc.). Davon hab ich programmiertechnisch jedoch keine Ahnung bis jetzt :D

Lg
 
Seh ich ähnlich. Umso interessanter wäre mein Vorschlag, den Taktausgang der RTC als Clock-Takt zu wählen. Wenn Sekunden angezeigt werden sollen (können), muß man ja eh auf 'neue reagieren können, ansonsten könnte man vielleicht auch einen Timer als Zähler im CTC nutzen, der dann Minuten generiert.
Den eingehenden Takt könnte man direkt als Pegel am Eingang pollen, oder man verwendet einen externen IRQ (ggf auch den AC) dazu, und pollt dessen IRQ-Flag.

Generell wäre es von Vorteil, möglichst alles auf Zweierpotenzen auszulegen, also zB 16 Positionen des Zeichen-Rades usw. Dann könnte man zB das synchroniesieren eines Timers auf die Umdrehungen so angehen:
Ziel sind 16 etwas mehr als Timerüberläufe pro Umdrehung, wobei die Reichweite durch das OCRnA-Register begrenzt wird.
Der Sensor löst ein Input Capture aus, welches den Timer zurücksetzt, außerdem kann man anhand des Capture-Wertes die Timerreichweite an die Drehzahl anpassen.
Die 16 Timerüberläufe wären dann gleichverteilte Winkel auf dem Zeichen-Rad.
Da man da sicher für irgendwas die 16 Überläufe zählen muß (Half Carry), kann man daraus mit etwas Bitschubserei und ein paar logischen Operationen sicher auch die gerade zu zeigenden LEDs ermitteln/aus 'ner Tabelle konstruieren lassen.
Das soweit über Die Interrupts des Timers.
Die langsamen Änderungen (nur Sekunden) des darzustellenden Inhaltes in der Tabelle können dann in aller Ruhe im Hauptprogramm ablaufen.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)