Guten Abend, ich möchte mit einem AtMega1284P auf dem Pin C7 (PCINT23) ein 1kHz Signal überwachen. Es muss zuverlässig das Signal erkannt und ein Lüfter geschaltet werden. Ist das über einen PinChange Interrupt und einer Interrupt Routine möglich? Wie realisiert man sowas? Ich vermute mal dass ein Timer im Sekundentakt läuft und prüft ob eine Variable 1000x hochgezählt wurde, oder? Diese Variable kann ich dann über den Pinchange Interrupt hochzählen lassen. Ich hab bisher nur mit den "normalen" Interrupts gearbeitet und bin mir daher nicht sicher ob das sauber funktioniert. Vielen Dank für eure Hinweise. Gruß Matthias
Ja, möglich ist das. Aber mach den Ansatz nicht so kompliziert, dann wird auch die Lösung nicht so fehleranfällig! Wenn du schon den PinChange Interrupt mit 1 kHz triggerst, was soll da ein Timer im Sekundentakt für die Genauigkeit beitragen? Bisher ist für den Leser deiner Anfrage nicht zu erkennen, was die 1 kHz mit dem Lüfter zu tun haben: Unter welcher Bedingung soll er denn zuverlässig an-, oder ausgeschaltet werden??? Ich nehme an: Dein Problem ist pillepalle, dein Lösungsansatz ultra-umständlich. - Kann ich aber auch falsch verstanden haben... Also erklär dich genauer!
Ich habe einen IC der ein 1KHz Signal erzeugt wenn es ihm zu heiß wird. Da ich sowieso schon einen µC mit auf der Platine habe ist es naheliegend diesen auch zu verwenden. Dabei ist eben der besagte Pin PC7 noch frei. Ich möchte das 1KHz Signal auswerten und falles es anliegt einen Lüfter schalten. Dieser Lüfter soll aber noch einige Zeit nachlaufen wenn das 1KHz Signal erlischt. Das zu überwachende Signal kennt 3 Zustände: - Low - High (3,3V) - 1KHz Gruß Matthias
Wenn ich das richtig verstanden hab, dann wäre das kein Problem. Blöd ist halt, dass du dann immer per software deinen counter um 1 erhöhen musst, was gelegentlich auch ungenau sein könnte. Der PCINT reagiert auf jede Änderung am Pin, dh am Ende der Sekunde sollte in deinem Counter 2000 stehen. Doch es wäre möglich, dass ein Change verloren geht, wenn zB grad eine andere Interrupt-Routine ausgeführt wird, welche länger als 1ms dauert. Darum Frage: Benötigst du den Timer1 (16bit) oder PB1? Denn dann könntest du einfach den Counter von T1 hochzählen lassen, also reine Hardwaresache, und am Ende der Sekunde einfach den Wert auslesen und wieder Nullen. lg Llemaban
Llemaban schrieb: > Benötigst du den Timer1 (16bit) oder PB1? T1 (PB1) könnte ich in der Tat auch verwenden!! Müsste ich halt nochmal etwas anders routen aber da das Board eh noch nicht fertig ist... :) Sprich Timer1 kann direkt über den Pin PB1 gesteuert werden? Wie funktioniert dann die Ansteuerung des Mosfets für den Lüfter? Ich muss ja aus dem Timer1 den entsprechenden Pin auf High schalten... Danke schon mal Gruß Matthias
Llemaban schrieb: > Doch es wäre möglich, dass ein Change verloren geht, wenn > zB grad eine andere Interrupt-Routine ausgeführt wird Matthias M. schrieb: > - Low > - High (3,3V) > - 1KHz Meine Güte, es gibt 3 Zustände. Einer davon ist 1KHz Gewackel. Wahrscheinlich nicht einmal quarzstabil. Da ist es völlig egal, ob der mit 980 oder 1020 Hz schwingt. Und daß ein IRQ verschluckt werden kann, ist ein grundsätzliches Problem jeder Software, die mehr als einen Interrupt zu verarbeiten hat. Aber in diesem Falle scheint das noch nicht einmal tragisch zu sein. Trotzdem hat man natürlich dafür zu sorgen, daß sowas nicht auftritt. Aber es ist bestimmt kein Grund, von der Verwendung eines 0,5ms- IRQs abzuraten oder Panik zu verbreiten. Denn sowas ist Pillepalle. Matthias M. schrieb: > Wie realisiert man sowas? Ich vermute mal dass ein Timer im Sekundentakt > läuft und prüft ob eine Variable 1000x hochgezählt wurde, oder? Diese > Variable kann ich dann über den Pinchange Interrupt hochzählen lassen. Ja, genau so kannst du das machen. Aber bau da eine Toleranz von sagen wir mal +/-50 ein. Und denk dran, das ist schon richtig, was oben gesagt wurde: Der Pinchange kommt bei jedem Flankenwechsel. Bei 1Khz zählt er in 1s also bis 2000. Matthias M. schrieb: > T1 (PB1) könnte ich in der Tat auch verwenden!! Müsste ich halt nochmal > etwas anders routen aber da das Board eh noch nicht fertig ist... :) T1 alleine nützt dir gar nichts. Damit kann die Hardware den Takt zählen. Beim Pinchange brauchst du ein bißchen Software dafür. Vergleichen mit einem anderen Timer als Zeitbasis mußt du es aber trotzdem.
:
Bearbeitet durch User
Wenn ich mich nicht versehen hab, ist an PB1 auch der T1. Du kannst ja die Clocksource für die Timer wählen. Nun setzt du nicht den internen Oszillator (oder welchen auch immer) an als clocksource , sondern T1 (der an PB1 ligt, -> PB1 als Eingang einstellen)
1 | TCCR1B |= (1<<CS12) | (1<<CS11) | (1<<CS10); //External clock source on Tn pin. Clock on rising edge |
oder:
1 | TCCR1B |= (1<<CS12) | (1<<CS11); //External clock source on Tn pin. Clock on faling edge |
Vorausgesetzt natürlich, du benötigst den Timer/Counter1 nicht für das Ansteuern des Lüfters. Wenn doch, dann probier den über den Timer/Counter0 laufen zu lassen oder das ganze Zählen des 1kHz nicht mit Timer/Counter1 sondern mit Timer/Counter3 zu machen (geht aber nur mit dem ATMega1284!). Nun zählt das Register TCNT1 (oder eben TCNT3) pro Puls um eins hoch. Nach einer Sekunde liest du den Wert aus und setzt das Register TCNT1 (oder TCNT3) wieder auf Null. lg Llemaban ...Aber Thomas hat recht, irgendwo muss noch eine Referenz her kommen, die dir sagt, wann 1s vorbei ist, und da dein Counter sowieso nicht genau sein muss, kannst du dir das oben geschriebene von mir schneknen und den PinChange nehmen und dafür den Timer/Counter1 (oder 3) zum zählen für die 1s nehmen ;)
Das Ding hat 3 Zustände: - Low da will es weiß nicht was - High (3,3V) da will es weiß nicht was - 1KHz da will es Lüftung Was ist denn nun bei Low, oder High??? - Also werden Voraussetzungen für die Suche nach einer Lösung entweder geheim gehalten, oder nicht erkannt. Ich sag doch: Problem = Pillepalle, Lösungsansatz = Sau-kompliziert Voraussetzungen = Werden streng geheim gehalten Erfolg = Nicht absehbar... Vermutung: Bei Lo, oder Hi (????) braucht das Ding unbedingt Luft, also reicht trulliges Polling nach Lo, oder Hi, um den Lüfter bedarfsgerecht einzuschalten... Oder auch nicht... Oder andersrum... Werde langsam müde!
Matthias M. schrieb: > Ich habe einen IC der ein 1KHz Signal erzeugt wenn es ihm zu heiß wird. Und sonst?
Genau so gut kann man bei einer ankommenden Flanke den Abstand zur letzten messen. Man notiert den Stand eines schnell genug durchlaufenden Timers und vergleicht diesen mit dem zuvor notierten Wert. Oder man nimmt halt einen Input-Capture-Pin für das 1khz-Signal, dann hat man dasselbe. Pillepalle halt ;-).
Und wenn der Chip kalt ist, liegt der Pin immer auf low? Warum dann nicht einfach so: Du lässt deine Lüfternachlaufzeit bei einem high am Pin immer von 0 an beginnen und schaltest den Lüfter ein. Die Nachlaufzeit zählt, wenn der Lüfter läuft, mit einem Timer hoch. Wenn die Nachlaufzeit abgelaufen ist, schaltest du den Lüfter aus.
hp-freund schrieb: > RC-Glied -> ADC -> auswerten Vielleicht findet ja jemand eine noch kompliziertere Lösung?
statt schwierig, einfach. Das Signal vom zu warmen uC triggert einen NE555, der dann einen definierten Zeitraum ein Ausgangssignal liefert->Lüfter an https://m8051.blogspot.de/2013/02/retriggerable-555-timing-circuit.html Kann mir auch einen OpAmp als Komparator vorstellen, der einen FET für den Lüfter ansteuert, mit einem Kondensator und Entladewiderstand zwischengeschaltet als Zeitpuffer. Alles darüber hinaus ist komplexer, aber machbar.
Warum die Pulse eigentlich Zählen? Es würde doch schon ein PinChange genügen. Mit jedem PinChange schaltet man den Lüfter ein, setzt den Timer zurrück zum ausschalten und startet ihn. Könnte also so aussehen:
1 | ISR(PCINT2_vect){ |
2 | PORTB |= (1 << PB0); |
3 | TCCR1B |= ((1 << CS12)|(1 << CS11)|(1 <<CS10)); |
4 | TCNT1 = 1; |
5 | }
|
6 | ISR(TIMER1_OVF_vect){ |
7 | PORTB &= (1 << PB0); |
8 | TCCR1B &= ((1 << CS12)|(1 << CS11)|(1 <<CS10)); |
9 | }
|
Ich hab nicht ins Datenblatt des Atmega1284p geschaut, ggf müssen Registernamen angepasst werden. Verfeinerungen überlasse ich anderen (habe z.B. den Lüfter an PB0 angenommen) aber so könnte man IMO den Lüfter starten und geraume Zeit nachlaufen lassen wenn das 1 kHz Signal wieder verschwindet.
:
Bearbeitet durch User
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.