Skocz do zawartości

Czołówka astronomiczna - ATTiny13A: jeden timer, jeden przycisk i jeden kB pamięci flash


Pomocna odpowiedź

Link do gita nie działa, wrzuć może tutaj cały kod.

Cytat

Jedyny przycisk w mojej czołówce działa teraz następująco: krótkie naciśniecie: on/off. Długie naciśniecie rozjaśnij, jeszcze raz długie naciśniecie przyciemnij, itd...

Czy rozjaśnianie i przyciemnianie jest do 100% czy do 50? Nie wiem czy to masz tam w kodzie ale można jeszcze bardziej obniżyć pobór prądu wyłączając wewnętrzny komparator analogowy. Chyba że z niego korzystasz 

 _delay_ms(400);
_delay_ ....

skoro używasz timerów to najpewniej te delaye można pominąć. A na czas oczekiwania również usypiać mikrokontroler

Edytowano przez _LM_
Link do komentarza
Share on other sites

(edytowany)
21 minut temu, _LM_ napisał:

Link do gita nie działa, wrzuć może tutaj cały kod.

Link poprawiony - wkradła się kropka na końcu linka.

21 minut temu, _LM_ napisał:

Czy rozjaśnianie i przyciemnianie jest do 100% czy do 50?

    // red led brightness levels - the led brightness is not changing linear but exponential 
    uint8_t brightness_level[] = {1, 2, 4, 8, 16, 32, 64, 128, 255};  // used 9 values from 2^n 

 

21 minut temu, _LM_ napisał:

Nie wiem czy to masz tam w kodzie ale można jeszcze bardziej obniżyć pobór prądu wyłączając wewnętrzny komparator analogowy.

    // Initialization
    // Disabling unused staff to save power
    cli();                                  // Deactivate Interrupts      
    GIMSK |= (1<<INT0);                     // Enable INT0 interrupt
    ADCSRA &= ~(1<<ADEN);                   // By writing it to zero, the ADC is turned off
    ACSR |=  (1<<ACD);                      // When this bit is written logic one, the power to the Analog
                                            // Comparator is switched off
    WDTCR &= ~(1<<WDTIE);                   // Disabling the Watchdog Timer. Just in case WDTON fuse is programmed.
    // BOD - Ensure it is disabled using the fuses. It can not be changed from the program brightness_level.

 

21 minut temu, _LM_ napisał:

skoro używasz timerów to najpewniej te delaye można pominąć.

Timer jest tylko jeden i jest użyty do PWM - pewnie nieprecyzyjnie to opisałem.

21 minut temu, _LM_ napisał:

A na czas oczekiwania również usypiać mikrokontroler

On śpi cały czas: jest albo "idle" albo "power down" - przycisk go wybudza przerwaniem.
EDIT: Oczywiście nie jest to do końca prawda. Aby wykryć czy przycisk jest wciśnięty długo czy krótko i do debounce używam delay. Ale 99.9% czasu czołówka świeci albo nie świeci i wtedy ATTiny jest idle/power down.

Edytowano przez pmochocki
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

uint8_t brightness_level[] = {1, 2, 4, 8, 16, 32, 64, 128, 255};  // used 9 values from 2^n 

zapisałbym 

uint8_t brightness_level = 1;
brightness_level = (1<<step);
step 0...7 ;)

 

  • Lubię! 2
Link do komentarza
Share on other sites

9 minut temu, _LM_ napisał:

uint8_t brightness_level[] = {1, 2, 4, 8, 16, 32, 64, 128, 255};  // used 9 values from 2^n 

zapisałbym 


uint8_t brightness_level = 1;
brightness_level = (1<<step);
step 0...7 ;)

 

A co z 255?
W sumie nie napisałem, ale pierwotnie był plan taki, aby liczbę stanów troszkę zmniejszyć i zatrzymać tylko te najczęściej używane. Jednak na obserwacjach jestem tak pochłonięty oglądaniem, że zawsze zapominam sprawdzić i zapisać jakie poziomy jasności używałem.

Link do komentarza
Share on other sites

1 godzinę temu, pmochocki napisał:

A co z 255?

No tak mój błąd, można zapisać:

OCR0 = (255 >> (7 - step));

Wtedy pwm zmieni się 1..255

1 godzinę temu, pmochocki napisał:

W sumie nie napisałem, ale pierwotnie był plan taki, aby liczbę stanów troszkę zmniejszyć i zatrzymać tylko te najczęściej używane.

W istocie trzy, max cztery poziomy jasności wystarczą, w takim przypadku zastosowanie tablicy pwm jest niezbędne.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

11 godzin temu, pmochocki napisał:

okazało się, że IDE Arduino potrafi obsługiwać programy napisane w stylu "old school"

Można również pisać całość w czystym C. Trick: plik .ino zostawiasz pusty, a tworzysz jakiś plik z rozszerzeniem .c (tylko nie o tej samej nazwie co szkic bo mu się pokiełbasi) i tam wrzucasz kod.

Poza tym nie wiem jaki masz OS na kompie, u mnie na Linuksie nie trzeba instalować żadnego AVR Studio, wystarczy avr-libc, avrdude, binutils-avr i gcc-avr. Na dobrą sprawę nawet nie trzeba tego wszystkiego instalować (niezależnie od systemu), można skorzystać z tego, co jest we flakach Arduino IDE, ale instalacja dużo nie kosztuje a nie jest zależna od jakichś arduinowych wynalazków. Wtedy masz komfort posługiwania się starym dobrym make 🙂

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

6 godzin temu, _LM_ napisał:

No tak mój błąd, można zapisać:










OCR0 = (255 >> (7 - step));

Wtedy pwm zmieni się 1..255

Bardzo fajna konstrukcja. 

6 godzin temu, ethanak napisał:

Można również pisać całość w czystym C. Trick: plik .ino zostawiasz pusty, a tworzysz jakiś plik z rozszerzeniem .c (tylko nie o tej samej nazwie co szkic bo mu się pokiełbasi) i tam wrzucasz kod.

Dzięki za wskazówkę. 

6 godzin temu, ethanak napisał:

Poza tym nie wiem jaki masz OS na kompie, u mnie na Linuksie nie trzeba instalować żadnego AVR Studio, wystarczy avr-libc, avrdude, binutils-avr i gcc-avr. Na dobrą sprawę nawet nie trzeba tego wszystkiego instalować (niezależnie od systemu), można skorzystać z tego, co jest we flakach Arduino IDE, ale instalacja dużo nie kosztuje a nie jest zależna od jakichś arduinowych wynalazków. Wtedy masz komfort posługiwania się starym dobrym make 🙂

W sumie to ja użyłem Arduino Uno do programowania ATTiny, więc arduinowe wynalazki mi się przydały. Używałem laptopa żony z Windowsem, który pożyczyła mi na dwa wieczory. Na służbowym nie mogę instalować takich rzeczy. 

8 godzin temu, ethanak napisał:

fajnie, że ktoś znajduje sensowne rozwiązania dla takich maleństw 🙂

ATTiny jest jak jak dobry skrypt. Piszesz go (na niego) w jeden lub dwa wieczory, a potem używasz latmi. 

Link do komentarza
Share on other sites

26 minut temu, pmochocki napisał:

ATTiny jest jak jak dobry skrypt. Piszesz go (na niego) w jeden lub dwa wieczory, a potem używasz latmi. 

Potwierdzam, pracują u mnie dwa takie typki i "robią robotę" jak należy, ten starszy już z 7 lat 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.