Hallo,
ich erweitere gerade ein altes Projekt "Funk-Temperatur-Datenlogger" um einen Regensensor.
Wenn die Wasserwaage kippt dann schaltet ein Reedkontakt und diese Schaltvorgänge werden gezählt.
Das Problem ist, dass Schaltvorgänge erkannt werden die es gar nicht gibt. Hierbei meine ich nicht eventuelles prellen.
Die Kippwaage steht im Büro, die Waage ist demontiert, der Magnet ist weit weg vom Reedschalter, trotz allem werden immer wieder
Impulse gezählt.
Meine erste Vermutung war, dass eventuell der interne Pullup defekt ist. Deshalb habe ich extern einen Pullup von 10k gegen V+ geschaltet.
Das brachte keine Verbesserung.
Die Schaltung ist so:
V+ -------Widerstand 10K -----------------------I
I
I
Gnd ------Widerstand 1K----I--Reedkontakt - I----- Eingang PD3
I I
I-------II----------- I
Tantal
Der Widerstand 1 K und der Tantal Kondensator sind Bestandteil der alten vorhandenen Kippwaage
Testweise auf einen anderen Interrupt wechseln kann ich nicht, da InT0 für den Funk zuständig ist.
Während der Regensensor Interrupt eintrifft ist der Controller in der For -Schleife "Schlafzeit" (siehe nachfolgender Code-Ausschnitt)
Um den Batterieverbrauch zu optimieren wird der Controller 15 Minuten schlafen gelegt.
Da ich keine so lange Zeit per Timer realisieren konnte wird mit Timer 2 ein 1/4 Sekunden Interrupt generiert.
D.h. der Controller geht 3520 mal für jeweils 1/4 Sekunde schlafen.
Vielleicht geht das besser aber ich habe hierfür keine andere Lösung gefunden.
Ich bin grad etwas ratlos, was ich noch machen kann um den Fehler zu finden .
Aber vielleicht hat ja noch jemand eine Idee.
Danke im Voraus
Const Timer_preload = 11 'Timervorgabe für 1/4 Sekunden Takt (Timer2 8 Bit)
Config Timer2 = Timer , Prescale = 1024
On Timer2 ISR_Sectic
Timer2 = Timer_preload
Enable Timer2
Enable Interrupts
For Schlafzeit = 1 To Schlafintervall
Config Powermode = Powersave '= 3520 1/4 Sekunden
Next
$regfile = "m328pdef.dat"
$framesize = 32
$swstack = 100
$hwstack = 64
$crystal = 1000000 'Quarzfrequenz
'Achtung Fuse Bits sind so gesetzt.
'Intern RC 8 MHZ, Teiler durch 8 ist eingeschaltet: Also 1 MHZ
'E/A Belegung Register B
' |--------PD7 (1Wire Kommunikation)
' ||-------PD6 (PCInt22) Test LED2 (später wieder Eingang mit Pullup !)
' |||------PD5 (PCInt21) Test LED1 (später wieder Eingang mit Pullup !)
' ||||-----PD4 (PCInt20 schaltet T2
' |||||----PD3 (PCINT19) INT1 (Regensensor)
' ||||||---PD2 (Int0 IRQ Funkmodul)
' |||||||--PD1 (TxD)
' ||||||||-PD0 (RxD)
DdrD = &B01110011 '0 = Eingang 1 = Ausgang
PortD = &B00001000 '1 = Pullup bei Eingang
'----------------------------------Regensensor Interrupt---------------------------------------
Config Int1 = Falling '
Enable Interrupts 'Einschalten der Interrupts
Enable Int1 'Einschalten Interrupt Int1
On Int1 ISR_Regensensor
Isr_Regensensor:
Kippanzahl = Kippanzahl + 1
Toggle LED_Regensensor
Print "Kp=";Kippanzahl
Return
'---------------------------------------------------------------------------------------------
ich erweitere gerade ein altes Projekt "Funk-Temperatur-Datenlogger" um einen Regensensor.
Wenn die Wasserwaage kippt dann schaltet ein Reedkontakt und diese Schaltvorgänge werden gezählt.
Das Problem ist, dass Schaltvorgänge erkannt werden die es gar nicht gibt. Hierbei meine ich nicht eventuelles prellen.
Die Kippwaage steht im Büro, die Waage ist demontiert, der Magnet ist weit weg vom Reedschalter, trotz allem werden immer wieder
Impulse gezählt.
Meine erste Vermutung war, dass eventuell der interne Pullup defekt ist. Deshalb habe ich extern einen Pullup von 10k gegen V+ geschaltet.
Das brachte keine Verbesserung.
Die Schaltung ist so:
V+ -------Widerstand 10K -----------------------I
I
I
Gnd ------Widerstand 1K----I--Reedkontakt - I----- Eingang PD3
I I
I-------II----------- I
Tantal
Der Widerstand 1 K und der Tantal Kondensator sind Bestandteil der alten vorhandenen Kippwaage
Testweise auf einen anderen Interrupt wechseln kann ich nicht, da InT0 für den Funk zuständig ist.
Während der Regensensor Interrupt eintrifft ist der Controller in der For -Schleife "Schlafzeit" (siehe nachfolgender Code-Ausschnitt)
Um den Batterieverbrauch zu optimieren wird der Controller 15 Minuten schlafen gelegt.
Da ich keine so lange Zeit per Timer realisieren konnte wird mit Timer 2 ein 1/4 Sekunden Interrupt generiert.
D.h. der Controller geht 3520 mal für jeweils 1/4 Sekunde schlafen.
Vielleicht geht das besser aber ich habe hierfür keine andere Lösung gefunden.
Ich bin grad etwas ratlos, was ich noch machen kann um den Fehler zu finden .
Aber vielleicht hat ja noch jemand eine Idee.
Danke im Voraus
Const Timer_preload = 11 'Timervorgabe für 1/4 Sekunden Takt (Timer2 8 Bit)
Config Timer2 = Timer , Prescale = 1024
On Timer2 ISR_Sectic
Timer2 = Timer_preload
Enable Timer2
Enable Interrupts
For Schlafzeit = 1 To Schlafintervall
Config Powermode = Powersave '= 3520 1/4 Sekunden
Next
$regfile = "m328pdef.dat"
$framesize = 32
$swstack = 100
$hwstack = 64
$crystal = 1000000 'Quarzfrequenz
'Achtung Fuse Bits sind so gesetzt.
'Intern RC 8 MHZ, Teiler durch 8 ist eingeschaltet: Also 1 MHZ
'E/A Belegung Register B
' |--------PD7 (1Wire Kommunikation)
' ||-------PD6 (PCInt22) Test LED2 (später wieder Eingang mit Pullup !)
' |||------PD5 (PCInt21) Test LED1 (später wieder Eingang mit Pullup !)
' ||||-----PD4 (PCInt20 schaltet T2
' |||||----PD3 (PCINT19) INT1 (Regensensor)
' ||||||---PD2 (Int0 IRQ Funkmodul)
' |||||||--PD1 (TxD)
' ||||||||-PD0 (RxD)
DdrD = &B01110011 '0 = Eingang 1 = Ausgang
PortD = &B00001000 '1 = Pullup bei Eingang
'----------------------------------Regensensor Interrupt---------------------------------------
Config Int1 = Falling '
Enable Interrupts 'Einschalten der Interrupts
Enable Int1 'Einschalten Interrupt Int1
On Int1 ISR_Regensensor
Isr_Regensensor:
Kippanzahl = Kippanzahl + 1
Toggle LED_Regensensor
Print "Kp=";Kippanzahl
Return
'---------------------------------------------------------------------------------------------
Komisch:Dauernd hängt sich mein Rechner auf, meine Wäsche macht das nie