program RTC óra miatt megfagy
program RTC óra miatt megfagy
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!
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!
Re: program RTC óra miatt megfagy
Kód nélkül nehéz lesz tippeket is adni.... 
Re: program RTC óra miatt megfagy
Igen, már gondoltam rá, csak gondoltam egyszerűsítek, de mindegy inkább itt az egész:
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 <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 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.
Re: program RTC óra miatt megfagy
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....
Ez nem túl egészséges....
Re: program RTC óra miatt megfagy
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...
Re: program RTC óra miatt megfagy
De. Ott van a kódodban:
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.
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.
Re: program RTC óra miatt megfagy
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.
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.
Re: program RTC óra miatt megfagy
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...
??
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...
??
Re: program RTC óra miatt megfagy
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...
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...
Re: program RTC óra miatt megfagy
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...
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...
Re: program RTC óra miatt megfagy
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.
És az INT nélkül nem működik a TWI
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);
...Re: program RTC óra miatt megfagy
Miért kell tiltani/engedélyezni az INT-et?
Re: program RTC óra miatt megfagy
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!
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!
Re: program RTC óra miatt megfagy
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)
Re: program RTC óra miatt megfagy
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?
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?
