Forum: Mikrocontroller und Digitale Elektronik 1kHz Signal mit PinChange Interrupt auswerten?


von Matthias (matthiasm)


Lesenswert?

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

von Jacko (Gast)


Lesenswert?

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!

von Matthias (matthiasm)


Lesenswert?

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

von Llemaban (Gast)


Lesenswert?

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

von Matthias (matthiasm)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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
von Llemaban (Gast)


Lesenswert?

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 ;)

von Jacko (Gast)


Lesenswert?

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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matthias M. schrieb:
> Ich habe einen IC der ein 1KHz Signal erzeugt wenn es ihm zu heiß wird.
Und sonst?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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 ;-).

von MaWin (Gast)


Lesenswert?

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.

von hp-freund (Gast)


Lesenswert?

RC-Glied -> ADC -> auswerten

von MaWin (Gast)


Lesenswert?

hp-freund schrieb:
> RC-Glied -> ADC -> auswerten

Vielleicht findet ja jemand eine noch kompliziertere Lösung?

von 555 (Gast)


Lesenswert?

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.

von M. K. (sylaina)


Lesenswert?

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
Noch kein Account? Hier anmelden.