Skocz do zawartości

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


Pomocna odpowiedź

(edytowany)

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_
6 minut temu, _LM_ napisał:

Link do gita nie działa

Jak wywalisz kropkę która się przykleiła to zadziała...

@pmochocki co powinieneś jak najszybciej zrobić (edycja)!

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

 

  • Pomogłeś! 1
(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
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
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.

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
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
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. 

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 

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...