Zmiana polaryzacji na wyjściu, na Atmega 8A
Zmiana polaryzacji na wyjściu, na Atmega 8A
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
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.
Znów zadanie domowe, którego nie chce się samodzielnie rozwiązać?
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
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)
Instrukcje sterowników w PDF <klik>
kontakt: info(at)krypton(dot)pl
(podstawić @ i . w stosowne miejsca)
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);
}
}
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);
}
}
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?
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"
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 (void)
{
DDRB = (1<<PB0)|(1<<PB1);
PORTB|=(1<<PB0);
while(1)
{
PORTB ^= (1<<PB0)|(1<<PB1);
_delay_ms(60000);
}
}
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"
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
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);
}
}
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);
}
}
Witam
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
No to popatrz uważnie, w programie masz 120 000. a nie 12 000.Ada20 pisze: W tym programie było 12000 ms, bo o taką wartość napisałam na portalu,i taką wartość przysłał mi EXCREY.
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.Ada20 pisze:Na drugie zadanie EXCREY przysłał mi taki program,też nie działa, jak go poprawić.
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.
Piszmy po polsku, wszak jesteśmy Polakami.
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
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
Ada20, mam pytanie na jakim ty jesteś profilu że masz takie zadania z programowania a nie wiesz o co w tym chodzi?Ada20 pisze:Za mało się znam aby według Twoich wskazówek napisać program
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
Witam
Nie znam Studio6, ale można częstotliwość zdefiniować w opcjach konfiguracji projektu. Ta wartość jest potrzebna aby delay wyliczył odpowiednie opóźnienia
Deklarujesz port B jako wyjście czyli
lub krócej:
Następnie ustawiasz parzyste bity na "1", a więc:
Potem w pętli "while(1)" tworzysz 4 analogiczne warunki dla kolejnych par pinów np. PB0 i PB1, PB2 i PB3...:
następnie dokonujesz inkrementacji liczników:
a po nich
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
Pozdrawiam
Ciekawostka jest taka, że ten program napisałem na ATtiny13a, bo taki akurat miałem pod ręką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.
Nie znam Studio6, ale można częstotliwość zdefiniować w opcjach konfiguracji projektu. Ta wartość jest potrzebna aby delay wyliczył odpowiednie opóźnienia
Deklarujesz 4 kolejne zmienne "licznikx"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.
Kod: Zaznacz cały
unsigned int short licznik1;
Kod: Zaznacz cały
DDRB = (1<<PB0)|(1<<PB1)|(1<<PB2)....;
Kod: Zaznacz cały
DDRB=0b11111111;
Kod: Zaznacz cały
PORTB|=(1<<PB0)|(1<<PB2)....;
Kod: Zaznacz cały
if (licznik1 == 10){
PORTB ^= (1<<PB0)|(1<<PB1);
licznik1=0;
}
Kod: Zaznacz cały
licznik1++;
Kod: Zaznacz cały
_delay_ms(100);
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
Nie dam Tobie ryby, ale chętnie dam wędkę... Zrozumienia programowania nie unikniesz.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.
Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Piszmy po polsku, wszak jesteśmy Polakami.
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.
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.
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.
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
Ale tu nie mechanik, ludzie pomagają z dobrej woli i hobbystycznie a nie za pieniądze.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ę
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
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 ]
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
[ 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 (void)
{
DDRB = 255;
PORTB=(1<<PB0)|(1<<PB2)|(1<<PB4)|(1<<PB6);
while(1)
{
a++; b++; c++; d++;
_delay_ms(1000);
if (a == 60)
{
PORTB ^= (1<<PB0)|(1<<PB1);
a=0;
}
if (b == 120)
{
PORTB ^= (1<<PB2)|(1<<PB3);
b=0;
}
if (c == 180)
{
PORTB ^= (1<<PB4)|(1<<PB5);
c=0;
}
if (d == 240)
{
PORTB ^= (1<<PB6)|(1<<PB7);
d=0;
}
}
}
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
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.