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
> 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.
@ 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
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.
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.
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.
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.?
@ 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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.