Regnmätare med fel...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Regnmätare med fel...

Inlägg av erikbrannlund »

Hej!

Igår köpte jag en regnmätare hos Clas i sjön, en modell "gungbräda" som visar ~0.5 mm per "gungning". Kopplade in den mot min AVR enligt följande. Från 5V ett motstånd på 10k till ena benet på "classe mätaren". Andra benet på "mätaren" till jord. PINC2 till mötet mellan motsåndet och "mätaren". Initierade interrupt enligt följande.

Kod: Markera allt

   PCMSK2   = 2;//(1<<PCINT17); 
   PCICR   = (1<<PCIE2);
Och så här ser interruptet ut.

Kod: Markera allt

ISR(PCINT2_vect) 
{ 
   cli(); 
   if (PINC & 2)
   {
     rain_count++;
   }    

   sei(); 
}
Först trodde jag att allt fungerade jag vippade på "brädan" och programmet räknade upp. Sen gick jag i väg och gjorde annat och kom tillbaka och enligt mitt program hade det regnat mer än hundra millimeter fast det var uppehåll. Då kopplade jag en konding mellan mätpunkten och AVR:en men den fortsätter att räkna regn trots uppehåll.

Har jag hjärnblödning eller?

/Erik

P.S
Jag har en Mega644
D.S
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

cli() och sei()..... vad gör de?

Om de betyder Clear Interrupt hhv. Set Interrupt är du på helt fel spår!

En interrupt får bara i mycket speciella fall ha liknande funktioner i sig!!!
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

Inlägg av syltkaka »

Ser inte riktigt uppkopplingen framför mig.

Har du pull-up på PC2? Har du inte det så har pinnen ingen definierad nivå. Du behöver inte skriva cli() och sei() i ISR eftersom I-flaggan automatiskt nollställs och ettställs av hårdvaran.
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

5V
|
| |
| | 10k
| |
|
|----------- till AVR
|
|
|
| "bräda"
|------------ / -----------|
|
-----
---
-
Hoppas att ASCII kopplingsschemat går att förstå!
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

Kod: Markera allt

      5V 
       | 
      | | 
      | | 10k 
      | | 
       | 
       |----------- till AVR 
       | 
       | 
       | 
       | "bräda" 
       |------------ / -----------| 
                                  | 
                                ----- 
                                 --- 
                                  - 

Nu då
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Inlägg av v-g »

Det är inte så att du måste räkna en gång per vipp och sen vänta tills kontakten bryts för att nästa steg ska få räknas.

Dvs den ligger i kontakt ända tills den "går över mittläget".
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

Jag har en "etta" tills den passerar mitten, det är alltså ingen kontakt i normal läget och kortslutet mitt på. Frågan är om det helt enkelt är störningar som fångas upp av den 10 meter långa kabeln. Antalet falska "regn-ticks" blev färre när jag parallel kopplade 3 motstånd på 1k, det var de minsta jag hade. Jag funderar på att parallell koppla en konding över sensorn, vad tror ni om det?

/Erik
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Lågpassfiltret på sidan 15 i detta dokument fungerar bra för mig:

http://www.ganssle.com/debouncing.pdf

Prova med 10K och 100nF.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Vilken sort kontakt har den?

Jag läser det som att den ger en puls när den vippar och kör förbi mittläget, om denna kontakt är mekanisk kommer det att vara en del stutsande som måste stoppas.

Detta kan göras programmässigt eller hårdvarumässigt, hårdvaran är det första att kolla så att den inte ger en massa "intressanta" störningar.

Jag hade undvikit att dämpa med kondensator, jag hade istället räknat under ISR'n och satt en timer (variabel) till ett visst värde. I main-loop ville jag då räkna ner detta värde till det blir noll. Räkning av "vattenpulser" sätts då till att vara beroende av denna variabel: det kan bara räknas pulser om variabeln är noll.

Kod: Markera allt

typedef unsigned int word;
word Timer;
#define PAUSE_MIN 1000

void main(void)
  {
  ...
  while(true)
    {
    if(Timer) Timer--;
    }
  }

ISR(PCINT2_vect)
  {
  if((PINC & 2) && !Timer) Rain_Count++; // Count if allowed
  Timer = PAUSE_MIN; // Reload timer value
  }

Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Är den kopplad till PC2 så ska du väl kolla med:

if (PINC & (1<<PC2))

?
erikbrannlund
Inlägg: 53
Blev medlem: 12 februari 2007, 20:10:39
Ort: Frostkåge

Inlägg av erikbrannlund »

Hej!

Nu har jag kört med "thepirateboys filter" och en angivelse av ~3,5 mm under natten. Det har regnat men jag läste inte av den andra mätaren innan sängläge intogs så jag vet inte om det stämmer.

Varför ska jag kolla med (PINC & (1 << PC2)), jag har inte lyckats få ett riktigt fullständigt grepp om hårdvaran i AVR:en?

/Erik
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Om du använder port C bit 2 ska din AND-värde vara 4 vilket (1 << PC2) automagisk blir, det räknar ju 1, 2, 4, 8, 16, 32....
Skriv svar