program RTC óra miatt megfagy

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Kedves Fórumozók!

Abban kérnék segítséget, hogy mi lehet annak az oka, hogy a programom megfagy a DS1307 óra miatt.
Adott egy TAVIR alappanel (Diecimila) egy Tavir SD logger shielddel amin van egy LCD kijelző (a csupalyuk részre forrasztva).
VAn 3 analóg bemenetem és elvileg az összes digitális használva van a 2-es lábon megszakítással.
Ha csak az óra tesztprogramját töltöm fel szépen lépteti az órát az LCD-re kiírva, de ha a teljes programot akkor megfagy.
Van erre valami magyarázat?
Köszi!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

Kód nélkül nehéz lesz tippeket is adni.... :(
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Igen, már gondoltam rá, csak gondoltam egyszerűsítek, de mindegy inkább itt az egész:

Kód: Egész kijelölése

#include <LiquidCrystal.h>
#include <Wire.h> // az i2c buszrendszer fuggvenykonyvtara amin az ora van
#include "RTClib.h" //az RTC konyvtara

RTC_DS1307 rtc;

LiquidCrystal lcd(8, 7, 6, 5, 4, 3);     //SD shield lábkiosztás

const int szivattyu = 0;  // PIN-ek meghatarozasa
const int szelep = 1;

//volatile int NbTopsFan; //measuring the rising edges of the signal
volatile int NbofImp = 0;

void setup() {

  lcd.begin(20, 4);   // set up the LCD's number of columns and rows: 
  pinMode(szivattyu, OUTPUT);  // relay 1 szivattyu
  pinMode(szelep, OUTPUT); //relay 2 szelep
  pinMode(2, INPUT); //HALL szenzor
  attachInterrupt(0, rpm, RISING); //and now the interrupt is attached to pin 2

// Serial.begin(57600);
  //  Serial.println(); 

  Wire.begin();   
  rtc.begin();
  if (! rtc.isrunning()) {
    //Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  int sensorValue0 = analogRead(A0);
  int sensorValue1 = analogRead(A1);
  int sensorValue2 = analogRead(A2);
  float voltage0 = sensorValue0 * (5.0 / 1023.0);
  float voltage1 = sensorValue1 * (5.0 / 1023.0);
  float voltage2 = sensorValue2 * (5.0 / 1023.0);

  float celsius0 = 31.334 * voltage0 - 20.43;
  float celsius1 = 31.334 * voltage1 - 20.43;
  float celsius2 = 31.334 * voltage2 - 20.43;  //20.43 az eredeti offset
  lcd.setCursor(0, 0);
  lcd.print("BACK:");
  lcd.setCursor(5, 0);
  lcd.print(celsius0);
  lcd.setCursor(9, 0);
  lcd.print("C");
  lcd.setCursor(11, 0);
  lcd.print("PCM:");
  lcd.setCursor(15, 0);
  lcd.print(celsius1);
  lcd.setCursor(19, 0);
  lcd.print("C");
  lcd.setCursor(0, 1);
  lcd.print("DUAL:");
  lcd.setCursor(5, 1);
  lcd.print(celsius2);
  lcd.setCursor(9, 1);
  lcd.print("C");

  DateTime now = rtc.now();
  lcd.setCursor(0, 2);
  lcd.print("RTC:");
  lcd.setCursor(5,2);
  lcd.print(now.hour(), DEC);
  lcd.setCursor(8,2);
  lcd.print(now.minute(), DEC);
  lcd.setCursor(11,2);
  lcd.print(now.second(), DEC);



    if (celsius2>50 && celsius1<80) //DUAL
    { 
      digitalWrite(szivattyu, LOW); //szivattyu be
      digitalWrite(szelep, LOW); //szelep be
    }
    else if (celsius1>=80)  //PCM
    {
      digitalWrite(szivattyu, LOW); //szivattyu be
      digitalWrite(szelep, HIGH); //szelep ki
      
    }
    else
    {
      digitalWrite(szivattyu, HIGH); //szivattyu ki
      digitalWrite(szelep, HIGH); //szelep ki
    }
   
  }


 
  sei(); //interrupt on
  delay(1000);
  cli();
  lcd.setCursor(10,3);
  lcd.print(NbofImp);
}


void rpm ()     //This is the function that the interupt calls 
{ 
  NbofImp++; //This variable stores all impulses
} 
Ha kiveszem az órakezelést akkor minden ok, kiírja a hőmérsékleteket, működteti a vezérlést stb. Tehát ahogy szeretném.
HA külön az órát akarom kíratni akkor az is megy. Nem látok semmi különbséget pedig átnéztem párszor... :(

Kód: Egész kijelölése


#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>


RTC_DS1307 rtc;

LiquidCrystal lcd(8, 7, 6, 5, 4, 3); 

void setup () {
  Serial.begin(57600);
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();
 lcd.begin(20, 4);
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {
    DateTime now = rtc.now();
 lcd.setCursor(0, 2);
  lcd.print("RTC:");
  lcd.setCursor(5,2);
  lcd.print(now.hour(), DEC);
  lcd.setCursor(8,2);
  lcd.print(now.minute(), DEC);
  lcd.setCursor(11,2);
    lcd.print(now.second(), DEC);
  delay(1000);
    
}
A hozzászólást 1 alkalommal szerkesztették, utoljára priston 2014. április 24. csütörtök, 1:32-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

0 és 1 lábon van egyszer szivattyúd (I/O-ként) és ott van a serial.begin() szintén a 0 és 1 lábra...
Ez nem túl egészséges....
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Igen, a feltöltésnél le szoktam húzni a reléket, de utána elvileg nem zavarhat be, mivel a loopban nincs serial. Feltöltés után átdugom külső áramforrásara, majd visszadugom a reléket. Sajnos nincs más lehetőség, ennyi digit I/O van...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

De. Ott van a kódodban:

Kód: Egész kijelölése

...
Serial.begin(57600);
  //  Serial.println();

  Wire.begin();   
  rtc.begin();
  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    rtc.adjust(DateTime(__DATE__, __TIME__));
  }
}
...

Az RPM milyen sűrűn jön?


A "megfagy" az mit jelent pontosan?

A főprogramban az LCD kezelés igen erőforrás és időigényes!
A setcursor ideje ~25 ms-onkénti, a clear az kb. 90, a kiírás az 3-10 ms.
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Kiszedtem a serialt teljesen, de így is ugyanaz.
Olyan mintha egyszer lefutna a loop, tehát kiírja az LCD-re az aktuális értékeket (hőmérsékletek, rendszer állapot, impulzusszám) és az aktuális óraállást azt annyi. Utána már nem frissülnek az értékek...
Az rpm ilyenkor nem kerül meghívásra még általában, mert a rendszer csak ritkán kapcsol be. Ha megy akkor kb 5-6 impulzus mp-enként.

MÁS: Amikor kiszedem az órakezelést akkor ugye működik a program. Ilyenkor azt figyeltem meg, hogy, úgy tűnik néhány impulzus elvész, nyilván pont azért mert akkor is jön impulzus amikor a megszakítás nem aktív. Akkor ezek szerint azért mert a képernyőkezelés sokáig tart. Tegyem a bekapcsolást (sei()) a loop első sorába?

Amúgy a program célja majd a hőmennyiség számítás lesz. Már megcsináltam az SD kezelést is, hogy naplózzon, de akkor se működött. Elkezdtem kigyomlálni, így jutottam el az óráig.
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Ha kiszedem az iterruptot akkor működik. Nem értem.
A sei()-t meg a cei()-t kikommenteltem és így megy. Ezek nélkül megy az interrupt??? Sajnos nem tudom ellenőrizni mert épp nem süt a nap. Bár majd átírom a bekapcsolási hőmérsékletet...
??
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

A globál interrupt tiltás-engedélyezés?
Arduino erre épül! Sorosport kezelés, ADC, millis(), TWI kezelés és majd' minden időzítéses függvény!

Ha azt akarod, hogy ne számoljon a kijelzőn kiírás alatt, hozz létre egy változómásolatot és abból írj ki adatokat...
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Köszönöm Robert, de ezzel nem sokat segítettél. :(
Inkább azt áruld el kérlek, hogy az óra miért veszik össze az interrupttal. És hogyan tudnám ezt megoldani.
Nem vagyok még annyira otthon ebben, sajnos 2-3 napom is rámegy míg a neten megtalálok dolgokat ami nekem kell. Így is túl sok időm ráment erre, de most tényleg elakadtam.
Ha nem használok interruptot, akkor még a pulseIn() függvény lenne jó, de próbáltam azzal se pontos a mérés...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

A TWI függvénykönyvtárt nézd meg:
C:\Program Files (x86)\Arduino\libraries\Wire\utility

INIT() részen inicializálja a TWI INT-jét. Ebben van az adat kiment, van valami a bufferben, stb.

Kód: Egész kijelölése

..
  // enable twi module, acks, and twi interrupt
  TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA); 
...
És az INT nélkül nem működik a TWI
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

Miért kell tiltani/engedélyezni az INT-et?
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Ahha... tehát a busz használja az interruptot és nem az óra? És mivel én letiltom nem tud kommunikálni.
Innen vettem a programom alapját: http://themakersworkbench.com/content/t ... te-arduino, de kezdettől fogva gyanús volt, hogy nem kell azt INT-et kapcsolgatni, anélkül is menne. (főleg, hogy a reference-ben sem említik sehol...)

Már délelőtt átírtam a progit és kivettem belőle a INT kapcsolgatást, viszont csak hétfőn tudom megnézni, hogy működik-e.
Addig is köszönöm a segítséget!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: Robert »

Igen. Kontroller -> I2C/TWI busz -> RTC. És itt az I2C/TWI-ben az interruotját kikacsoltad és a kódban INT alapú a kommunikáció. (twi.h és twi.c állományok)
priston
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2014. április 22. kedd, 13:07

Re: program RTC óra miatt megfagy

Hozzászólás Szerző: priston »

Még 1 kérdés: :)
A datalogger shield-en az óra az i2c buszon van. Hozzá lehet még csatolni eszközöket? Most nincs előttem de itt van külön láb neki, vagy az A4-A5-hez kell hozzáfűzni?

Ja, és mi az óra címe? Azt honnan látni?
Válasz küldése