Skocz do zawartości

AVR studio - szukam ludzi orientujących się w AVR.


Recommended Posts

Nie używam AVR Studio, na windzie winavr, ale jakoś wolę pod ubuntu eclipse z pluginem i avr-gcc (co prawda jest też pod windę, ale ...)

Natomiast wątpliwą sprawą jest to by ktoś chciał "z dobrego serca" rozwiązywać czyjeś prace domowe i do tego na studiach - jak taki ma być poziom magistrów to już mnie głowa zaczyna boleć.

Link to post
Share on other sites

Ja też w sumie się do tego przymierzam. Macie jakieś zestawy uruchomieniowe, czy sami lutujecie? Bo ja kupiłem niedawno całkiem fajny zestaw Zestaw EvB 4.3v4 ATMega64 do nauki i w sumie pewnie super pomocny nie będę, ale chociaż spróbuję, miałbym motywację :).

Edytowane przez Hans Olo
Link to post
Share on other sites

Co innego pomoc, a co innego odwalanie za kogoś roboty. Jak ma programowanie MCU to musiał mieć programowanie już wcześniej (elementy języka C/C++ lub coś w tym stylu). A skoro miał to jedyne co teraz pozostaje to przejrzeć dokumentację avr libc i zacząć pisać. Myślisz, że mnie ktoś tego uczył? A może ktoś pisał za mnie w asm dla DSP TI? Albo zrysowywał stany I/O przy ręcznym sterowaniu 8051 (lol). Gdyby temat wyszedł od kogoś kto nie studiuje, nie ma tego na zajęciach, jako projekt do oceny itp. itd. tylko od pasjonata, który chce się czegoś sam nauczyć to miałbym tysiąc różnych porad, ale w tej sytuacji to najpierw niech ów kolega zrobi to co jako student ma zrobić (UCZY SIĘ), a dopiero jak mimo tego będzie miał z czymś problem niech wali na forum. Wtedy też pomogę.

 

@Hans Olo - zestaw dobry, ale jak robisz sam to znasz lepiej schemat, wiesz więcej o procku (siłą rzeczy więcej z noty katalogowej musisz obejrzeć) i ogółem masz układ zrobiony bardziej pod konkretne zastosowanie (przez co znacznie tańszy w końcowym rozrachunku). Do nauki wiadomo eval boards są jak najbardziej ok. Będziesz miał z czymś problem jest elektroda, albo wal też tutaj - może akurat będę w stanie cos podpowiedzieć.

Edytowane przez Promilus
Link to post
Share on other sites

Z tego co pamiętam to zawsze można spotkać się z tłumaczeniem, że skoro ja sie musiałem uczyć to niech inni też się uczą. Jednak ani on ani ja nie jesteśmy na informatyce i przedmioty typu programowanie jest raczej na zasadzie zaliczenia.

To może inaczej. Czy w celu poprawienia dokładności poniższego programu wystarczy wrzucić for w pętli do? Z tego co mówił program polega na tym iż przełączasz kabelek pod pin z napięciem 0V a 5V a w okonie hyper terminala pokazuje Ci jaki jest wynik. Poprawa dokładności ma polegać na uśrednieniu 5 wyników - one też mają być pokazane. Oprócz for (int i=1; i<=6; i++) co trzeba dopisać by wynik był uśredniony?

 

#include <avr/io.h> //biblioteka procesora
#include <avr/interrupt.h> //biblioteka przerwań
#include <util/delay.h> //procedury z opóźnieniem czasowym
//_delay_us (x); odlicza w czasie us
//_delay_ms (x); odlizca w czasie ms
/////////////////////////////////////
int main(void)
{
DDRC = 0; //linia 0 portu C jako wejście
PORTC |= 0xff; //podwieszenie wejścia

//konfiguracja interfejsu UART
UBRRH =0;
UBRRL =38; //ustalenie prędkości transmisji

ADMUX |= (1<<REFS0)|(1<<ADLAR);
ADCSR |= (1<<ADEN)|(1<<ADSC)|(1<<ADFR)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);

UCSRB |= (1<<TXEN); //włączenie nadajnika
UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

int A=0;
int DT, T, S, DZ, J;
int B=20;

do
{
while(! (ADCSR & (1<<ADIF)));
A=ADCH;
A=ADCH * B;
  
J=((((A%10000)%1000)%100)%10)/1;
DZ=(((A%10000)%1000)%100)/10;
S=((A%10000)%1000)/100;
T=(A%10000)/1000;

DT=A/10000;
UDR=T+48;
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC

UDR=S+48;
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC

UDR=DZ+48;
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC

UDR=J+48;
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC

UDR=32;
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}
while(1);
return 0;
}

 

Druga kwestia to magistrala 1-wire

 

 

void reset (void)
{
//magistrala 1-wire jako output
//magistrala 1-wire w stan wysoki
//odczekaj 5us
//magistrala w stan niski
//odczekaj 500us
//magistrala w stan wysoki
/odczekaj 500us – pomijamy odczyt impulsu obecności
}

Tutaj nie wiem jak to ugryźć. Jak wygląda podwieszanie magistrali? Odczekanie to delay, sprawdzenie to coś wymyślę.

Jak by komuś się chciało pomóc to będę wdzięczny. Kolega poprosił o pomoc to sie nie zastanawiam dlaczego po co itp, na pewno miał ku temu powód :)

Link to post
Share on other sites

W pierwszym przykładzie musisz 5x odczytać ADC, zapamiętać, dodać próbki i podzielić przez 5. Czyli deklarujesz 5 elementowy wektor, przepisujesz do niego kolejne wartości z ADC, następnie sumujesz elementy, dzielisz przez ich ilość i wypisujesz wynik jako średnią arytmetyczną. Pamiętaj, że takie działanie wymaga ostatecznie zastosowania float (i bodajże math.h oraz libm.a)

Druga sprawa - po co cyfry określające liczbę jedności, dziesiątek, setek, tysięcy i dziesiątek tysięcy jako INT? To są 8 bitowe mikrokontrolery... tam trzeba uważać na moc obliczeniową i miejsce. Weź zadeklaruj to jako unsigned char albo uint8_t (po dodaniu inttypes.h)

Jeśli chodzi o one wire to jest trochę inaczej niż w innych MCU. Masz w atmedze rejestry PORT, DDR i PIN. Więcej na ten temat znajdziesz w nocie katalogowej i warto się temu przyjrzeć, a ja nie mam zamiaru pisać o rzeczach oczywistych. Nie wiem czy w tej aplikacji jest slave na 1wire w trybie parasite czy nie więc nie mogę napisać jak powinno to wyglądać na 100%, natomiast ustawienie 0 na DQ od strony mastera to ustawienie 0 w odpowiednim bicie PORTx oraz ustawienie 1 w odpowiednim bicie DDRx. Stan wysoki DQ to ustawienie 0 na odpowiednim bicie PORTx oraz 0 na odpowiednim bicie DDRx. Resztą zajmuje się zewnętrzny pull-up 4,7k, w trybie parasite jest dodatkowo konieczność ustawienia PORTx jako 1 i DDRx jako 1. Tyle, odczyt DQ to sprawdzenie stanu odpowiedniego bitu rejestru PINx.

  • Popieram 1
Link to post
Share on other sites

Jest to jakaś podpowiedź! dzięki. jednak jak przeczytałem to 2 i 3 raz to jakoś dalej za bardzo nie kumam.

Liczby tak działają i jest spoko, char chyba nie pasuje bo one nie są całkowite. Ale nie pamiętam jak to było z typami zmiennej.

ADC to masz na mysli ADCH tak?

O portach to wiem, pamiętam, że coś było. Miałem, a teraz kolega ma, te laborki za zasadzie by zobaczyć co jak dziala bez oszczedzania pamięci itp itd. o ile mnie pamięc nie myli to jest 20h w semestrze. powyższy kod jest na ATMega8, wczesniejsze na AT90S8515. tam były jakies bzdury realizowne, np 8 diod i zliczanie cykli i coś tam coś tam. nie pamiętam już :(

 

Tutaj kod na program, który po naciśnieciu pin ma w hyper pokazać daną literę. Jak widać, progam lekko bez sensu bo ilość liter jest zależna od czasu zwracia pin

if (PINB & (_BV(0)));
else
{
UDR='a';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}
if (PINB & (_BV(1)));
else
{
UDR='b';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}
if (PINB & (_BV(2)));
else
{
UDR='c';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}

if (PINB & (_BV(3)));
else
{
UDR='d';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}
if (PINB & (_BV(4)));
else
{
UDR='e';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}
if (PINB & (_BV(5)));
else
{
UDR='f';
while(! (UCSRA & (1<<TXC))); //oczekiwanie na ustawienie bitu TXC
UCSRA |= (1<<TXC); //wyzerowanie flagi TXC
}

No nic, postaram się mu coś ogarnać z tą poprawą dokładności a z drugim to juz powalczy na zajęciach :)

Link to post
Share on other sites
  • 2 tygodnie później...

Z tego co pamiętam to zawsze można spotkać się z tłumaczeniem, że skoro ja sie musiałem uczyć to niech inni też się uczą. Jednak ani on ani ja nie jesteśmy na informatyce i przedmioty typu programowanie jest raczej na zasadzie zaliczenia.

Aha, a na filologi hebrajskiej jesteście ? Prawdopodobnie kolejne osoby, które po ukończeniu studiów, będą wołać, że nie mają pracy, a studia skończyli. Nikt nie zapłaci 5000 zł osobie, która nic nie potrafi, a studia skończone poprzez kombinacje nic nie znaczą. Masz przedmiot - uczysz się, choćbyś miał zdać za 10 razem. Kombinujesz i się nie uczysz ? Wybierasz problemy z pracą po studiach. Tyle w temacie. Mi to nie przeszkadza, bo dzięki temu mam mniejszą konkurencję.

Edytowane przez jacek_placek
Link to post
Share on other sites

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Odpowiedz w tym wątku...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...