Hi, ich habe vor, demnächst mit meinem Freund eine Binär-Uhr zu bauen. Dabei hatte ich die Idee, einen ATmega328P als Prozessor zur Ansteuerung von den LED's, der Weckfunktion, etc. zu nutzen und einen ATtiny85 mit einem 32,768kHz Uhrenquarz als "Zeit-Server", welcher entweder vollständig auf Batterie oder mit einer "Backup Batterie" läuft, sodass auch bei Stromausfall die Zeit immerhin weiterläuft. Eine fertige Real-Time-Clock möchte ich hier aus zwei Gründen nicht verwenden, nämlich zum einen, da wir sowohl den ATmega328 als auch den ATtiny85 vor Ort haben und zum anderen, da wir gerade erst in die AVR-Programmierung einsteigen, und das mit einer RTC vlt. keinen so großen Lerneffekt hätte. Jetzt habe ich es schon geschafft, den ATtiny mit dem 32,768kHz Uhrenquarz laufen zu lassen, allerdings verzweifle ich bei der Kommunikation mit dem ATmega. Ich habe schon versucht, Arduino-Code auf den Tiny zu laden. Dafür benutze ich die Libraries von der High-Low Tech Group und habe in der boards.txt einen neuen Eintrag für den 37,768kHz-Crystal erstellt. Das Kompilieren klappt ohne Fehler, und auch der Upload, wenn auch logischerweise langsam, funktioniert. Nur betragen 100ms im Programm ca. 10s. Liegt das daran, dass die Clock-Frequenz für Arduino zu langsam ist? Wenn Arduino laufen würde könnte ich ja rein theoretisch zur Kommunikation einfach SoftwareSerial benutzen und alle meine Probleme wären gelöst. Mit purem C läuft der Blink-Sketch problemlos, allerdings weiß ich nicht, wie ich I2C, SPI oder SoftwareSerial mit C implementiere und werde aus diversen Artikeln im Internet nicht viel schlauer. Hat jemand eine Idee, wie ich den Tiny mit korrektem Clock-Speed dazu bringen kann, Arduino-Code auszuführen? Oder hat vielleicht jemand mal ein Beispiel-Programm für den Tiny in C, welches Serielle-Kommunikation, I2C oder SPI verwendet? Vielen Dank im Voraus, thel30n
Du kannst auch deinen "low frequency Crystal" direkt an den ATMega328P klemmen.
Leon S. schrieb: > allerdings weiß ich > nicht, wie ich I2C, SPI oder SoftwareSerial mit C implementiere und > werde aus diversen Artikeln im Internet nicht viel schlauer. "Nicht viel schlauer" ist eine sehr unpräzise Beschreibung für das genaue konkrete Teilproblem an dem Du hängen bleibst.
Hi Bernd, ich habe schon versucht, diverse Software-Serial Bibliotheken für C auf meinem Tiny zum laufen zu bringen. Leider gab es entweder Fehler beim Kompilieren oder es wurde nichts ausgegeben. Ich werde jetzt erstmal versuchen, diese auf einem Tiny mit vollen 8mHz auszuführen, mal gucken ob es an der geringen Frequenz liegt. @Ulrich, ich könnte den Quarz natürlich an den Mega anschließen, allerdings möchte ich gerade den Tiny aufgrund seines geringen Stromverbrauchs als Zeit-Server verwenden, da dieser dann für eine etwas längere Zeit bei einem Stromausfall / Transport der Uhr die Uhrzeit und evt. Weckeinstellungen "behält". Der Mega würde dann die LED's etc. ansteuern und verbraucht so logischerweise mehr Strom. Außerdem hat dieser wesentlich mehr Rechenoperation auszuführen und ich kann nicht einschätzen, ob dafür 32kHz reichen... Vielen Dank euch beiden, thel30n
:
Bearbeitet durch User
Leon S. schrieb: > ein Beispiel-Programm für den Tiny in C, welches Serielle-Kommunikation, > I2C oder SPI verwendet? Es gibt eine Library für einen I²C-Slave für den Tiny und seine "USI"-Hardware hier: http://www.jtronics.de/avr-projekte/library-i2c-twi-slave-usi.html die ist sehr gut und funktioniert out-of-the-box, achte nur darauf Dir keine I2C-Adresse auszudenken die das höchstwertige Bit gesetzt hat, damit hat sie Probleme. Ansonsten vollkommen unproblematisch. Wenn Du I2C oder SPI verwendest dann ist die genaue Taktfrequenz des Slave zweitrangig, vorausgesetzt Dein SPI- oder I2C-Takt ist nicht so schnell daß der Slave nicht mehr hinterher kommt, die Taktfrequenz für die Datenübertragung selbst wird ja vom Master vorgegeben (anders als bei UART) und darf daher in weiten Grenzen variieren. > "Arduino-Code" Davon rate ich ab. Tu Dir selbst einen Gefallen und verwende professionelles Werkzeug (gibts kostenlos von Atmel) und quäle Dich nicht mit den willkürlichen Beschränkungen und IMHO vollkommen unangemessenen Pseudo-Versimplifizierungen (zweischneidiges Schwert, wirkt auch als heftige Verkomplizierung sobald man vom vorgesehenen Weg abweichen muss) der Arduino-Umgebung herum.
Leon S. schrieb: > Außerdem hat dieser wesentlich mehr > Rechenoperation auszuführen und ich kann nicht einschätzen, ob dafür > 32kHz reichen... reichen sie sicherlich nicht, stimmt schon. Aber im Datenblatt steht bei Timer 2 der Satz "Allows Clocking from External 32kHz Watch Crystal Independent of the I/O Clock" Sprich deine Berechnungen auf dem ATMega laufen mit dem schnellen, internen Takt (LEDs, Wecker) und der Timer 2 arbeitet mit dem langsamen Quarz und wirft dir präzise Interrupts dazwischen (Hochzählen der Sekunden).
Leon S. schrieb: > Der Mega würde dann die LED's etc. ansteuern und verbraucht so > logischerweise mehr Strom. Außerdem hat dieser wesentlich mehr > Rechenoperation auszuführen und ich kann nicht einschätzen, ob dafür > 32kHz reichen... Datenblatt nicht gelesen! Timer2 wird vom Uhrenquarz bedient. Der Rest des ATMegas kann mit den internen 1 oder 8MHz laufen. Auch kann der ATMega die LEDs ausmachen. Grundsätzlich kann man immer nur in eine Richtung optimieren. (alles andere sind Kompromisse) Was willst du/ihr wirklich? Lernen? Strom sparen? Unbedingt attiny und atmega verbinden? Keinesfalls eine RTC? (Aus meiner Sicht eine unsinnige Vorgabe) Nehmt euch/dir jedes dieser Themen einzeln vor.
Leon S. schrieb: > Eine fertige Real-Time-Clock möchte ich hier aus zwei Gründen nicht > verwenden, ..., da wir gerade erst in die > AVR-Programmierung einsteigen, und das mit einer RTC vlt. keinen so > großen Lerneffekt hätte. Leon S. schrieb: > Jetzt habe ich es schon geschafft, den ATtiny mit dem 32,768kHz > Uhrenquarz laufen zu lassen, allerdings verzweifle ich bei der > Kommunikation mit dem ATmega. Die Kommunikationsprobleme müßtest du bei einer RTC genauso lösen, wenn du es dir verkneifst, auf eine fertig Lib zurück zu greifen. Das Argument mit dem Lerneffekt greift da nicht so richtig.
Die ATtiny*5 sind nicht gerade Stromsparer. Mir ist es nicht gelungen, ihn unter 15µA zu drücken bei 32kHz [5V]. Der ATmega328A schafft dagegen <1µA in Power-Save. Und wenn Du den ATtiny erstmal auf 32kHz gefused hast, brauchst Du fürderhin nen HV-Programmer (STK500) für weiteres Flashen. 32kHz direkt am ATmega328 wäre die deutlich einfachere Variante.
Hi und erstmal Danke @alle. Ich habe es nun endlich geschafft eine Serielle Kommunikation auf dem ATtiny einzurichten. Jetzt fehlt mir lediglich noch die Zeitmessung selbst. Mein Freund hat in der Zeit die Ansteuerung der LED's erfolgreich programmiert. Ich habe versucht den Artikel "AVR - Die genaue Sekunde / RTC" zu verstehen und auf unser Projekt zu übertragen. Leider gibt der Tiny mit dem von mir modifizierten Code kein Lebenszeichen von sich :D. Kann mir jemand sagen, wie ich relativ genau mit einem ATtiny Zeit messen kann, bzw. noch besser einen Beispielcode geben? Ich bin hier ziemlich am Verzweifeln. Danke schon mal im Voraus, thel30n @peda Ich habe den Tiny schon auf 32kHz gefused. Ich kann ihn mit dem avrdude-Argument
1 | -B 10000 |
, zwar langsam, programmieren. Ich besitze einen AVRISP-Klon der mit dem STK500v2 Protokoll arbeitet...
:
Bearbeitet durch User
Leon S. schrieb: > Ich habe es nun endlich geschafft ... > Jetzt fehlt mir ... > Mein Freund hat ... Mensch, wir können doch nicht hellsehen, wo ist der Code (Dateianhang).
Leon S. schrieb: > Kann mir jemand sagen, wie ich relativ genau mit einem ATtiny Zeit > messen kann, bzw. noch besser einen Beispielcode geben? Ich bin hier > ziemlich am Verzweifeln. Was soll das? Nur weil man einen Attiny85 rumliegen hat, muss den nicht auf Krampf einbauen. Und nichts anderes als Krampf ist das, was ihr vorhabt. Daraus lernt man, ausser, dass das nichts taugt, gar nichts. Wenn ihr was lernen wollt, dann macht es richtig. Der 328 bringt alles mit, was ihr braucht. An 2 Pins kommt der Uhrenquarz und alles läuft intern, inkl. einer Messung der Versorgungsspannung, um zu erkennen, ob der Controller mit Batterie oder Netzteil läuft. mfg.
:
Bearbeitet durch User
@peda, tut mir leid, habe gerade nicht sehr viel Zeit. Zur Seriellen Kommunikation habe ich "The ATtiny85 Template Library" (http://thegaragelab.com/a-software-uart-for-the-attiny85/) verwendet. Meine main.c, die jetzt garantiert nicht mehr funktioniert, weil ich darin wild Ziffern geändert habe, im Anhang. Und viel weiter bin ich auch nicht. @thomase, es wäre einfach schön, zwei Chips in das Projekt sinnvoll einzubinden. Außerdem wäre es für uns einfacher, den Tiny vollständig auf Batterie und den Mega vollständig auf Netzstrom laufen zu lassen. thel30n
Leon S. schrieb: > es wäre einfach schön, zwei Chips in das Projekt sinnvoll einzubinden. > Außerdem wäre es für uns einfacher, den Tiny vollständig auf Batterie > und den Mega vollständig auf Netzstrom laufen zu lassen. Es ist weder sinnvoll, noch einfacher. mfg.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.