Hallo Leute! Ich muss im Rahmen eines Projekts 8 Heizelementen mit einem Atmega8 ansteuern. Dabei sollen die Heizelementen nacheinander für eine bestimmte Zeitspanne ein- und ausgeschaltet werden. Außerdem soll ein Temperatursensor an jedem Heizelement die Temperatur des Heizelement erfassen. Die erfasste Daten sollen direkt an dem AD-wandler des ATmega8 verschickt werden. Nach der Wandlung sollen die Werten in das EEPROM des Atmega8 gespeichert werden und später zur Verarbeitung über I²C (TWI) weitergeleitet werden. Die Temperatursensoren sind dabei einfache analoge sensoren (z.b PT100) also hier noch mal das Protokoll zusammengefasst: Heizer1 an --> warte 200sek --> heizer1 aus --> AD wandler an wenn daten vorliegen --> Messdaten im EEPROM des Atmega8 speichern --> über TWI weiterleiten. Heizer2 an --> warte 200sek --> heizer2 aus --> AD wandler an wenn daten vorliegen --> Messdaten im EEPROM speichern --> über TWI weiterleiten. usw... bis Heizer8 an --> warte 200sek --> heizer8 aus --> AD wandler an wenn daten vorliegen --> Messdaten im EEPROM speichern --> über TWI weiterleiten. Und das ganze soll dann in C implementiert werden. Nur ich habe keine ahnung wo ich anfangen soll. Bis jetzt habe ich die verschiedene routinen die ich brauche (eeprom lesen/schreiben, TWI, AD-wandler ..). Alle aus diesem Forum (Danke schon mal dafür). Nun ich habe keine ahnung wie mein Hauptprogramm aussehen soll. Da fehlt mir jegliche Ansatz. Vielleicht hat einer schon mal sowas ähnliches in C gemacht. Ich wäre ihn für den Code sehr dankbar. Oder ihr könnt mir helfen es selbst zu machen. Danke im voraus.
Sorry!! Die angehängte Datei soll nicht berücksichtigt werden, denn es gehört nicht zu dem Beitrag. sorry!
Patrick N. schrieb: > also hier noch mal das Protokoll zusammengefasst: > > Heizer1 an --> warte 200sek --> heizer1 aus --> AD wandler an wenn daten > vorliegen --> Messdaten im EEPROM des Atmega8 speichern --> über TWI > weiterleiten. > > Heizer2 an --> warte 200sek --> heizer2 aus --> AD wandler an wenn daten > vorliegen --> Messdaten im EEPROM speichern --> über TWI weiterleiten. > > usw... > bis > Heizer8 an --> warte 200sek --> heizer8 aus --> AD wandler an wenn daten > vorliegen --> Messdaten im EEPROM speichern --> über TWI weiterleiten. Bist du dir sicher, dass der Ablauf so laufen soll? Oder soll es nicht eher so sein, dass die 8 Heizelemente voneinander unabhängig ihre Zeitzyklen durchlaufen sollen. D.h. Heizelement 1 soll sein: 8 Sekunden ein, 5 Sekunden aus Element 2 soll sein: 6 Sekunden ein, 3 Sekunden aus Element 3 soll sein: 2 Sekunden ein, 4 Sekunden aus in einem Zeitdiagramm soll das dann so aussehen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
So würde das nämlich mehr Sinn machen. Das was du beschrieben hast, macht nicht viel Sinn, weil die Veränderung des Zeitschemas eines Heizelements die Pausen aller anderen Heizelemente (und damit ihrer abgegebenen Durchschnittsenergie) verändert.
Siehe hier: AVR-GCC-Tutorial
Gast
#2459095
>Ich muss im Rahmen eines Projekts Ach musst du das? Wer ist denn der Projektleiter der gerade dich dazu ausgesucht hat? Warum hat er dich ausgesucht? >Und das ganze soll dann in C implementiert werden. Nur ich habe keine >ahnung wo ich anfangen soll. Wie wäre es mit C lernen? Vergiss dein Projekt solange bis du es geschafft hast eine LED einzuschalten.
Karl Heinz Buchegger schrieb: > Bist du dir sicher, dass der Ablauf so laufen soll? > Oder soll es nicht eher so sein, dass die 8 Heizelemente voneinander > unabhängig ihre Zeitzyklen durchlaufen sollen. Vergiss diese Nachfrage. Nachdem ich dich zb hier Beitrag "3 led mit atmega8" wiedergefunden habe, glaub ich dir deine beschriebene Aufgabenstellung (auch wenn sie nach wie vor, sagen wir mal, "suboptimal" ist) Woran scheitert es denn? (Die Sache mit dem ADC, dem EEPROM und TWI stellst du jetzt erst mal zurück. Es ist sinnlos, wenn du im Moment daran einen Gedanken verschwendest. Du hast noch ganz andere Probleme. Viel grundlegendere.) > Ich wäre ihn für den Code sehr dankbar. Oder ihr könnt mir > helfen es selbst zu machen. Du machst und wenn du konkrete Fragen hast, dann helfen wir. Aber irgendwie werde ich das Gefühl nicht los, dass das eigentlich eine Schulaufgabe ist und du mächtig hinterher hinkst.
Erstmal danke für die schnelle antwort!
>Bist du dir sicher, dass der Ablauf so laufen soll?
Ja genauso soll es laufen erstmal laufen!
Gast
#2459190
Patrick N. schrieb: > Nun ich habe keine ahnung wie mein Hauptprogramm aussehen soll. Dein Hauptprogramm könnte aus einer Initialisierung und einem kleinen Taskmanager bestehen, der die erforderlichen Tasks anstößt. Dazu wäre vielleicht eine Uhr ganz praktisch, die einen Sekundentakt als Basis für die Zeitabläufe bereitstellt.
Hallo Leute! ich habe mir eure Ratschläge zu Herzen genommen und konnte nach sehr viel Anlaufe diesen ersten Code zusammen basteln. Da ich es hardwaremäßig nicht testen kann brauche eure Hilfe. Und zwar meint ihr das es das tut was ich oben beschrieben habe? wie kann ich hier mein Interrupt(der timer1_ovf der eigentlich jede Sekunde die Daten konvertieren soll) auslösen? Danke im voraus Hier ist der code
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
@ Patrick N. (emerand) >Und zwar meint ihr das es das tut was ich oben beschrieben habe? Als Ansatz OK, wenn gleich natürlich mit Raum für Verbesserungen. >wie kann ich hier mein Interrupt(der timer1_ovf der eigentlich jede >Sekunde die Daten konvertieren soll) auslösen? Lies mal was über Timer und Interrupt. MfG Falk
Ich freue mich natürlich auf jede verbesserung! Welche hättest du denn Falk? danke für die schnelle antwort Mfg
Lies mein Posting und die Links darin.
Patrick N. schrieb: > Ich freue mich natürlich auf jede verbesserung! Da gibts schon noch einiges essentielles
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
In einer ISR kümmerst du dich NICHT um cli() und sei(). Das passiert von alleine. Und ganz im Gegenteil, mit einem sei() kannst du dich in Teufels Küche bringen. Weiter: SIGNAL ist veraltet. Benutze den ISR Mechanismus, wie er seit vielen Jahren Standard und auch dokumentiert ist. Weiters: Entweder du liest den ADC in dieser ISR aus (nicht empfehlenswert) oder du machst das in der Hauptschleife. Aber nicht an beiden Stellen! Die ISR 'benachrichtigt' die Hauptschleife, dass es wieder an der Zeit ist eine Messung vorzunehmen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
> wie kann ich hier mein Interrupt(der timer1_ovf der eigentlich > jede Sekunde die Daten konvertieren soll) auslösen? Den brauchst du nicht auslösen. Wenn der Timer seinen Maximalwert erreicht hat, dann löst ER den Interrupt aus. Das passiert also ganz von alleine. Das ist ja (mehr oder weniger) der Sinn von Timern, dass sie Dinge ganz von alleine auslösen können. > Da ich es hardwaremäßig nicht testen kann brauche eure Hilfe. Das musst du abstellen! Testen ist essentiell wichtig bei der Softwareentwicklung. Dein Code ist umfangmässig an der Kippe, an der man zumindest als Neuling schon längst hätte mit Testen anfangen müssen.
Und die beiden Funktionen
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
die löscht du gleich mal mitsamt ihrer Verwendung aus deinem Code raus. Die willst du nicht haben. Du hast Timer und mit denen wird gearbeitet.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.