Forum: Mikrocontroller und Digitale Elektronik Kommunikation zwischen ATtiny85 und ATmega328p


von Leon S. (thel30n)


Lesenswert?

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

von Ulrich F. (Gast)


Lesenswert?

Du kannst auch deinen "low frequency Crystal" direkt an den ATMega328P 
klemmen.

von Bernd K. (prof7bit)


Lesenswert?

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.

von Leon S. (thel30n)


Lesenswert?

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
von Bernd K. (prof7bit)


Lesenswert?

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.

von Daniel S. (daniel_s49)


Lesenswert?

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).

von Ulrich F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Leon S. (thel30n)


Lesenswert?

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
von Peter D. (peda)


Lesenswert?

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).

von Thomas E. (thomase)


Lesenswert?

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
von Leon S. (thel30n)


Angehängte Dateien:

Lesenswert?

@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

von Thomas E. (thomase)


Lesenswert?

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
Noch kein Account? Hier anmelden.