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 to post
Share on other sites
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
Link to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
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 to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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