Zmiana polaryzacji na wyściu X i Y w Atmega 8A i Attiny 13A Attiny 2313A

0

Witam
Proszę o pomoc w napisaniu programu na Atmega 8A i Attiny 13A , Attiny 2313A

Program bez funkcji delay,ma zmieniać bieguny na wyjściu X i Y w przedziale co 60-70 sekund, stan niski 60-70 sekund ,stan wysoki 60-70 sekund i tak na zmianę w nieskończoność,o okresie 120-140 sekund.
Podałam teoretyczne wyjścia X i Y bo nie wiem jakie najlepiej się nadadzą do tego programu.Mogą być dowolne najbardziej przydatne.

Zależy mi na bardzo dokładnym wypełnieniu duty 50 %. Chyba najdokładniej będzie sprzętowo przez podział częstotliwości na 2. Rozważałam jeszcze, millis,przerwania,flagi, może jest coś lepszego o czym nie wiem. Za pomoc z góry dziękuję.

Pozdrawiam
Adela

0

Jeśli ma zmieniać biegunowość zasilania, to potrzebujesz mostka H i dodatkowo odpowiedniego sterowania. Jaki to ma mieć pobór prądu? Co w zasadzie chcesz uzyskać? Prosty falownik? Jeśli tak - co z czasem martwym?
Jeżeli to ma być zwykły sygnał prostokątny to filozofii nie ma żadnej, timer w trybie CTC i stosowne sterowanie wyjściami załatwi sprawę. Ale już przy dead-time mogą pojawić się problemy, stąd ponawiam pytanie: jaki dokładnie problem chcesz rozwiązać?

0

Witam
Zamieszczam program z delay.
Chcę osiągnąć dokładniejsze wypełnienie 50% bez delay

Pozdrawiam
Adela

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

int main (void) 
{ 
DDRB = (1<<PB0)|(1<<PB1); 
PORTB|=(1<<PB0); 
while(1) 
{ 

PORTB ^= (1<<PB0)|(1<<PB1); 
_delay_ms(60000); 
} 
}

P.S
Nie wyświetla się tutaj powiadomienie osoby o nicku pierd ,mimo moich prób.
Jak zrobić aby się tutaj pojawiła.

0

Attiny13 na standardowych fusach ma 125 Khz. Reszta taktowań w dataheecie.
Z tego co pamiętam to po wyłączenia fusa DIV8 jest 1Mh, do uzyskania jeszcze 4,8Mhz i chyba 9,6Mhz.

Po co nam taktowanie?

W attiny13 masz timera 8-bitowego. Ustawiasz go, oraz wrzucasz do niego przerwanie (po zakończeniu zliczania - przepełnienie licznika = przerwanie). Ta wiedza jest dostępna w pierwszym lepszym tutorialu pod Atmegi. W Attiny tylko zmieniasz nazwy rejestrów zgodnie z dokumentacją i dedukcją logiczną i wszystko powinno działać jak należy

W przerwaniu ustawiasz licznik jako zmienną volatile, która informuje Cię kiedy należy zmienić poziom na wyjściu.

Przykład:
Ogólny wzór:

(H * T) / (L * D) = wartość zmiennej przy której należy zmienić poziom na porcie.
H - częstotliwość (hertze)
T - czas (sekundy)
L - ilość taktów w timerze (256 dla 8-bitowego)
D - dzielnik

Dla 125 Khz czyli 125 000 Hz i dzielniku na timerze równym 1024, mamy obliczenia typu:

(125000 * 60) / (256 * 1024) = 28.6102294921875

Jak widać liczba nie jest pełna. Należy policzyć dla niej resztę:

((125000 * 60) - (1024 * 256 * 28)) = 159968

Sprawdzamy czy reszta jest dobrze policzona (reszta / (1024 * 256)):

159968.0 / 262144.0 = 0.6102294921875

Czyli wszystko się zgadza. Resztę należy podzielić przez dzielnik (1024)

159968.0 / 1024.0 = 156.21875

Otrzymamy ilość taktów w ostatnim przejściu dla rejestru TCNT0. Jako że maksymalna liczba dla TCNT0 to 256, a my potrzebujemy 156, to należy tą różnicę dodać przy ostatnim takcie przed zmianą wartości. Czyli należy dodać 100. Skomplikowane?

Pseudo kod:

port_wysoki();
volatile zmienna = 0;
inicjuj_timer();
wlacz_przerwania();
while(1);

przerwanie(){
  zmienna ++;
  if(zmienna == 28){
    TCNT0 += 100;
  }else if(zmienna > 28){
    zmienna = 0;
    port_zmien_stan();
  }
}

Można też jak człowiek podpiąć zewnętrzny kwarc zegarkowy lub podobny, który jest podzielny przez potęgi liczby 2.

Np: 32756, wtedy obliczenia są trywialne i 32768.0 / 64.0 / 256 = 2.0 (taktowanie / dzielnik na timerze / pojemnosc timera = ilosc przerwan do zmiany poziomu na porcie dla jednej sekundy). Aby podpiąć taki kwarc do attiny trzeba zrobic generator, ponieważ attiny przyjmuje sygnał zewnętrzny tylko "jednopinowo".

0

Dziękuję nocnemu programiście za wiadomość.
Jak nie da rady na Attiny13A,to może być na Attiny2313A
Czy na podstawie tych informacji znalazła by się osoba która napisała by cały kod,bo sama jeszcze tego nie potrafię.
Adela

1 użytkowników online, w tym zalogowanych: 0, gości: 1