Forum: Mikrocontroller und Digitale Elektronik Zuviel für einen ATMEGA16?


von der Bastian (Gast)


Lesenswert?

Hallo,

ich bin gerade am basteln und habe einen ATMEGA mit folgender 
Funktionalität ausgestattet:

LCD (PB0-PB7)
OneWire-Interface (DS1820) (PA0)
pH-Meter (PA1, via ADC)
UART+SoftUART (2x RS232, 1 PC, 1 Relaiskarte) PD0/PD1 und PD2/PD3)
2x 4BIT R2R DAC (PORT C)

Das ganze auf einer geätzten Leiterplatte, und die war nicht billig...

"Dummerweise" kamen mir nach dem Bestellen des PCB noch weitere Ideen. 
Bzw. Habe ich dinge im Konzept geändert. Um den AVR autonomer zu machen, 
soll er sich selber die Uhrzeit organisieren und via externer RTC (mit 
goldcap gepuffert) "verwalten"

Dazu würde ich gern noch das Conrad DCF77 Modul mit anbinden. Und eine 
DS1307. Und da sind meine "Problemchen":

Die SoftUART verwendet den 16bit Timer und PD2/3.
Um über die 2 DAC's nen Dimmer zu simulieren benötige ich evtl auch nen 
Timer.
Das DCF77-Modul braucht INT0. Da liegt die SoftUART drauf. Die RTC 
benötigt für den I2C ja SDA/SCL, und das sind beim ATMEGA16 PC1/PC0....
Und in den implementierungen für die RTC (ds1307) wird auch viel mit 
Timern gemacht.

Nun die Fragen: Stoße ich mit der Timerei auf Probleme?
Werde ich drumherum kommen, das board neu zu designen?
Aber ich denke mal nicht.
Ich habe noch nicht allzuviel Erfahrung mit der Hardwarebastelei, aber 
so wie es scheint werde ich die SoftUART auf PD6/7 legen (müssen) damit 
INT0 für das DCF77-Modul frei wird. und entweder auf einen 4bit DAC 
verzichten oder den auf PA4-7 legen.
Im Zuge der DAC bin ich auch auf AC via PWM gestoßen. Wo wäre denn der 
"Output" für das PWM Signal am Atmega16? PD4? Und: Benötige ich da nicht 
wieder nen Timer?

Wenn ich mein gerade geschriebenes so überfliege, dürfte mein haupt 
Problem wohl in den internen Timern liegen? oder sehe/verstehe ich da 
was falsch?

Vielen Dank erstmal im voraus bei der Hilfe bei den ganzen Fragen ;-)

Bastian

von Thomas B. (yahp) Benutzerseite


Lesenswert?

> Das DCF77-Modul braucht INT0.

Nicht unbedingt. Das Signal ändert sich doch recht beschaulich. Da kann 
man mit Polling an beliebigem Pin zurecht kommen.

> Im Zuge der DAC bin ich auch auf AC via PWM gestoßen. Wo wäre denn der
> "Output" für das PWM Signal am Atmega16? PD4? Und: Benötige ich da nicht
> wieder nen Timer?

Für die PWM in Hardware braucht man Timer, ja. Dann sind die "Outputs" 
die "Output Compare Match Outputs" OC0, OC1A, OC1B, OC2 - also PB3, PD4, 
PD5, PD7. Es gibt natürlich auch die Möglichkeit das ganze in Software 
zu lösen und dann beliebige IO-Pins zu verwenden PWM, Soft-PWM.

von Falk B. (falk)


Lesenswert?

@ der Bastian (Gast)

>LCD (PB0-PB7)
>OneWire-Interface (DS1820) (PA0)
>pH-Meter (PA1, via ADC)
>UART+SoftUART (2x RS232, 1 PC, 1 Relaiskarte) PD0/PD1 und PD2/PD3)
>2x 4BIT R2R DAC (PORT C)

Dabei langweilt sich der AVR.

>soll er sich selber die Uhrzeit organisieren und via externer RTC (mit
>goldcap gepuffert) "verwalten"

Kann man intern machen, siehe AVR - Die genaue Sekunde / RTC

>Dazu würde ich gern noch das Conrad DCF77 Modul mit anbinden. Und eine
>DS1307. Und da sind meine "Problemchen":

DCF77-Funkwecker mit AVR

>Die SoftUART verwendet den 16bit Timer und PD2/3.
>Um über die 2 DAC's nen Dimmer zu simulieren benötige ich evtl auch nen
>Timer.

Kann man mit einem Timer machen.

>Das DCF77-Modul braucht INT0.

Nein, das ist sogar eher schlecht. Viel besser ist die Abtastung des 
Signal mit 20..100 Hz im Timerinterrupt.

>benötigt für den I2C ja SDA/SCL, und das sind beim ATMEGA16 PC1/PC0....

Kann man problemlos auf beliebige Pins legen un I2C rein in Software 
machen.

>Und in den implementierungen für die RTC (ds1307) wird auch viel mit
>Timern gemacht.

Siehe oben.

>Nun die Fragen: Stoße ich mit der Timerei auf Probleme?

Eigentlich nicht. Du hast DREI!

>Werde ich drumherum kommen, das board neu zu designen?

Kommt drauf an.

>INT0 für das DCF77-Modul frei wird.

Nö.

> und entweder auf einen 4bit DAC
>verzichten oder den auf PA4-7 legen.

Den kann man auf vollkommen beliebige Pins legen.

>Problem wohl in den internen Timern liegen?

Nicht wirklich.

MFG
Falk

von Malte _. (malte) Benutzerseite


Lesenswert?

Das ist alles machbar. Da du scheinbar eher Anfänger bist, pass nur auf, 
dass du vor lauter Featurities nie fertig wirst. Jedenfalls geht es mir 
so -> Schwupps ist ein halbes Jahr rum.

Ich würde die PWM Sachen per Timer machen und bei den Schnittstellen 
ebenfalls so viel wie möglich. Auf den DS1307 würde ich verzichten und 
einen internen Timer verwenden. Mit Außnahme der Software RS232 
Schnittstelle bleibt dann nichts wirklich zeitkritisches mehr übrig.

Mit Timer2 lässt sich eine Uhr realisieren (Zähler von Millisekunden -> 
64 Bit Werte wenn das Programm mehr als 3 Wochen ohne Reset laufen 
soll), die mit der Genauigkeit der ATMEGA Taktquelle läuft.

von Struwwelpeter (Gast)


Lesenswert?

Ich würde mich meinem Vorredner anschließend. Wenn Du wirklich solange 
wartest, bis Dir gar nichts mehr einfällt, dann gehen die Jahre ins Land 
und Du hast nichts, nothing, rien.

Ich würde also empfehlen. Mach erstmal das, wofür Du bereits die LP 
hast, sammle Erfahrung (Du wirst auch Fehler machen) und starte danach 
ein neues Projekt (mit vielen neuen tollen Ideen), wo Du die Fehler des 
aktuellen Projekts nicht mehr machen wirst.

Das nehme ich mir auch jedesmal vor! grins Ich machs auch immer öfter.

In der Industrie schreibt man dafür ein Lasten-/Pflichtenheft. Aber auch 
privat solltest Du im Vorfeld so einigermaßen wissen, was Du machen 
willst oder sollst. Schon wegen der Kosten, die sonst leicht 
explodieren.

Dennoch, viel Spaß beim Basteln, Du hast ein schönes Hobby.

von Bastian (Gast)


Lesenswert?

Ich danke Euch erstmal für die vielen Ratschläge.
Ich bringe gewisse Hardwareerfahrung und sehr viel Programmiererfahrung 
mit. Nur eben einen ATMEGA anstelle eines x86 zu programmieren und die 
hardware selber zu bauen is schon etwas anderes, aber man (ich zumindest 
;) ) findet sich recht gut ein. es ist ja viel und gut dokumentiert. nur 
bei manchen dingen will man doch eben nochmal nachfragen ;-)

Ziel des Projektes ist die "autonome" Steuerung meiner Aquarien. Derzeit 
hängt die komplette Technik an einem Linux-PC, der 24/7 durchläuft und 
besagte Relaiskarten (Licht+Heizung) steuert, temperaturen/pH misst. Das 
ganze via RS232 bzw. FHZ1000. Nun hab ich hier ja einen 
single-point-of-failure wie ich im letzten Urlaub eindrucksvoll erfuhr. 
Das system lief 1 Jahr stabil, wir sind keine stunde ausm haus, rechner 
abgestürzt...

Mein Ziel ist daher, die Aquas (4) einzeln per Atmega zu steuern. Die 
Programmierung (licht an/aus, temperaturen) wird dann per RS232 via PC 
erledigt, der Atmega meldet den aktuellen status auf anfrage zurück usw.
Wenn der PC mal ausfällt, tut den aquarien das dann nicht weiter weh. 
Umgekehrt, wenn ein Atmega ausfallen sollte (warum auch immer) betrifft 
es nur ein Becken.

Und dazu soll der Atmega eben:
Mit dem PC kommunizieren (RS232) (läuft)
Alles auf einem LCD ausgeben (läuft)
Temperatur (OneWire) und pH (ADC) messen (läuft)
8 Relais schalten (Relaiskarte von Conrad mit RS232, läuft) 
(Licht+Heizung)
Licht dimmen (läuft teilweise, EVG mit dimmer für T5 Leuchtstoff)

Nun fehlt eben noch die zeitsteuerung, damit dies der PC nicht erledigen 
muss. Die "Zeitsteuertabelle" (wann was an/aus) wird ins eeprom 
übertragen und fertig is.

von Bastian (Gast)


Lesenswert?

Nun scheine ich bei meinen Überlegungen doch auf ein "Timerproblem" zu 
stoßen.

Wen ich mir den DCF77-Funkwecker-Code richtig anschaue und verstehe, 
wird der Timer0 für den DCF77-Empfänger genutzt um die Impulslänge zu 
ermiteln.

Timer1 dient dann der "internen RTC".

Für die SoftUART bräuchte ich wieder einen Timer, das könnte dann Timer2 
sein.

Aber die SoftPWM benötigt ja auch noch einen Timer.?

von Falk B. (falk)


Lesenswert?

@  Bastian (Gast)

>wird der Timer0 für den DCF77-Empfänger genutzt um die Impulslänge zu
>ermiteln.

>Timer1 dient dann der "internen RTC".

Kann man problemlos mit einem Timer machen. Einfach 100Hz Timerfrequenz 
einstellen und fertig.

>Für die SoftUART bräuchte ich wieder einen Timer, das könnte dann Timer2
>sein.

Ja.

>Aber die SoftPWM benötigt ja auch noch einen Timer.?

Jain. Den kann man sich ggf. mit der Soft-UART teilen. Die 
Output-Compare Funktionen machen es möglich.

MFG
Falk

von (prx) A. K. (prx)


Lesenswert?

Wenn die Timer ausgehen, sucht man nicht einen Controller mit 13 Timern, 
sondern verwendet einen einzigen mit beispielsweise 100Hz oder 1000Hz 
Interrupt und wickelt Delays und grobe Zeitauflösungen damit ab.

Damit hat man dann:

- Eine stetig raufgezählte "uptime", die für kontrollierte Verzögerungen 
verwendbar ist:
   uptime_t t = uptime + 100;
   while (uptime < t)
      ;

- Uhrzeit und Datum.

- Die Möglichkeit, in diesem Interrupt zyklisch aufzurufende Routinen 
einzubauen. Beispielsweise um alle 50ms den DCF77 Pin abzufragen.

Alles dies mit einem einzigen Timer.

von Malte _. (malte) Benutzerseite


Lesenswert?

Ich würde die Aufteilung so machen:
Timer0: Software UART
Timer1: PWM
Timer2: Uhr + timingt
Timer2 hat den schönen automatischen Reset, so dass eine Uhr keine 
"Ticks" verliert, wenn die Interrupts kurz deaktiviert sind.

Alles in einem Timer geht, wie schon geschrieben, natürlich auch.

von Bastian (Gast)


Lesenswert?

Ich habe jetzt in den Tutorials die Kapitel über Timer und Interrupts 
solange gelesen, bis ich sie verstanden habe.
Derzeit läuft das ganze wie folgt:
Timer0: DCF77-Empfänger: geht
Timer1: SoftUART: geht (ich wollt hier nicht im Code rumfummeln, der ist 
nicht von mir sondern von avrfreaks. never touch usw...)
Timer2: wird dann mein general purpose timer. der läuft mit einem 
entsprechendem prescaler und inkrementiert 3 weitere werte 
(unterschiedlich).
Der läuft hinreichend genau um:
a) intern die sekunden zu zählen, die Uhr wird mit jedem korrekt 
empfangenen dcf77 signal neu synchronisiert
b) software PWM zu implementieren
c) irgendetwas anderes zu tun, was mir sicher einfällt, wenn ich das 
neue PCB hab herstellen lassen :=)

Damit hab ich dann alles zusammen und habe noch einen kompletten port 
sowie 6 ADC eingänge frei.

Aber das werde ich dann im nächsten Projekt bearbeiten :-)

Danke Euch erstmal für die Hilfe!

Bastian

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.