Hallo!
Also, mal zur Vorgeschichte. Bei meinem neusten Projekt gibt es einige
unterschiedliche Impulse, welche alle die nötige Aufmerksamkeit haben
wollen^^ :D! Zwei der Drei Impulse stehen für Leistungen (el. & th).
Diese beiden Impulse haben jeweils ein fmax von 4kHz und 200Hz. Für den
Impuls mit bis zu 4kHz verwende ich den ICP Eingang und für den
langsameren Impuls den externen Interrupt 1. Diese Impulse dürfen aber
nur während der Sekunde 5 bis 55 gemessen werden. Die Anzahl der Impulse
steht dann für die Leistung (el: 1000Hz = 100kW; th: 10Hz = 100kW). Das
Ergebnis soll dann in ein PWM Signal umgerechnet werden welches einen
Servo ansteuern soll. Der Servo ist mit einem Laser verbunden welcher
auf eine Skala leuchtet die auf der Wand aufgebracht ist. Somit kann
jeder sehen wie viel elektrische Leistung und wie viel thermische
Leistung gerade benötigt wird. Das ist ein Projekt in meiner alten
Schule und soll zum denken anregen. Den Schülern soll bewusst werden wie
hoch der Verbrauch einer solchen Einrichtung ist und eventuell doch das
Licht ausschalten wenn die Klasse verlassen wird.
Der dritte Impuls tritt jede Minute am Anfang auf. Ist also der
Indikator für eine "neue" Minute. Die Impulsdauer beträgt 1.5 Sekunden.
Um Mitternacht ist der Impuls 57 Sekunden lang. Diese können also sehr
gut für die Synchronisation verwendet werden.
Jetzt frag ich mich wie ich diesen dritten Impuls messen kann und vor
allem die Länge des Impulses. Ich verwende bereits den 16- Bit Timer1
des Controller zur Generierung von zwei PWM Signalen und als ICP. Ich
denke also, dass dieser ausgelastet ist^^.
Mal sehen was ihr so denkt :).
MfG,
JTR
@ Julian Schild (jaytharevo)
>Diese beiden Impulse haben jeweils ein fmax von 4kHz und 200Hz.
Naja, mittelschnell würde ich mal sagen.
> Für den>Impuls mit bis zu 4kHz verwende ich den ICP Eingang und für den>langsameren Impuls den externen Interrupt 1.
Kann man machen.
> Diese Impulse dürfen aber>nur während der Sekunde 5 bis 55 gemessen werden. Die Anzahl der Impulse>Der dritte Impuls tritt jede Minute am Anfang auf. Ist also der>Indikator für eine "neue" Minute. Die Impulsdauer beträgt 1.5 Sekunden.
Eine Ewigkeit.
>Jetzt frag ich mich wie ich diesen dritten Impuls messen kann
Mit einem Timer-[Interrupt]] von sagen wir 100ms, da kann man auch
die Länge problemlos messen.
>allem die Länge des Impulses. Ich verwende bereits den 16- Bit Timer1>des Controller zur Generierung von zwei PWM Signalen und als ICP. Ich>denke also, dass dieser ausgelastet ist^^.
Du hast noch mindestens 1 Timer mehr, meisten zwei.
MFG
Falk
Vorweg. Der Controller soll mit 2Mhz laufen. Intern getaktet.
Falk Brunner schrieb:>>Diese beiden Impulse haben jeweils ein fmax von 4kHz und 200Hz.>> Naja, mittelschnell würde ich mal sagen.
Jap, also ich denk, dass das nicht zu schnell sein wird.
>>Der dritte Impuls tritt jede Minute am Anfang auf. Ist also der>>Indikator für eine "neue" Minute. Die Impulsdauer beträgt 1.5 Sekunden.> Eine Ewigkeit.
Ist klar.
>>Jetzt frag ich mich wie ich diesen dritten Impuls messen kann>> Mit einem Timer-[Interrupt]] von sagen wir 100ms, da kann man auch> die Länge problemlos messen.>>allem die Länge des Impulses. Ich verwende bereits den 16- Bit Timer1>>des Controller zur Generierung von zwei PWM Signalen und als ICP. Ich>>denke also, dass dieser ausgelastet ist^^.>> Du hast noch mindestens 1 Timer mehr, meisten zwei.
Also. Da ich ja die Zeit genau messen muss verwende ich zusätzlich
Timer0. Um eben sagen zu können wann sich der Controller zwischen der
Sekunde 5 und 55 befindet.
Der Läuft mit Prescaler 8. Somit erziele ich sehr präzise 1ms. Der muss
einfach sehr genau sein, sonst kommt am Ende vom Tag nur mehr Käse bei
raus^^.
Also soll ich jetzt noch einen dritten Timer laufen lassen (Timer2),
ebenfalls mit 1ms Overflow? 100ms wird sich nicht ausgehen, hätte da
0,16% Error.
Ich mach mir langsam über das Interrupthandling sorgen. Ich habe noch
keine Erfahrung mit so "vielen" versch. Interrupts (ca. 5).
Danke für deine Antwort. Schön das ich dich "gewinnen" konnte Falk! :D
MfG
@Julian Schild (jaytharevo)
>Vorweg. Der Controller soll mit 2Mhz laufen. Intern getaktet.>Also. Da ich ja die Zeit genau messen muss verwende ich zusätzlich>Timer0.
Schön, aber so eine Uhr mach der AVR nebenbei beim Einschlafen. Man kann
die Uhr + Abtastung des 3. Impulse locker dort drin machen.
>Der Läuft mit Prescaler 8. Somit erziele ich sehr präzise 1ms. Der muss>einfach sehr genau sein, sonst kommt am Ende vom Tag nur mehr Käse bei>raus^^.
Das kommt es sowiso, wenn du mit dem internen RC-Oszillator arbeitest
und nicht oft synchronisierst. Das musst du, wenn es funktionieren soll,
jede Minute machen.
>Also soll ich jetzt noch einen dritten Timer laufen lassen (Timer2),>ebenfalls mit 1ms Overflow?
Nö, ein Timer reicht dafür locker.
> 100ms wird sich nicht ausgehen, hätte da 0,16% Error.
Ja und? Für diese Messung ist das mehr als genau genug. Du musst ja
zwischen 1,5 und 57s unterschieden können ;-)
>Ich mach mir langsam über das Interrupthandling sorgen. Ich habe noch>keine Erfahrung mit so "vielen" versch. Interrupts (ca. 5).
Es sind gerade mal drei. ICP, INT0 un der Timer. ICP und Timer sind
vollkommen unkritisch, INT0 könnte durch die zwei anderen etwas gestört
werden. Aber auch hier ist es kein Problem. Nimm einen externen Zähler
ala 74HC4040 oder so und teile deine 200 Hz durch 64 oder mehr, da
kommen so um die 3Hz raus. Die kannst du dann deutlich einfacher messen.
Die Frequenz wird ja linear geteilt.
MFG
Falk
>Danke für deine Antwort. Schön das ich dich "gewinnen" konnte Falk! :D
Hab ich ein Preisausschreiben verpasst? ;-)
Wenn ich das richtig verstanden habe, kommt dein Zeitimpuls immer in
Sekunde Null und die Messungen finden in Sekunde 5 bis 55 statt. Du
könntest den Zeitimpuls auf einen Int-Pin legen, nach 2,5 Sekunden oder
so nochmal nachsehen, ob ein noch da ist -> Tagessignal und die anderen
Interrupts nur von Sekunde 5 bis 55 aktivieren, da kann sich dann auch
nichts mehr in die Quere kommen. Da es wohl nur 1,5 Sekunden oder
57Sekunden Impuls gibt, musst du nichts messen, nur unterscheiden, bzw.
den 24h-Impuls erkennen. Wenn du den Prozessor ab Sekunde 55 nur noch
auf den Zeit-Impuls wartest, sollte der auch immer Taktgenau den
Interrupt auslösen zum Synchronisieren.
Mark
Falk Brunner schrieb:>>Vorweg. Der Controller soll mit 2Mhz laufen. Intern getaktet.>>>Also. Da ich ja die Zeit genau messen muss verwende ich zusätzlich>>Timer0.>> Schön, aber so eine Uhr mach der AVR nebenbei beim Einschlafen. Man kann> die Uhr + Abtastung des 3. Impulse locker dort drin machen.
Ja, wird wohl am besten sein.
>>Der Läuft mit Prescaler 8. Somit erziele ich sehr präzise 1ms. Der muss>>einfach sehr genau sein, sonst kommt am Ende vom Tag nur mehr Käse bei>>raus^^.>> Das kommt es sowiso, wenn du mit dem internen RC-Oszillator arbeitest> und nicht oft synchronisierst. Das musst du, wenn es funktionieren soll,> jede Minute machen.
Was für eine Genauigkeit kann ich denn erwarten?
>>Ich mach mir langsam über das Interrupthandling sorgen. Ich habe noch>>keine Erfahrung mit so "vielen" versch. Interrupts (ca. 5).>> Es sind gerade mal drei. ICP, INT0 un der Timer. ICP und Timer sind> vollkommen unkritisch, INT0 könnte durch die zwei anderen etwas gestört> werden.
Es kommt noch der Overflow Interrupt durch den Timer1 im CTC Modus hinzu
(PWM Erzeugung).
Aber auch hier ist es kein Problem. Nimm einen externen Zähler
> ala 74HC4040 oder so und teile deine 200 Hz durch 64 oder mehr, da> kommen so um die 3Hz raus. Die kannst du dann deutlich einfacher messen.> Die Frequenz wird ja linear geteilt.
Naja, wenn, dann sollte es wohl das 4kHz Signal sein oder? Mhm ich
hoffe, dass ich da keine Timing Probleme haben werde.
Was ich eigentlich noch fragen wollte war ja an welchem Pin ich, dass
messen könnte. Aber ich denke ich werds so machen: Einen externen Int.
hab ich ja noch frei. Bei rising Edge werd ich anfangen zu zählen und
den ext. Interrupt auf falling Edge umstellen. Sollte dann die falling
Edge kommen werd ich einfach den Zählerstand auslesen und schaun wie
weit er gezählt hat. Da mein Timer0 mir sowieso im ms Bereich eine
Variable hochzählt kann ich die bequem verwenden. Denk so werd ich es
machen. :)
Danke!
>>>Danke für deine Antwort. Schön das ich dich "gewinnen" konnte Falk! :D>> Hab ich ein Preisausschreiben verpasst? ;-)
Du wirst dich nicht mehr erinner, aber du hast meine "Diplomarbeit" mit
einer 3- benotet. Ist jetzt ca. ein halbes Jahr her :). [arschkrichen =
on] Deine dirkete Art hat mir dabei geholfen mein Projekt erfolgreich
abzuschließen :) [/arschkriechen]
MfG
@Julian Schild (jaytharevo)
>> Das kommt es sowiso, wenn du mit dem internen RC-Oszillator arbeitest>> und nicht oft synchronisierst. Das musst du, wenn es funktionieren soll,>> jede Minute machen.>Was für eine Genauigkeit kann ich denn erwarten?
1%, wenn die Temperatur nicht mehr als +/-10K schwankt. Siehe
Datenblatt.
>Es kommt noch der Overflow Interrupt durch den Timer1 im CTC Modus hinzu>(PWM Erzeugung).
Nein, den brauchst du nicht.
>Naja, wenn, dann sollte es wohl das 4kHz Signal sein oder?
Muss nicht sein. ICP entlastet dich da schon sehr.
>Du wirst dich nicht mehr erinner, aber du hast meine "Diplomarbeit" mit>einer 3- benotet. Ist jetzt ca. ein halbes Jahr her :). [arschkrichen =>on] Deine dirkete Art hat mir dabei geholfen mein Projekt erfolgreich>abzuschließen :) [/arschkriechen]
Hmm, ich erinnere mich dunkel. Und welche Note hat man dir gegeben?
MFg
Falk
Ich hänge mal das Programm + Include an. Es ist noch lange nicht fertig,
also bitte keine voreiligen Schlüsse.
Hier hab ich auch gleich eine Frage zur geschickten Realisierung.
Also, ich will ja den Minuten- Impuls mit dem ext. Interrupt erfassen,
weiters will ich dessen Zeit bestimmen. Also setze ich ein Flag in der
ISR um im Main zu signalisieren, dass die erste Flanke angekommen ist.
In der Main, dann speichere ich mir den aktuellen Sekundenstand und
ändere die Triggerung des ext. Int. auf falling edge. Jetzt, frag ich
mich was ich in der Zwischenzeit tun soll. Einen neuen State in der
Statemachine oder zusätzlich eine Variable welche mir die Durchgänge
signalisiert oder, dass ich nach 3 Sekunden wieder nachschaue ob der H-
Pegel immer noch anliegt.
1
caseSynchronise:
2
3
if(Flag_m)
4
{
5
Second_tmp=Second;
6
Flag_m=False;
7
MCUCR^=(1<<ISC00);// Toggle Edgetrigger for measuring the pulse duration
8
}
9
10
break;
Wenn ich in dem State bleib, dann würd ich beim nächsten Durchlauf den
temporär gespeicherten Sekundenzähler wieder überschreiben. Fragen über
fragen. Ich hänge da irgendwie :(.
@Mark.L:
Danke für deinen Input. Sry, habe deinen Beitrag nicht gleich gesehen
weil du gleichzeitig geschrieben hast wie ich :). Ist ne super Idee.
Werd ich einbauen. Danke.
Falk Brunner schrieb:>>Was für eine Genauigkeit kann ich denn erwarten?>> 1%, wenn die Temperatur nicht mehr als +/-10K schwankt. Siehe> Datenblatt.
Also Temp. wird meiner Meinung nach kaum schwanken. Genaueres kann ich
leider noch nicht sagen. Hab mich da auch schon ein wenig im Datenblatt
eingelesen, also gehts hier um ein Calibration Bit. Müsste ich für die
richtige Einstellung der Frequenz nicht herausfinden wie der Takt
momentan ausschaut? Damit ich weiß ob ich nach unten oder oben
korrigieren muss.
>>Es kommt noch der Overflow Interrupt durch den Timer1 im CTC Modus hinzu>>(PWM Erzeugung).>> Nein, den brauchst du nicht.
Hast du recht. Mein Timer1 läuft im "Compare Output Mode, Fast PWM (TOP
= ICR1)". WGM13:0 =14. Hier auch noch der Code dazu. Vllt findet jemand
ja einen Fehler bzw. Verbesserungen, würd mich freuen :):
1
voidTimer1_init(void)
2
{
3
// Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM
>>Naja, wenn, dann sollte es wohl das 4kHz Signal sein oder?> Muss nicht sein. ICP entlastet dich da schon sehr.
Also könnten 200Hz für den ext. Interrupt ein Problem werden?
> Hmm, ich erinnere mich dunkel. Und welche Note hat man dir gegeben?Beitrag "Stromsparen und Atmega8?"
Ich bekam eine 1. Es ging hier aber nicht alleine um das Programm.
Zusätzlich kam noch eine 160- seitige Dokumentation und eine Prüfung
hinzu.
FALLS es dich interessiert kann ich dir ja das PDF (~7MB) schicken. Dann
kannst meine Note ja immer noch nach unten korrigieren^^ xD.
MfG,
Julian
@ Julian Schild (jaytharevo)
>Also, ich will ja den Minuten- Impuls mit dem ext. Interrupt erfassen,
Du bist schon wieder lernresistent. :-(
Taste den Puls in einem 100ms Timerinterrupt ab, fertig.
>ändere die Triggerung des ext. Int. auf falling edge. Jetzt, frag ich>mich was ich in der Zwischenzeit tun soll. Einen neuen State in der>Statemachine
ja.
>eingelesen, also gehts hier um ein Calibration Bit.
Byte.
> Müsste ich für die>richtige Einstellung der Frequenz nicht herausfinden wie der Takt>momentan ausschaut?
Nur, wenn du eine andere Betriebspannung oder Temperatur nutzt. Siehe
Datenblatt. Die abgelegte Kalibrierung ist meist für 5V/20°C.
>Also könnten 200Hz für den ext. Interrupt ein Problem werden?
Allein nicht, aber wenn noch andere Interrupts laufen. Die können dann
die Ausführung verzögern und deine Zeitmessung damit negativ
beeinflussen.
Aber das kann man alles lösen. Nämlich indem man einen Timer als Zähler
betreibt und die Pulse zählt. Das entspannt die Sache.
>Beitrag "Stromsparen und Atmega8?"
Link?
Beitrag "Stromsparen und Atmega8?">Ich bekam eine 1. Es ging hier aber nicht alleine um das Programm.>Zusätzlich kam noch eine 160- seitige Dokumentation
Aha, also eher Fleiss als Denkleistung. Naja.
>FALLS es dich interessiert kann ich dir ja das PDF (~7MB) schicken. Dann>kannst meine Note ja immer noch nach unten korrigieren^^ xD.
Ne lass mal, ich bin nicht in der Prüfungskommission. Ausserdem wirst du
bald merken, dass im wahren Leben (tm) andere Masstäbe gelten.
MFG
Falk
Hey!
Bin gerade auf etwas gestoßen, das zum Problem werden könnte.
Und zwar ist im WGM Mode 14 ja ICR1 als TOP value angegeben. Das Problem
ist jetzt, dass wenn ich die ICP funktion verwenden will ich ICR1 nicht
als TOP value verwenden kann. Ich müsste also OCR1A nützen, dadurch geht
mir aber eines der Compare Register verloren und somit ein PWM Channel.
Was kann ich da jetzt machen?
Falk Brunner schrieb:
> Ne lass mal, ich bin nicht in der Prüfungskommission. Ausserdem wirst du> bald merken, dass im wahren Leben (tm) andere Masstäbe gelten.
Na, das hoff ich doch!
Falk Brunner schrieb:
> Nämlich indem man einen Timer als Zähler> betreibt und die Pulse zählt. Das entspannt die Sache.
Meinst du als "External Event Counter"? Könntest du, das ein wenig
genauer ausführen? Das Datenblatt schweigt sich darüber aus :(. Meinst
doch nicht ICP oder?
Scheint so als ob ich ein größeres Problem hab oO?!
Ich hab mir schon überlegt ob ich nicht den ersten Impuls (4kHz) an
einen der ext. Interrupts lege und wie von Falk vorgeschlagen den
Minutenimpuls einfach per Polling abfrage.
Einen der PWM Channel kann ich schwer auslagern ohne viel Auflösung zu
verlieren.
Was meint ihr? Was wäre am geschicktersten?
MfG,
Julian