Zmiana polaryzacji na wyjściu, na Atmega 8A

....nie pasujące gdzie indziej...
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Zmiana polaryzacji na wyjściu, na Atmega 8A

Post autor: Ada20 »

Witam !
Proszę o tekst darmowego programu, w języku programowania C,który zmienia polaryzację, co 60 sekund ,na Atmega 8A ,na pinie PB0 i PB1,z wypełnieniem 50 % (duty cycle 50%,pozostały wszystkie piny PB,PC,PD,mają być nie aktywne.Miernik voltowy podłączony do pinu PB0 i PB1, ma pokazywać 1 minutę znak plus,a potem 1 minutę znak minus,i tak na okrągło.
A także drugi program, który zmienia jednocześnie polaryzacje na następujących pinach:

PB0-PB1- 60 sekund
PB2-PB3- 120 sekund
PB4-PB5-180 sekund
PB6-PB7 -240 sekund

Tak abym mogła sama zmieniać czasy na poszczególnych pinach.
Taktowanie procesora 1 MHz .
Za pomocne odpowiedzi z góry dziękuję
Pozdrawiam
Ada
Ostatnio zmieniony środa 12 lut 2014, 19:51 przez Ada20, łącznie zmieniany 5 razy.
Awatar użytkownika
krzycho_
Posty: 2187
Rejestracja: piątek 08 maja 2009, 18:40
Lokalizacja: Poznań

Post autor: krzycho_ »

Po pierwsze nie ten dział.

Po drugie koleżanka za dużo wymaga , wpadasz tu tylko z jakimiś żądaniami ... jak mamy to rozumieć ? :razz:
elektroda.pl
Awatar użytkownika
greg
Posty: 3535
Rejestracja: środa 08 paź 2008, 00:16
Lokalizacja: Wrocław
Kontakt:

Post autor: greg »

Znów zadanie domowe, którego nie chce się samodzielnie rozwiązać? :mrgreen:

Podpowiedź:
1. ustawiasz porty
2. w pętli nieskończonej:
- zmiana stanu tych portów na przeciwny
- pauza

Maks 10 linijek kodu. Albo i jedna ;)
Sterownik extended v3.5 HE <klik>
Instrukcje sterowników w PDF <klik>

kontakt: info(at)krypton(dot)pl
(podstawić @ i . w stosowne miejsca)
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Na innym portalu , EXCRAY, przysłał mi taki program,ale on nie działa.
Sama dodałam na 1 lini:#define F_CPU 1000000L ,ale dalej nie działa.
Co trzeba zmienić aby działał.

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

int main (void)
{
DDRB = (1<<PB0)|(1<<PB1);
while(1)
{
PORTB ^= (1<<PB0)|(1<<PB1);
_delay_ms(120000);
}
}
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Bo on nie ma prawa działać tak jak chcesz:
Po pierwsze, skoro piny mają mieć odwrotne stany, to tak je musisz zainicjować, czyli przed pętlą główną jeden z portów musi zostać ustawiony w stan "1".
Poza tym, no .... kalkulatora nie masz? Od kiedy 120000ms to 60s?

Kod: Zaznacz cały

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

int main &#40;void&#41;
&#123;
DDRB = &#40;1<<PB0&#41;|&#40;1<<PB1&#41;;
PORTB|=&#40;1<<PB0&#41;;
while&#40;1&#41;
&#123;

PORTB ^= &#40;1<<PB0&#41;|&#40;1<<PB1&#41;;
_delay_ms&#40;60000&#41;;
&#125;
&#125;
To jest poprawny kod.

Co do reszty zadania to tworzysz trzy zmienne. Pętla while, jest wykonywana ze zwłoką 60s, i za każdym obiegiem, wszystkie zmienne są inkremetowane.
Tworzysz trzy kolejne warunki, które sprawdzają odpowiednie zmienne, pierwszą kiedy dojdzie do 2 drugą do 3 i trzecią do 4, bo to są odpowiednie wielokrotności 60 s. Jeśli warunki zostaną spełnione, to zmieniasz stany portów (zainicjowane analogicznie jak PB0 i PB1) oraz kasujesz odpowiednią zmienną.
Pozdrawiam
PS: Nie dawno w pracy pozbyłem się jednego "inżyniera" za kogo ktoś odrabiał "zadania domowe" :roll:
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 odpowiedz.
W tym programie było 12000 ms, bo o taką wartość napisałam na portalu,i taką wartość przysłał mi EXCREY.
Na drugie zadanie EXCREY przysłał mi taki program,też nie działa, jak go poprawić.

Pozdrawiam
Ada

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

int main (void)
{
DDRB = (1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
while(1)
{
PORTB ^= (1<<PB4)|(1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
_delay_ms(120000);
}
}
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Ada20 pisze: W tym programie było 12000 ms, bo o taką wartość napisałam na portalu,i taką wartość przysłał mi EXCREY.
No to popatrz uważnie, w programie masz 120 000. a nie 12 000.
Ada20 pisze:Na drugie zadanie EXCREY przysłał mi taki program,też nie działa, jak go poprawić.
Ten program też nie ma prawa działać, tak jak oczekujesz. Wspomniany EXCREY, albo nie zna się na pisaniu programów, albo nie rozumie problemu, albo robi sobie jaja.
Przepis na poprawnie działający program podałem wyżej. Przy odpowiednim zmniejszeniu wartości delay, i zwiększeniu liczników, możesz je zainicjować różnymi wartościami, przez co uzyskasz przesunięcie zmian w fazie.
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
Wgrałam Twój program do Atmegi 8A,działa tak jak chciałam,na mierniku zmienia stan co 60 sekund.Na symulatorze W Atmel Sudio 6 ,wyskoczył warning,że brakuje :F_CPU 1000000UL.
,jak radzisz dodać go czy nie w 1 linijce programu.
Co do EXCREYA,chyba zle zrozumiał o co mi chodzi,albo ja nie dopowiedziałam.
W Atmel Studio 6 dałam optymalizację,ale jak chciałam dać w definied symbols : F_CPU 1000000UL, po napisaniu w 1 linijce:F_CPU 1000000UL,to w bulid wyskoczył komunikat: Nou such directory,co zrobić aby wszedł definied symbols,i czy trzeba go dawać.
Dałam też optymalizację :Optymize for size(_OS)
Co do drugiego zadania ,to chcę aby na każdym pinie mogła zmienić na różne czasy,i aby nie były podwajane.
Np.
PB0- PB1- czas 1 sekunda
PB2-PB3-3 sekundy
PB4-PB5-5 sekund
PbB-PB7-7 sekund
Abym na każdym pinie mogła zmieniać na różne wartości.
Za mało się znam aby według Twoich wskazówek napisać program.
jeśli nie sprawiło by to Tobie kłopotu to proszę o napisanie takiego programu.
Pozdrawiam
Awatar użytkownika
Rysiu.
Posty: 1461
Rejestracja: poniedziałek 12 paź 2009, 22:30
Lokalizacja: południe

Post autor: Rysiu. »

Ada20 pisze:Za mało się znam aby według Twoich wskazówek napisać program
Ada20, mam pytanie na jakim ty jesteś profilu że masz takie zadania z programowania a nie wiesz o co w tym chodzi?

Rozumiem że czegoś można nie rozumieć i się spytać jak to powinno się zrobić ale proszenie o gotowca to nie jest w porządku.

Jak miałem asemblera którego nie wiedziałem wcześniej na oczy a prowadzący Ukrainiec łamaną polszczyzną wymieszaną z rosyjskim nie potrafił wyjaśnić tego w ciągu 8godzin to siadało się grupką 3-4 osób i się kleciło zadanie, wiec na kołach nie było problemu potem ;)
UF C2: XM-L2 T6 3C @8AMC; XM-L U2 1C @10AMC; XM-L2 T6 3C@10AMC; XM-L2 U3 7A@10AMC
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Ada20 pisze:Wgrałam Twój program do Atmegi 8A,działa tak jak chciałam,na mierniku zmienia stan co 60 sekund.Na symulatorze W Atmel Sudio 6 ,wyskoczył warning,że brakuje :F_CPU 1000000UL.
Ciekawostka jest taka, że ten program napisałem na ATtiny13a, bo taki akurat miałem pod ręką :mrgreen:
Nie znam Studio6, ale można częstotliwość zdefiniować w opcjach konfiguracji projektu. Ta wartość jest potrzebna aby delay wyliczył odpowiednie opóźnienia
Ada20 pisze:Np.
PB0- PB1- czas 1 sekunda
PB2-PB3-3 sekundy
PB4-PB5-5 sekund
PB6-PB7-7 sekund
Abym na każdym pinie mogła zmieniać na różne wartości.
Deklarujesz 4 kolejne zmienne "licznikx"

Kod: Zaznacz cały

unsigned int short licznik1;
Deklarujesz port B jako wyjście czyli

Kod: Zaznacz cały

DDRB = &#40;1<<PB0&#41;|&#40;1<<PB1&#41;|&#40;1<<PB2&#41;....;
lub krócej:

Kod: Zaznacz cały

DDRB=0b11111111;
Następnie ustawiasz parzyste bity na "1", a więc:

Kod: Zaznacz cały

PORTB|=&#40;1<<PB0&#41;|&#40;1<<PB2&#41;....;
Potem w pętli "while(1)" tworzysz 4 analogiczne warunki dla kolejnych par pinów np. PB0 i PB1, PB2 i PB3...:

Kod: Zaznacz cały

if &#40;licznik1 == 10&#41;&#123;
   PORTB ^= &#40;1<<PB0&#41;|&#40;1<<PB1&#41;;
   licznik1=0;
   &#125;
następnie dokonujesz inkrementacji liczników:

Kod: Zaznacz cały

licznik1++;
a po nich

Kod: Zaznacz cały

_delay_ms&#40;100&#41;;
Co to daje?
Stworzyłaś timery programowe w postaci liczników licznik1, licznik2, licznik3...
Wartość wszystkich liczników zostaje zwiększona o 0,1s w każdym przebiegu pętli.
Kiedy w kolejnym przebiegu zostanie wykryta ustalona wartość licznika (np 10 to 1s, 30 to 3s itd.) to zostaną zmienione stany odpowiednich portów, a następnie licznik zostanie wyzerowany, czyli rozpocznie się ponowne odliczanie ustalonego czasu. Jak widzisz są 4 niezależne liczniki, które mogą zliczać 4 różne czasy i robią to niezależnie od siebie z dokładnością do 0,1s. Tak więc każda dioda może migać z inną częstotliwością.
Jeśli zmienisz wartość _delay_ms na 1000, to podstawą obliczeń będzie 1s, to znaczy, że długość wszystkich czasów zwiększy się 10x.
Ciekawostka jest taka, że inicjując liczniki odpowiednią wartością możesz przesunąć je w fazie, czyli nie będą synchroniczne np.:
licznik1 = 0
licznik2 =7
spowoduje, że licznik2, będzie zmieniał stan o 0,7s wcześniej, niż normalnie. No to już będzie kompletna dyskoteka ;)

Ada20 pisze:Za mało się znam aby według Twoich wskazówek napisać program.
jeśli nie sprawiło by to Tobie kłopotu to proszę o napisanie takiego programu.
Nie dam Tobie ryby, ale chętnie dam wędkę... ;) Zrozumienia programowania nie unikniesz.
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 !
Studia historyczne kończyłam dawno,zainteresowałam się mikrokontrolerami od niedawna około 3 miesięcy temu.
Jak ktoś idzie z samochodem do mechanika,to on wykonuje to o co się go prosi,nie mówi nie dam Ci gotowca dam Ci wędkę,przykładów można podać więcej.,jak idziesz do dentysty ,to on nie mówi nie dam ci gotowca ,ale wędkę,itd.itp.
Dziękuję za pomoc.
Pozdrawiam Ada.
Ostatnio zmieniony czwartek 13 lut 2014, 12:25 przez Ada20, łącznie zmieniany 2 razy.
Awatar użytkownika
Rysiu.
Posty: 1461
Rejestracja: poniedziałek 12 paź 2009, 22:30
Lokalizacja: południe

Post autor: Rysiu. »

Nie żeby coś ale w profilu masz rocznik '93, w nicku 20 co by się zgadzało, zadania wyglądają na domowe a nie na urządzenie do elektrolizy.
Ada20 pisze:Jak ktoś idzie z samochodem do mechanika,to on wykonuje to o co się go prosi,nie mówi nie dam Ci gotowca dam Ci wędkę
Ale tu nie mechanik, ludzie pomagają z dobrej woli i hobbystycznie a nie za pieniądze.

Jeśli to jest nauka programowania hobbystycznie a nie zadanie z zajęć to trzeba było to na początku zaznaczyć a nie kluczyć bo każdy sądził że to praca domowa :)
UF C2: XM-L2 T6 3C @8AMC; XM-L U2 1C @10AMC; XM-L2 T6 3C@10AMC; XM-L2 U3 7A@10AMC
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

No to teraz wszystko jasne,może znajdzie się ktoś dobrej woli,kto poda tekst programu z zadania drugiego.
Ada
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

FCPU definiuje się tylko w opcjach kompilatora, bo przy większych projektach zmiana częstotliwości powodowałaby potrzebę zmian w każdym z plików nagłówkowych użytym w danym projekcie. Gdzieś się zapomni, coś zrobi nie tak i będą jaja a tak będzie ta opcja tylko w 1 miejscu.

[ Dodano: 13 Luty 2014, 07:05 ]

Kod: Zaznacz cały

#include <avr/io.h>
#include <util/delay.h>
uint8_t a=0; uint8_t b=0; uint8_t c=0; uint8_t d=0; 

int main &#40;void&#41;
&#123;
DDRB = 255;
PORTB=&#40;1<<PB0&#41;|&#40;1<<PB2&#41;|&#40;1<<PB4&#41;|&#40;1<<PB6&#41;;
while&#40;1&#41;
&#123;
a++; b++; c++; d++;
_delay_ms&#40;1000&#41;;
if &#40;a == 60&#41;  
&#123;
PORTB ^= &#40;1<<PB0&#41;|&#40;1<<PB1&#41;;
a=0; 
&#125;
if &#40;b == 120&#41;
&#123;
PORTB ^= &#40;1<<PB2&#41;|&#40;1<<PB3&#41;;
b=0; 
&#125;
if &#40;c == 180&#41;
&#123;
PORTB ^= &#40;1<<PB4&#41;|&#40;1<<PB5&#41;;
c=0; 
&#125;
if &#40;d == 240&#41;
&#123;
PORTB ^= &#40;1<<PB6&#41;|&#40;1<<PB7&#41;;
d=0; 
&#125;
&#125;
&#125; 
Taki prosty przykład, który mam nadzieję zrozumiesz beż komentarzy i tłumaczenia. No chyba, że chcesz to samo na timerze/WD i przerwaniach oraz pustym mainie i bez delayów ;-)
Ada20
Posty: 71
Rejestracja: niedziela 08 gru 2013, 13:26
Lokalizacja: Wroclaw

Post autor: Ada20 »

Witam
Dziękuję bardzo.
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

Te czasy podałam jako przykład potem je zmienię według potrzeby.

Na Atmega 8A czas 60 sekund jest dokładny,na Attiny 13 A jest 50 sekund zamiast 60 sekund,czyli niedokładny czas.
Pozdrawiam
Ostatnio zmieniony sobota 15 lut 2014, 18:01 przez Ada20, łącznie zmieniany 1 raz.
Zablokowany