Automatinė akvariumo šėrykla 2 (EEPROM bėdos)

Po švenčių pastebėjau, kad šėrykla gerokai sumažino maisto normą žuvims. Galvojau vaikai žaidė, pamaigė mygtuką ir pakeitė misto porcijos dydį. Padidinau normą, bet vistiek šėrykla pylė per mažą maisto kiekį. Prijungus mikrovaldiklį prie kompiuterio pastebėjau, kad iš EEPROM visada nuskaitoma ta pati reikšmė 0xFF. Nesvarbu, kad prieš tai buvo įrašyta kas nors kita. Žinojau kad mikrovaldiklio EEPROM rašymų skaičius ribotas, bet kad tiek ribotas tai nesitikėjau, šėryklą naudoju nuo 2012 metų pradžios, maisto dozė keičiu kelis kart per metus, derinant pirmą programos versiją galėjau keliasdešimt rašymų atlikti, bendras rašymų kiekis neturėjo būti daugiau šimto. Taip naudojant turėjo dar ne vieną šimtą metų veikti, pagal gamintoją atTiny13 EEPROM išveria 100k rašymo ciklų. Iš didelio tingėjimo perlituoti seną valdiklį nauju, pakoregavau valdančią programą. Dabar maisto porciją galima pakeisti tik perprogramavus valdiklį, bet tai reikia daryti tik pakeitus žuvų maisto rūšį, o tai darau kartą per metus ar dar rečiau, todėl nematau čia didelės bėdos. Galima retkarčiais ir prie kompiuterio prisijungti maisto normos koregavimui.

Naujas programos kodas:

#define F_CPU 9600000UL
#define variklis PB0
#define led PB4
#define mygt PB3

#include <avr/io.h>
#include <util/delay.h>


void pozicija(int p, int r) // formuojame impulsus servo varikliui
{
   for ( int k = 0; k < r; k++) {
      PORTB |= _BV(variklis);
      for ( int j = 0; j < p; j++)
         _delay_us(1);
      PORTB &=~ _BV(variklis);
     _delay_ms(10);
   }
}

void pilam(void) //judesių seka maisto išpylimui
{
   PORTB |= _BV(led); //uždegam diodą
   pozicija( 400, 150 ); //sukam pirmyn
   pozicija( 1000, 40 ); //sukam atgal
   PORTB &=~ _BV(led); //gesinam diodą
}

void laukiam(int p) //laukiam p minučių arba mygtuko paspaudimo
{
   for ( int i = 0; i < p; i++ )
      for ( int j = 0; j < 600; j++ ) {
         if ( ( j % 50) == 0 )
            PORTB |= _BV(led);
         if ( ( j % 50) == 1 )
            PORTB &=~ _BV(led);
         if (PINB & _BV(mygt))
            _delay_ms(101.5);
         else
            pilam();
      }
}

void nustatom(void) {
   DDRB |= _BV(variklis);
   DDRB |= _BV(led);
   PINB |= _BV(variklis);
   PINB |= _BV(led);
   PORTB &=~ _BV(led);
   PORTB &=~ _BV(variklis);
   PORTB &=~ _BV(mygt);
}

void vykdom(void) {
   laukiam(10); //laukiam 10 min
   pilam();
   laukiam(330); //laukiam 5.5 h
   pilam();
   laukiam(330); //laukiam 5.5 h
   pilam();
}

int main(void) {
   nustatom();
   vykdom();
   for (;;) { // amžimai laukiam mygtuko paspaudimo
      laukiam(1);
   }
}

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *