• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Zeitgesteuertes im Wald mit Tiny AVR + RTC Chip

KrasserMann

Geocacher
Erstes brauchbares Ergebniss findet Ihr auf Seite 6 dieses Threads.







Hallo Gemeinde ;)

für einen speziellen Nachtcache den wir planen benötigen wir an jeder Stage Elektronik mit einer relativ genau gehenden Uhr!

Ziel soll es sein das jede Station nur zu einer bestimmten Zeit gefunden werden kann, so das das suchende Team zur Lösung einer vorhergehenden Station nur eine bestimmte Zeit zur Verfügung hat.

Sozusagen ein kleines wettrennen, die Cacher gegen die Zeit!

Ich habe nun eine kleine Schaltung auf Basis eines Atmel Tiny2313 zusammen mit der RTC DS1703 entwickelt.

Datum, Uhrzeit, und Alarmzeit können über RS232 gesetzt und ausgelesen werden.

Die RTC ist mit einer LI-Knopfzelle gepuffert und läuft auch weiter wenn die Hauptbatterie platt ist. Der Speicher für die Alarmzeit ist ebenfalls in der RTC und somit gepuffert. Lt. Datenblatt hällt die LI Zelle ca. 10 Jahre

Über den Stromverbrauch der Gesamtschaltung kann ich noch nix sagen, ebenso ist der Schaltplan noch nicht gezeichnet. Wenn das fertig ist werde ich das hier veröffentlichen.

Ich poste hier im folgenden schonmal meinen BASCOM Code!

Dieser Funktioniert, ist aber sicher optimierbar, und genau da suche ich eure Hilfe!

Fragen:

1. Wie bekomme ich den noch kleiner, mein 2313 ist nu 100% voll
ich würde aber gerne noch mehrer Alarmzeiten implementieren
der Speicher dafür steht in der RTC ausreichend zur Verfügung
nur für den nötigen Code in den Routinen Recser & Timecheck fehlt mir
platz.

2. Energieverbrauch

Nach Initialisierung geht der Tiny in den IDLE Mode
Er wird geweckt durch entweder einen Seriellen Interrupt zur
Konfiguration oder von der RTC jede Sekunde über Int0 um
die Alarmzeiten zu prüfen.

Dann geht er wieder schlafen.

Ist hier nochwas zu verbessern?


Für weitere Tips bin ich dankbar!

Gruß Martin
 
OP
K

KrasserMann

Geocacher
So, hier mal der Code!


Code:
'-----------------------------------------------------------------------------------------
'name                     : Geocaching Blink Light with RTC Control
'copyright                : is GPL by M.Schenkelberg aka Team KrasserMann
'purpose                  : Schmeis es in der Wald und staune ;)
'micro                    : Tiny2313
'-----------------------------------------------------------------------------------------

$regfile = "ATTiny2313.dat"                                 ' specify the used micro
$crystal = 9216000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space

'Setup I2C

Config Sda = Portd.5
Config Scl = Portd.4

$lib "mcsbyte.lbx"
$lib "ds1307clock.lib"

Wait 2

'Chip Adresses
Const Ds1307w = &HD0
Const Ds1307r = &HD1

'Control Register
I2cstart
I2cwbyte Ds1307w
I2cwbyte 7
I2cwbyte &B10010000
I2cstop


Config Clock = User
Config Portd.6 = Output

Dim Weekday As Byte
Dim A As Byte , B As Byte , C As Byte

'Interrupts
Config Int0 = Falling
On Int0 Timecheck
On Urxc Recser
Enable Urxc
Enable Int0
Enable Interrupts


Do
Idle
Loop


End

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 = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
   I2cstart
   I2cwbyte Ds1307w
   I2cwbyte 0
   I2cwbyte _sec
   I2cwbyte _min
   I2cwbyte _hour
   I2cstop
Return

Recser:
   Disable Interrupts
   Dim Zeit As String * 8
   A = Inkey()                                              'Buffer Leeren
   Print "Aktuelle Zeit: " ; Time$ ; "Aktuelles Datum: " ; Date$
   Print
   I2cstart
   I2cwbyte Ds1307w
   I2cwbyte 8
   I2cstart
   I2cwbyte Ds1307r
   I2crbyte _hour , Ack
   _hour = Makedec(_hour)
   Print "Alarm Stunde: " ; _hour
   I2crbyte _min , Nack
   I2cstop
   _min = Makedec(_min)
   Print "Alarm Minute: " ; _min
   Print "A - Setze Zeit und Datum B - Setze Alarm Zeit "
   A = Waitkey()
   If A = 97 Then
      Input "(HH:MM:SS)?:" , Zeit
      Time$ = Zeit
      Input "(MM-DD-YY)?:" , Zeit
      Date$ = Zeit
   End If
   If A = 98 Then
      'Input "Nummer:" , P
      I2cstart
      I2cwbyte Ds1307w
      'P = 8 + P
      I2cwbyte 8
      Input "Stunden: (hh) " , _hour
      _hour = Makebcd(_hour)
      I2cwbyte _hour
      Input "Minuten: (mm) " , _min
      _min = Makebcd(_min)
      I2cwbyte _min
      I2cstop
   End If
   Enable Interrupts
Return

Timecheck:
   Disable Interrupts
   'read time
   I2cstart
   I2cwbyte Ds1307w
   I2cwbyte 0
   I2cstart
   I2cwbyte Ds1307r
   I2crbyte _sec , Ack
   _sec = Makedec(_sec)
   I2crbyte _min , Ack
   _min = Makedec(_min)
   I2crbyte _hour , Nack
   _hour = Makedec(_hour)
   I2cstop
   'read alert time
   I2cstart
   I2cwbyte Ds1307w
   I2cwbyte 8
   I2cstart
   I2cwbyte Ds1307r
   I2crbyte A , Ack
   A = Makedec(a)
   I2crbyte B , Nack
   B = Makedec(b)
   I2cstop

    If _hour = A And _min = B And _sec = 00 Then

       For A = 1 To 50
       Portd.6 = 1
       Waitms 300
       Portd.6 = 0
       Waitms 300
       Next A

   End If

   Enable Interrupts
Return
 
KrasserMann schrieb:
2. Energieverbrauch

Nach Initialisierung geht der Tiny in den IDLE Mode
Er wird geweckt durch entweder einen Seriellen Interrupt zur
Konfiguration oder von der RTC jede Sekunde über Int0 um
die Alarmzeiten zu prüfen.

Dann geht er wieder schlafen.

Ist hier nochwas zu verbessern?
Irgend wie muss doch der Cacher in Interaktion mit dem Rechner kommen. Und da gibt es viele Möglichkeiten.

a) Da ist die einfachste Methode eine 9V Batterie mitbringen lassen.
b) Der Cacher betätigt einen Einschalter.
c) Der Rechner wird über eine stromsparende Schaltung aufgeweckt, die einen Sensor hat, der den Cacher zu entdeckt.
d) ...

Was soll es den werden?

KDB
 
OP
K

KrasserMann

Geocacher
Hi, nein der Cacher hat mit der Elektronik nix zu tun!

Dies dient lediglich als hinweigeber auf die Stage, dort wo es blinkt findet der Cacher weitere informationen (Micro oder so)

Es reicht für den Cache wenn die Schaltung zuverlässig um Uhrzeit X für ca. 1 Minute blinkt!

Wenn die cacher das verpassen kommen sie eben ein andermal wieder ;)

Das ganze wir natürlich in der difficulty berücksichtigt.

Es geht mir eigentlich nur darum die Software selber auf minimalen ruhestromverbrauch zu trimmen.

Ich muss sie leider mit 5V versorgen (wegen der RTC) also wird das auf 4 STK AA oder einen 9V Block + Stabi rauslaufen.
 

Windi

Geoguru
KrasserMann schrieb:
2. Energieverbrauch

Nach Initialisierung geht der Tiny in den IDLE Mode
Er wird geweckt durch entweder einen Seriellen Interrupt zur
Konfiguration oder von der RTC jede Sekunde über Int0 um
die Alarmzeiten zu prüfen.

Dann geht er wieder schlafen.

Ist hier nochwas zu verbessern?
Musst Du wirklich jede Sekunde die Zeit aktualisieren?
Wenn längere Intervalle reichen würde ich den Tiny per Powerdown schlafen schicken und ihn per Watchdog aufwecken. Das längste Intervall ist hier 8 Sekunden.

Du müsstest mal die Stromaufnahme messen. Ich kann mir auch vorstellen dass die I2C-Zugriffe die Stromaufnahme erhöhen.
 
OP
K

KrasserMann

Geocacher
gemessene stromaufname:

4,6 mA - 6,1 mA im Ruhebetrieb

10 mA im Alarmfall


Die Sache mit dem Watchdog und einem längeren Intervall verkompliziert die Alarmzeit auswertung wenn mann sekundengenau schalten möchte.

Macht man es nur Minutengenau dann gibt es das Problem mit der Seriellen Schnittstelle.

Diese löst bei Powerdown keinen IRQ aus, also müsste man zur konfigutation warten bis der Watchdoch ihn weckt. Da er aber sehr schnell wieder Powerdown macht glaub ich nicht das das praktikabel ist.

Das schöne ist ja das die RTC den IRQ im Sekundentakt automatisch erzeugt.
 

Windi

Geoguru
Für eine Schaltung die vermutlich im Wald an Batterien hängt zuzelt das Teil aber verdammt viel Strom. Bei Betrieb mit AAs wären die Batterien nach nicht mal einem Monat leer.

Bei meinem Tiny 13 Reaktivlicht liegt die Stromaufnahme im Schlafmodus bei 5 µA. Ich denke mal beim 2313 wird es auch irgendwo im µA-Bereich liegen.

Ich würde einen (Reed-)kontakt verwenden um den Watchdog zu deaktivieren für die Programmierung. Eingänge hast Du ja sicher noch genügend frei.

Du weißt doch in etwa wann Du schalten willst. Da es ein Nachtcache wird kann das Teil ja tagsüber schalfen. Zwischendurch wird nachgeschaut wie spät es ist. Wenn die "heiße Phase" beginnt kannst Du den Schlafmodus ja deaktivieren. Die Watchdog-Zeit läßt sich auch verringern. (8 Sek. / 4 Sek. / 2 Sek. / 1 Sek. / 0.5 Sek. / 0.25 Sek. / 0.125 Sek.)
 
OP
K

KrasserMann

Geocacher
Ja, die idee ist gut, werd damit mal spielen, ich kann dann ja auch sicher die Versorgungsspannung von der RTC durch den Tiny abschalten lassen. Sollte auch Strom sparen.
 

radioscout

Geoking
Nimm doch einfach einen billigen (Funk)wecker, trenne den Piezobeeper ab und steuere damit deine Blinkschaltung.

Aber ob sich der Aufwand lohnt? Für mich ist so ein Cache ein Kandidat für die Ignoreliste. Das schöne am Cachen ist doch, daß man es jederzeit und ohne Zeitdruck machen kann.
Es gibt übrigens bereits min. einen Cache dieser Art. AFAIK heißt der einfach nur "Time".
 
OP
K

KrasserMann

Geocacher
Drum gibt´s ja auch für jeden geschmack einen Cache.

Es wird bei diesem Cache ja nicht primär um Zeitdruck gehen, aber dieser ist schon ein wichtiger faktor wenn es darum geht jemanden zu motivieren die station auch wirklich zu machen ;)

aber das ist hier ja nicht Diskussionsgrund.

Der Wecker scheidet leider aus da er ein bischen zu wenig intelligent ist.
Am Ende passiert schon hier und da etwas mehr als blinken.

Na mal schauen, die Elektronik wird zeigen ob wir das cachekonzept umsetzen können oder ob die idee in die tonne wandert.

Martin
 

radioscout

Geoking
KrasserMann schrieb:
Der Wecker scheidet leider aus da er ein bischen zu wenig intelligent ist.
Am Ende passiert schon hier und da etwas mehr als blinken.
Deshalb sollte er ja auch nur als Strom sparender Zeitgeber dienen.
Das geht natürlich nur, wenn eine Aktion pro einstellbarer Weckzeit (i.A. einmal in 24h) ausreicht. Oder Du schaltest das Stundensignal ein und der Rest der Schaltung wird einmal pro Stunde entscheiden, was zu tun ist.
 

DerAndere

Geocacher
Ich habe mal was von GPS empfängern als genaue Zeitquelle gehöhrt (gelesen), aber wenn ich sehe wie schon über Stomaufnahme debattiert wird ist das wohl keine akzeptable Lösung.

(Nur so eine Idee)
 
OP
K

KrasserMann

Geocacher
Windi schrieb:
Bei meinem Tiny 13
Code:
Reaktivlicht liegt die Stromaufnahme im Schlafmodus bei  5 µA. Ich denke mal beim 2313 wird es auch irgendwo im µA-Bereich liegen.
[/quote]

Hmmmmm irgendwie bekomm ich das nicht runter.

Schaltung ist minimal:

Tiny an 5V + LED über 1k an PORTD.6 nach Masse externer Quarz Ende

Folgender Code:

Code:
$regfile = "ATTiny2313.dat"                                 ' specify the used micro
$crystal = 9216000                                          ' used crystal frequency


$hwstack = 32                                               ' default use 32 for the $swstack = 10                                               ' default use 10 for the SW $framesize = 40                                             ' default use 40 for the 

Config Portd.6 = Output
Config Watchdog = 2048

Stop Timer0
Stop Timer1
Stop Ac

Do
   Portd.6 = 1
   Waitms 20
   Portd.6 = 0

   Start Watchdog
   Powerdown

Loop
End

Der Tiny wird nach 20ms LED an / aus in den Powerdown mode versetzt.
Der Watchdog Timer holt den Tiny alle 2 sec zurück.

Und das spiel beginnt von vorn.

Aber die Stromaufnahme bekomme ich nicht unte 6mA

Ideen?
 
OP
K

KrasserMann

Geocacher
Ok, wer lesen kann ist klar im Vorteil

Es scheint der Zusammenhang mit Betriebsspannung ,und Frequenz zu sein.

Ich hab versuch den Tiny auf den INT 128KHZ Osc umzustellen.

1. Toter Chip :/

Also die sache mit den Fuses nochmal nachgelesen und zwei weitere getötet.

Kann man die noch retten?

Die Der Teiler durch 8 war aus, und der gewählte clock mode war

100110:Int RC Osc. 128khz StartupTime 14ck+64ms [CKSEL=0110 SUT=10]

2* Mit Fusebit H = 1 (Watchdog Timer always ON DISABLED)
1* Mit Fusebit H = 0 (Watchdog Timer always ON ENABLED)


Was ist hier falsch, warum sind die Chips nicht mehr ansprechbar?
 

stonewood

Geowizard
Moin,

die 128 KHz wären auch mein Tip gewesen.

Hat der Programmer beim Schalten der Fuses den 2313 erkannt?
Die Tinys sind alle recht unterschiedlich in der Fuse-Verteilung. Was passiert
wenn der Tiny mal 5min. ohne irgendwas liegenbleibt? Eventuell muß der erst mal 'runterschalten' - hatte ich bei meinem ersten tiny13 auch. Womit programmierst Du? Beim Parallelport und bascom-AVR: Irgendwo im Programmer kann man die Frequenz des Tiny einstellen, dann programmiert bascom langsamer - aber alles andere elektronische dann außer Reichweite legen, insbesondere Handys stören dann die Programmierung.

Ach ja, falls irgendwie der externe Quarz aktiviert wurde: anderen Tiny mit irgendwas was einfach 1/0 rauswirft programmieren - 500KHz sollten reichen - und das auf den Quarz-Eingang legen. Damit ist der Tiny dann wieder ansprechbar.
 
OP
K

KrasserMann

Geocacher
hi,

ich programmier mit em bascom und dem prieswerten adapter mit den widerständen für den paralellport. Der ist auch im reaktivlicht kochbuch beschrieben.

Der Tiny ist vor der fuse programmierung einwandfrei erkannt worden.

Das mit dem 5Min liegen lassen kann ich mal testen wobei mir das komisch vorkommt.

ich nehm an ich brauche einen anderen programmer um die chips zu retten oder?
 
KrasserMann schrieb:
Ich habe nun eine kleine Schaltung auf Basis eines Atmel Tiny2313 zusammen mit der RTC DS1703 entwickelt.

Wie gut ist so ein DS1703 RTC? Etwas Drift haben die Dinger doch eigentlich immer. Dazu kommen dann noch Schwankungen der Umgebungstemperatur von vielleicht -10°C bis +30°C.
Wenn man alle paar Wochen die Uhren der einzelnen Stationen nachstellen müßte, wäre das eher lästig.
Sind vergleichbare DCF-77-Empfänger in kleinen Mengen preiswert verfügbar?
8|
 
OP
K

KrasserMann

Geocacher
Hi, also einen Langzeit test konnte ich noch nicht machen, aber ich denke schon das die genau genug sind.

Innerhalb 24h konnte ich keine gangabweichung zu meinem funkwecker feststellen.
Das problem mit dcf77 ist:

1. Teurer als der RTC Chip

2. Der Empfänger funktioniert optimal nur bei bestimmten ausrichtungen zum sender, das kann ich im wald nicht wirklich sicherstellen.

Mein Funkwecker zeigt jedenfalls öffter mist an als meine pc uhr.

Denke RTC ist schon OK und wenn der auf ein Jahr gesehen mal 1 Minute abweicht solls auch ok sein
 

Windi

Geoguru
KrasserMann schrieb:
ich nehm an ich brauche einen anderen programmer um die chips zu retten oder?
Probier mal folgendes aus:

Im Basic-Programm den Crystal-Wert auf 128000 setzen.
(Wenn Du die "Divide / 8" Fuse aktiviert hast musst Du für den Crystal-Wert 16000 eintragen.)
Wichtig: Das Programm neu compilieren.

Und jetzt schauen ob Du wieder Zugriff auf die Fusebits hast.
 
Oben