Ejdem 2 Napisano 13 Stycznia 2012 Udostępnij Napisano 13 Stycznia 2012 Witam! Dawno się nie bawiłem w jakie kol wiek programowanie tym bardziej z AVR. Znajomy poprosił mnie o pomoc, proste programiki na studiach. Jeśli ktoś zna się na tych klimatach proszę o pomoc. Wrzucę wtedy kody i ew zadanie do wykonania Cytuj Link to post Share on other sites
Promilus 25 Napisano 13 Stycznia 2012 Udostępnij Napisano 13 Stycznia 2012 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ć. Cytuj Link to post Share on other sites
Hans Olo 92 Napisano 13 Stycznia 2012 Udostępnij Napisano 13 Stycznia 2012 (edytowane) 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 13 Stycznia 2012 przez Hans Olo Cytuj Link to post Share on other sites
Ejdem 2 Napisano 13 Stycznia 2012 Autor Udostępnij Napisano 13 Stycznia 2012 (edytowane) @Promilus, Wiem, że ludzie znający się na programowaniu nie są zbyt chętni do pomocy i często mówią o tym, że skoro to zajęcia to rób sam Edytowane 13 Stycznia 2012 przez Ejdem Cytuj Link to post Share on other sites
Promilus 25 Napisano 14 Stycznia 2012 Udostępnij Napisano 14 Stycznia 2012 (edytowane) 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 14 Stycznia 2012 przez Promilus Cytuj Link to post Share on other sites
Ejdem 2 Napisano 14 Stycznia 2012 Autor Udostępnij Napisano 14 Stycznia 2012 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 Cytuj Link to post Share on other sites
Promilus 25 Napisano 14 Stycznia 2012 Udostępnij Napisano 14 Stycznia 2012 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. 1 Cytuj Link to post Share on other sites
Ejdem 2 Napisano 14 Stycznia 2012 Autor Udostępnij Napisano 14 Stycznia 2012 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 Cytuj Link to post Share on other sites
jacek_placek 0 Napisano 23 Stycznia 2012 Udostępnij Napisano 23 Stycznia 2012 (edytowane) 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 23 Stycznia 2012 przez jacek_placek Cytuj Link to post Share on other sites
Recommended Posts
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ą.