Zmiana polaryzacji na wyjściu, na Atmega 8A

....nie pasujące gdzie indziej...
Awatar użytkownika
ElSor
Site Admin
Posty: 5040
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Attiny13A ma zegar 1,2MHz :razz:
Ada20 pisze: Interesuje mnie jeszcze tekst 2 programów,byłabym wdzięczna za podanie go tutaj.
Wszystkie piny do Atmegi 8A.
Np.
PB0- PB1- czas 1 sekunda
PB2-PB3-3 sekundy
PB4-PB5-5 sekund
PB6-PB7-7 sekund

PC0-PC1- czas 9 sekund
PC2-PC3- 11 sekund
PC4-PC5- 13 sekund

PD0-PD1-czas 15 sekund
PD2-PD3- 17 sekund
PD4-PD5- 19 sekund
PD6-PD7- 21 sekund
A czego nie rozumiesz w kodzie, który podałem wcześniej, że samodzielnie nie potrafisz dodać obsługi portu C i D poprzez zwykłe CTRL+C i CTRL+V i późniejsze drobne zmiany?

Ja lenistwa nie popieram i popierać nie będę :!:
Awatar użytkownika
fredek
Posty: 372
Rejestracja: poniedziałek 03 maja 2010, 13:58
Lokalizacja: Łódź

Post autor: fredek »

Ada20 pisze:Na innym portalu , EXCRAY, przysłał mi taki program,ale on nie działa.
...
_delay_ms(120000);
...
A ja tylko zwrócę uwagę, że wartość wpisywana do tej funkcji jest ograniczona...

Kod: Zaznacz cały

The macro F_CPU is supposed to be defined to a
   constant defining the CPU clock frequency (in Hertz).

   The maximal possible delay is 262.14 ms / F_CPU in MHz.

   When the user request delay which exceed the maximum possible one,
   _delay_ms() provides a decreased resolution functionality. In this
   mode _delay_ms() will work with a resolution of 1/10 ms, providing
   delays up to 6.5535 seconds (independent from CPU frequency).  The
   user will not be informed about decreased resolution.
Także wpisywanie bzdurnie dużych wartości nie ma sensu :mrgreen:
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Fredek , jaki program proponujesz, odpowiedni dla dużych wartości ,1 minuta,2 minuty, na pinie PB0 i PB1 w Atmega 8A ?
Ada
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
fredek pisze: A ja tylko zwrócę uwagę, że wartość wpisywana do tej funkcji jest ograniczona...

Kod: Zaznacz cały

The macro F_CPU is supposed to be defined to a
   constant defining the CPU clock frequency (in Hertz).

   The maximal possible delay is 262.14 ms / F_CPU in MHz.

   When the user request delay which exceed the maximum possible one,
   _delay_ms() provides a decreased resolution functionality. In this
   mode _delay_ms() will work with a resolution of 1/10 ms, providing
   delays up to 6.5535 seconds (independent from CPU frequency).  The
   user will not be informed about decreased resolution.
Także wpisywanie bzdurnie dużych wartości nie ma sensu :mrgreen:
A nie do końca... Opis mówi, że po przekroczeniu pewnej wartości, automatycznie zmieniana jest rozdzielczość, o czym użytkownik nie jest informowany. Aktualnie mi miga dioda co 70s, czyli podałem
_delay_ms(70000)
W definicji _delay, jest napisane:
void _delay_ms(double __ms)
a double to:
double 32 ±1.18·10-38 ±3.4·1038
czyli możemy czekać ... bardzo długo ;)

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
fredek
Posty: 372
Rejestracja: poniedziałek 03 maja 2010, 13:58
Lokalizacja: Łódź

Post autor: fredek »

Pyra, zrób samym pojedynczym _delay_ms(...) te 70 sek przy kwarcu np. 10 MHz ;)
Kiedyś się na to natknąłem, dlatego zwracam uwagę, jak to jest implementowane też doskonale wiem...

Kod: Zaznacz cały

void _delay_ms(double __ms)
{
	uint16_t __ticks;
	double __tmp = ((F_CPU) / 4e3) * __ms;
	if &#40;__tmp < 1.0&#41;
		__ticks = 1;
	else if &#40;__tmp > 65535&#41;
	&#123;
		//	__ticks = requested delay in 1/10 ms
		__ticks = &#40;uint16_t&#41; &#40;__ms * 10.0&#41;;
		while&#40;__ticks&#41;
		&#123;
			// wait 1/10 ms
			_delay_loop_2&#40;&#40;&#40;F_CPU&#41; / 4e3&#41; / 10&#41;;
			__ticks --;
		&#125;
		return;
	&#125;
	else
		__ticks = &#40;uint16_t&#41;__tmp;
	_delay_loop_2&#40;__ticks&#41;;
&#125;
Ada20, tym razem nic Ci nie zaproponuję, nie mam aktualnie czasu na takie zabawy, przynajmniej do końca miesiąca.
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
fredek pisze:Pyra, zrób samym pojedynczym _delay_ms(...) te 70 sek przy kwarcu np. 10 MHz ;)
Muszę Cię zmartwić ;) sprawdzałem właśnie po kolei większe wartości i ...
_delay_ms(120000);
Działa bez problemu przy taktowaniu 9,6MHz, czekałem 120s.

Pozdrawiam
PS:
_delay_ms(240000);
czekałem 4 minuty, i też działa :mrgreen:
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
joon
Posty: 621
Rejestracja: niedziela 04 mar 2012, 15:31
Lokalizacja: Przemyśl

Post autor: joon »

Ja tam zwykle przy dużych wartościach robiłem funkcję delay w pętli i problemów nie było :P
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

"następnie dokonujesz inkrementacji liczników:
Kod:
licznik1++; "
Witam
Co to znaczy "inkrementacji " w tym wypadku?
Jak dam czas na Attiny 13A ,1 sekundę,to na mierniku pokazuje 0.476 Hz.
Ada
ptja
Posty: 2413
Rejestracja: poniedziałek 31 gru 2012, 12:44
Lokalizacja: Łódź

Post autor: ptja »

--
pozdrawiam,
Jarek Andrzejewski
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

To już czytałam dwa dni temu w Wikipedii,ja pytam w tym przypadku,a nie ogólnie.
W pierwszym programie Pyry Piny,PB0 i PB1 zamieniłam w na pin PB1 i PB3 i nie działa w Attiny 13 A,,jak zmienić aby na pinie PB1 i PB3 działało .
Zrobiłam tak:

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

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

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


I nie działa.
Ada
Ostatnio zmieniony sobota 15 lut 2014, 17:59 przez Ada20, łącznie zmieniany 1 raz.
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Dziwne... skopiowałem ten kod i skompilowałem, u mnie chodzi. Dwie podłączone diody migają na zmianę.
Ada20 pisze:To już czytałam dwa dni temu,ja pytam w tym wypadku,a nie ogólnie.
Już tłumaczę, może na początku trochę bardziej obrazowo.
Mamy pięciu studentów ;) pierwszy z nich podaje co 1 s komendę "raz" czterej pozostali trzymają w górze prawe ręce, oraz zliczają komendy podawane przez pierwszego. Teraz mamy taką sytuację, że:
Drugi licząc komendy (inkrementuje swój licznik) dolicza tylko do 5, po czym zmienia prawą rękę na lewą, oraz zaczyna liczyć od początku 0, 1 ... 4, 5,(zmiana ręki) 0, 1...4, 5, (zmiana ręki) itd.
Trzeci student, postępuje analogicznie, z tym że liczy do 7, w związku z tym 0, 1, 2, ... 6, 7, (zmiana ręki), 0, 1, ... 6, 7, (zmiana ręki)...
Czwarty student, zlicza do 3, a piąty do 9. Mamy więc taką sytuację:
student 1 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
student 2 - 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5...
student 3 - 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7...
student 4 - 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3...
student 5 - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3...
Kolorami znaczyłem zmiany.
Jak więc widzisz, mimo, iż mamy jeden wspólny sygnał zegarowy, czyli jeden obieg pętli while(1) z odpowiednim czasem _delay_ms, to każda zmienna, jest takim licznikiem, który umożliwia kilku "procesom" niezależne zliczanie czasu, i każdy student macha łapkami w swoim rytmie ;)
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Dziękuję za wyjaśnienia.
Twój pierwszy program u mnie działa na Attiny 13A.
Próbowałam 2 raz Twój przerobiony program ,zamiast pinu PB0 dałam pin PB1,
a zamiast pinu PB1 dałam pin PB3 i dalej nie działa, na Attiny 13A,napięcie zerowe.
Poniżej ,Twój przerobiony prze ze mnie kod, który nie działa u mnie na Atiiny 13A.

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

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

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

Pozdrawiam
Awatar użytkownika
Pyra
Site Admin
Posty: 8522
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
U mnie ten kod chodzi poprawnie, więc musisz poszukać jakiegoś błędu w podłączeniu lub konfiguracji.
Błąd w podłączeniu mógł się zdarzyć, bo ATtiny13, ma nielogicznie rozłożone końcówki portów, popatrz:
Obrazek
Zwróć uwagę, że tak jakby piny 3 i 4 były zamienione miejscami, czasem może to umknąć.
Podpowiem też Tobie pewną sztuczkę ;) do testów używaj mniejszych opóźnień, wtedy testy będą mniej czasochłonne. Możesz np użyć czasu np. 10x mniejszego, wtedy zachowasz możliwość kontroli poprawności wprowadzonych danych, tyle, że w skali.
Aha, próbowałem ten kod zarówno dla częstotliwości zegara 1,2 (Divide 8 ON) jak i 9,6MHz (Divide 8 OFF).
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Już działa,poprzednio podłączyłam miernik nie do tego pinu co trzeba , jak napisane było w programie.
Natomiat wyjście PB2 i PB5 nie działa u mnie prawidłowo,na jednej połowie jest napiecie na drugiej nie ma ,ciekawe czy u Ciebie też tak jest.
Dałam CPU=1.2Mhz ,i teraz Attiny 13 A pokazuje poprawnie czas 60 sekund,przedtem przy 1 MHz pokazywał 50 sekund,a t o dzięki podpowiedzi ELSora, który napisał,że Attiny 13 A ma 1.2 MHz.teraz u mnie Attiny 13 A pokazuje dokładny okres, tj.60 sekund.
Dałam masę GND i PB0 w programie ,ale nie działa.
Jak zrobić aby na GND i PB0 była zmiana polaryzacji,czy to możliwe aby tak działało.
Tylko dlaczego przy 1 sekundzie pokazuje około 0.5 Hz,czy nie powinien pokazywać 1 Hz.
Pozdrawiam
Ostatnio zmieniony sobota 15 lut 2014, 12:58 przez Ada20, łącznie zmieniany 1 raz.
Awatar użytkownika
ElSor
Site Admin
Posty: 5040
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

Ada20 pisze:Tylko dlaczego przy 1 sekundzie pokazuje około 0.5 Hz,czy nie powinien pokazywać 1 Hz.
Bo przy założeniu, że 1 sek trwa stan wysoki i 1 sek trwa stan niski, cały cykl ma 2 sekundy czyli 0,5Hz.
Ada20 pisze:Jak zrobić aby na GND i PB0 była zmiana polaryzacji,czy to możliwe aby tak działało.
GND to skrót od GrouND, czyli ziemia. Ten pin zawsze jest niezmienny. PB0 może przyjmować zawsze wartość taką jaka jest opisana w nocie danego procesora (polecam odnaleźć tą informację). Żeby uzyskać ujemne napięcie wyjściowe, trzeba by dołożyć ujemne napięcie zasilające i układ konwertujący poziomy TTL na +/-, np w prostszej wersji tranzystor(y) pełniące podobną funkcję lub układ typu MAX232.

Jeśli uważasz, że któreś z postów były pomocne w rozwiązaniu Twojego problemu to kliknij na Obrazek
Zablokowany