arduino nano rtc prerusenie

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

aughostino
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 09 Jún 2007, 00:00
Vek: 34
Kontaktovať používateľa:

arduino nano rtc prerusenie

Príspevok od používateľa aughostino » 15 Mar 2018, 16:23

Ahojte,

snazim sa napisat zdrojovy kod, ktory po zapnuti relatka/svetla spusti pwm na pin 9, cim chcem docielit postupne rozsvecovanie. Pouzivam arduino nano a ako rtc DS3231 a data zobrazujem na displayi nokia 5110 (v tomto ukazkovom kode nie je zahrnuty-cely zdrojak nemam so sebou). Ak bude potrebne, vecer sem prihodim kompletny zdrojak.

Problem je ten, ze ked sa zopne rele v nastavenom case, pwm prebehne az do 255 ale pocas tejto doby sa mi rtc zastavi a cas na displayi zostane zamrznuty.

Moze ma prosim niekto nasmerovat co je spatne a ako docielit to, aby cas nepostal?

Kód: Vybrať všetko

#include <DS3231.h>

int Relay = 4;
int wait = 150;
int Pin1 = 9;

DS3231  rtc(SDA, SCL);
Time t;

const int OnHour = 12;
const int OnMin = 24;
const int OffHour = 12;
const int OffMin = 25;

void setup() {
  Serial.begin(9600);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,HIGH);
    Serial.println("ZAPNUTE");
    hore();
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,LOW);
      Serial.println("VYPNUTE");
    }
}



void hore() {

for (i=0; i<=255; i++) {
            analogWrite(Pin1, i);
            delay(wait);
}
}

0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: arduino nano rtc prerusenie

Príspevok od používateľa jirka.jirka. » 15 Mar 2018, 16:45

Musíš na to přes přerušení. Takto skočíš do toho cyklu for (který trvá 255*150). Kde 150 je asi milisecond (což odpovídá nějakým 40 sekundám). Takže 40s ti procesor nedělá nic jiného, než probíhá for a procesor potom nemůže dělat nic jiného (komunikace s RTC, výpis na LCD, ....).

Takže musíš mít přerušení, kde si budeš odskakovat na nastavení toho PWM.

Ale vůbec nemám tušení, jak se v arduino hatlamatilce kóduje přerušení.
0
Naposledy upravil/-a jirka.jirka. v 15 Mar 2018, 16:48, upravené celkom 1 krát.

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 709
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 41
Kontaktovať používateľa:

Re: arduino nano rtc prerusenie

Príspevok od používateľa Tribec Zacks » 15 Mar 2018, 16:45

Pogugli round-robin.
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: arduino nano rtc prerusenie

Príspevok od používateľa jirka.jirka. » 15 Mar 2018, 17:12

aughostino napísal:Ahojte,

snazim sa napisat zdrojovy kod, ktory po zapnuti relatka/svetla spusti pwm na pin 9, cim chcem docielit postupne rozsvecovanie. Pouzivam arduino nano a ako rtc DS3231 a data zobrazujem na displayi nokia 5110 (v tomto ukazkovom kode nie je zahrnuty-cely zdrojak nemam so sebou). Ak bude potrebne, vecer sem prihodim kompletny zdrojak.

Problem je ten, ze ked sa zopne rele v nastavenom case, pwm prebehne az do 255 ale pocas tejto doby sa mi rtc zastavi a cas na displayi zostane zamrznuty.

Moze ma prosim niekto nasmerovat co je spatne a ako docielit to, aby cas nepostal?

Kód: Vybrať všetko

#include <DS3231.h>

int Relay = 4;
int wait = 150;
int Pin1 = 9;

DS3231  rtc(SDA, SCL);
Time t;

const int OnHour = 12;
const int OnMin = 24;
const int OffHour = 12;
const int OffMin = 25;

void setup() {
  Serial.begin(9600);
  rtc.begin();
  pinMode(Relay, OUTPUT);
  digitalWrite(Relay, LOW);
}

void loop() {
  t = rtc.getTime();
  Serial.print(t.hour);
  Serial.print(" hour(s), ");
  Serial.print(t.min);
  Serial.print(" minute(s)");
  Serial.println(" ");
  delay (1000);
  
  if(t.hour == OnHour && t.min == OnMin){
    digitalWrite(Relay,HIGH);
    Serial.println("ZAPNUTE");
    hore();
    }
    
    else if(t.hour == OffHour && t.min == OffMin){
      digitalWrite(Relay,LOW);
      Serial.println("VYPNUTE");
    }
}



void hore() {

for (i=0; i<=255; i++) {
            analogWrite(Pin1, i);
            delay(wait);
}
}


Tady máš to přerušení.

Inicializace je příliš jednoduchá: https://playground.arduino.cc/Code/Timer1. Takže by s tím neměly být problémy.

Konkrétně co hledat na gůglu: arduino interrupt timer
0

aughostino
Okoloidúci
Okoloidúci
Príspevky: 42
Dátum registrácie: 09 Jún 2007, 00:00
Vek: 34
Kontaktovať používateľa:

Re: arduino nano rtc prerusenie

Príspevok od používateľa aughostino » 16 Mar 2018, 17:51

co som sa docital, tak maximalna doba prerusenia je cca 8,6sekundy, co je malo, alebo to prerusenie neviem pouzit. cital som okolo toho, ale nijako mi to nejde do hlavy, dokonca ani v anglictine :rolleyes:
0

kamilko
Stály člen
Stály člen
Príspevky: 269
Dátum registrácie: 21 Okt 2017, 14:07
Bydlisko: kosice

Re: arduino nano rtc prerusenie

Príspevok od používateľa kamilko » 16 Mar 2018, 18:39

Somarina, prerusenie bude nastavat kazdych 150ms a v nom sa bude zvysovat hodnota pwm dokial nedosiahne 255.
Samozrejme tam das este jedno if pre povolenie zvysovania pwm.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: arduino nano rtc prerusenie

Príspevok od používateľa peterple » 16 Mar 2018, 18:45

Nuž keď nemáš technický background, ideš na to správne. Arduino a jeho "knižnice" schovávajú pred netechnikmi technické pozadie. V arduine je už to prerušenie vytvorené od profíkov a ty ho už len musíš správne použiť. Prvá dôležitá vec je že nikde v tvojom programe nesmieš použiť funkciu delay. Ako na to a aké chyby robia začiatočníci som popísal tu:
http://www.plesnik.sk/Sim/milis.html
Potom je to programovanie v štýle stavovej mašiny. Stále sa chodí dokola v loope, len sa podľa potreby prechádza z jedného stavu do iného.

Inak prečo by ti bola doba medzi dvomi prerušeniami dlhá 8.6 sekundy málo? Ty to tam časuješ po 150ms. Arduino pomocou timera a prerušenia časuje po 1ms. Tak si môžeš pomocou premennej char časovať do 255ms , pomocou unsigned int po 65,5 sekundy a pomocou unsigned long počítať časy od 1ms až do 49 dní. Stačí? Ak nie tak pridáš ďalšiu premennú na počítanie a to v prípade dvoch long int už stačí pravdepodobne na celú existenciu vesmíru.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok