soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Proszę bardzo : Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 I spodziewasz się, że malutki procesorek tiny26 ma te wszystkie porty, rejestry i bity? Poza tym wypadałoby kod włożyć do jakiejś funkcji, main() chociażby. Na najwyższym poziomie spodziewane są jedynie deklaracje nowych obiektów: stałych, zmiennych, funkcji itp. Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Tiny 26 to tylko nazwa pliku bo wpakowałem w kod który wcześniej był do tej atmegi. Sam kod jest ustawiony na Atmegę 32 sprawdzałem 5x Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 No a jak się odnosisz do drugiego i trzeciego zdania? Rozumiesz je? Soban, czy to na pewno ekran Twojego komputera? Po lewej stronie widzę projekty typu "system wielozadaniowy" i "serwer www" a w okienku edycji taka kicha.. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
gohandi Marzec 18, 2012 Udostępnij Marzec 18, 2012 soban, Dziwne jest to co Ty mówisz. Na ZDJĘCIU są widoczne tylko dwa wyprowadzenia, oba czarne. Dopiero silnik podany przez Ciebie w linku do HobbyKing ma 3 wyprowadzenia. Popraw to bo wprowadza w błąd. Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 To są programy dołączone do książki o programowaniu. Usunąłem jeden z nich stąd nazwa Attiny... zmieniłem kod na ten z forum ustawiłem Atmegę32 no i...? Teraz mój kod wygląda tak: #include<avr/io.h> #include <util/delay.h> int main(void) { //Ustawienie wyjsc DDRB |= (1<<PB6) | (1<<PB5); DDRE |= (1<<PC4) | (1<<PC3); /** * Konfiguracja timerow 1 i 3: * prescaler = 8 * tryb = Phase and Frequency Correct mode * ustwienie wyjsc OC1A, OC1B, OC3A, OC3B */ TCCR1A = (1<<COM1A1) | (1<<COM1B1); TCCR3A = (1<<COM3A1) | (1<<COM3B1); TCCR1B = (1<<WGM13) | (1<<CS11); TCCR3B = (1<<WGM33) | (1<<CS31); //Wartosc TOP ICR1 = 20000; ICR3 = 20000; } Niestety konsola dalej pokazuje błędy: **** Build of configuration Release for project tiny26_VA **** make all Building file: ../main.c Invoking: AVR Compiler avr-gcc -Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega32 -DF_CPU=11059200UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c" ../main.c: In function 'main': ../main.c:8: error: 'DDRE' undeclared (first use in this function) ../main.c:8: error: (Each undeclared identifier is reported only once ../main.c:8: error: for each function it appears in.) ../main.c:17: error: 'TCCR3A' undeclared (first use in this function) ../main.c:17: error: 'COM3A1' undeclared (first use in this function) ../main.c:17: error: 'COM3B1' undeclared (first use in this function) ../main.c:19: error: 'TCCR3B' undeclared (first use in this function) ../main.c:19: error: 'WGM33' undeclared (first use in this function) ../main.c:19: error: 'CS31' undeclared (first use in this function) ../main.c:22: error: 'ICR3' undeclared (first use in this function) make: *** [main.o] Error 1 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 A Ty w ogóle widziałeś na oczy ATmegę32? Zauważyłeś gdzieś w niej PORTE, bo jakoś tak liczę na palcach i nóżek mi brakuje na piąty port.. To samo z pozostałymi zasobami o których przypomniał Ci kompilator. Że o czytaniu karty katalogowej nie wspomnę. Czyli tak: chcesz gotowy kod konkretnie na ATMegę32, tak? Bez wnikania w to co robi, jak i dlaczego? Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Ok pozmieniałem trochę danych według twoich zastrzeżeń: #include#include int main(void) { //Ustawienie wyjsc DDRB |= (1< DDRC |= (1< /** * Konfiguracja timerow 1 i 3: * prescaler = 8 * tryb = Phase and Frequency Correct mode * ustwienie wyjsc OC1A, OC1B, OC3A, OC3B */ TCCR1A = (1< TCCR1B = (1< while(1) { //Wartosc TOP ICR1 = 20000; } Co dalej? Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 Rozumiem, że program się kompiluje bezbłędnie? To teraz przepisz go prawie zupełnie od nowa wg poniższego: Po kolei od ogółu do szczegółu: - Do wysterowania regulatora potrzebujesz przebiegu PPM, którego specyfikację znasz. - Do wygenerowanie tego przebiegu właśnie spróbowałeś użyć Timera 1. Blok tego timera ma wbudowany m.in. sprzętowy generator PWM. Najpierw musisz nam powiedzieć, jaki masz zegar procesora - od tego zależy całe taktowanie. Załóżmy, że jest to F_CPU wyrażone w [Hz]. - Sam licznik Timera 1 napędzany jest zegarem procesora podzielonym przez tzw. prescaler, ustawiany 3 bitami CS12-CS10 w rejestrze TCCR1B. Jeżeli ustawisz te bity np. na 010 to dostaniesz podział przez 8 - wszystko jest w tabelkach. Jeśli F_CPU=8MHz, to timer będzie nam liczył 8 razy wolniej, czyli 1MHz, czyli pojedyńcze mikrosekundy. - Oprócz prescalera musisz też ustawić tryb pracy Timera. Jest ich dużo ale Ciebie interesują te z PWM w nazwie. Tutaj raczej będziesz musiał użyć takiego, w którym da się manipulować okresem przebiegu wyjściowego bo nie zawsze wartości domyślne dadzą ci wymarzone 20ms. Jak dla mnie wystarczy tryb 14. Tryb ustawiasz 4 bitami WGM rozrzuconymi niestety po rejestrach TCCR1A i TCCR1B. - Okres tak ustawionego Timera 1 określasz liczbą wpisaną do rejestru ICR - to jest prawdą tylko dla kilku, ale nie wszystkich trybów! Jeśli chcesz mieć z Timera taktowanego 1MHz okres 20ms musisz go zmusić do zliczenia do 20000 - to wpisujesz do ICR, proste. - Żeby timer mógł PPM generować, musi być też ustawiony na wyjście odpowiedni bit portu. Wyjścia Timera 1 to OC1A i OC1B "widoczne" odpowiednio na PD5 i PD4 - muszą być wyjściami. - Teraz już tylko pozostaje pozwolić Timerowi na korzystanie z portów wyjściowych - to kolejne 4 bity COM1Ax i COM1Bx w rejestrze TCCR1A i mamy przebieg PWM. Tobie potrzebne jest ustawienie COM1A1=1 i COM1A0=0 - wtedy dostaniesz przebieg PWM na OC1A, którego wypełnienie będzie wprost proporcjonalne do... - Acha, nie zapomnij o wpisaniu żądanego wypełnienia. Dla przebiegu na OC1A jest to rejestr OCR1A i odpowiednio dla OC1B jest OCR1B. Jeżeli chcesz mieć 1ms, to jest to 1000 "cyknięć" po 1us, czyli wpisujesz do OCR1A=1000. Zbierz to wszystko do kupy, wymyśl stan obu rejestrów TCCR1x i podłącz regler do wybranego wyjścia OC1x. Teraz manipulując wypełnieniem wpisywanym do OCR1A możesz zmieniać wysterowanie regulatora i tym samym obroty silnika. Jeżeli masz szczęście i Twój regler nie potrzebuje żadnej procedury kalibracyjnej (to niestety źle o nim świadczy), jesteś w domu. 1 Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Marzec 18, 2012 Udostępnij Marzec 18, 2012 soban, to jest kod na M128, podmianka rejestrów to już chyba prosta sprawa 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 - Żeby timer mógł PPM generować, musi być też ustawiony na wyjście odpowiedni bit portu. Wyjścia Timera 1 to OC1A i OC1B "widoczne" odpowiednio na PD5 i PD4 - muszą być wyjściami. DDRD |= (1<<PD4) | (1<<PD5); - Teraz już tylko pozostaje pozwolić Timerowi na korzystanie z portów wyjściowych - to kolejne 4 bity COM1Ax i COM1Bx w rejestrze TCCR1A i mamy przebieg PWM. Tobie potrzebne jest ustawienie COM1A1=1 i COM1A0=0 - wtedy dostaniesz przebieg PWM na OC1A, którego wypełnienie będzie wprost proporcjonalne do... - Acha, nie zapomnij o wpisaniu żądanego wypełnienia. Dla przebiegu na OC1A jest to rejestr OCR1A i odpowiednio dla OC1B jest OCR1B. Jeżeli chcesz mieć 1ms, to jest to 1000 "cyknięć" po 1us, czyli wpisujesz do OCR1A=1000. TCCR1A = (1<<COM1A1) | (1<<COM1B1); TCCR1B = (1<<WGM13) | (1<<CS11); while(1) { //Wartosc TOP ICR1 = 20000; } } Jest to bardzo przydatne ale nie rozumiem co dokładnie mam wpisać w tym TCCR1A i TCCR1B ponieważ te funkcje które mam oryginalnie kompletnie nic mi nie mówią : (. Potrzebuję jakiegoś przykładu zastosowania tego co powiedziałeś żeby to ogarnąć : ( Zmieniłem kod na taki patrząc na to co było w rejestrach Atmegi128 i zamieniając z tabelki Atmegi32: #include<avr/io.h> #include <util/delay.h> int main(void) { //Ustawienie wyjsc DDRD |= (1<<PD4) | (1<<PD5); /** * Konfiguracja timerow 1 i 3: * prescaler = 8 * tryb = Phase and Frequency Correct mode * ustwienie wyjsc OC1A, OC1B, OC3A, OC3B */ TCCR1A = (1<<COM1A1) | (1<<COM1B1); TCCR1B = (1<<WGM13) | (1<<CS11); while(1) { //Wartosc TOP ICR1 = 20000; } } Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 "nie rozumiem co dokładnie mam wpisać w tym TCCR1A i TCCR1B ponieważ te funkcje które mam oryginalnie kompletnie nic mi nie mówią" Szkoda, wystarczyło, żebyś zajrzał do karty katalogowej tego procesora. Prędzej czy później będziesz musiał to zrobić. Inaczej co krok zaliczysz kolejne grabie albo ból korzystania z niezrozumiałych gotowców. Proszę bardzo: DDRD = 0x20; TCCR1B = 0; TCNT1 = 0; ICR1 = 20000; OCR1A = 1000; TCCR1A = 0x82; TCCR1B = 0x1A; while(1) { OCR1A = 1000; _delay_ms(1000); OCR1A = 2000; _delay_ms(1000); } Założyłem, że masz zegar 8MHz i regler podłączyłeś do OC1A (PD5). A teraz Ty mi napisz, co wpisy do użytych rejestrów oznaczają i jak to działa. Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Kod nie działa niestety : ( tak na wstępie [ Dodano: 19-03-2012, 00:17 ] A z tego co zdążyłem zobaczyć/przeczytać to: OCR1A/B - Wartość określająca współczynnik wypełnienia OC1A/B - wyjścia PWM TCCR1A/B - Rejestr _delay_ms() - Opóżnienie Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Marzec 18, 2012 Udostępnij Marzec 18, 2012 A jakiego działania spodziewałeś się i jak to zweryfikowałeś? Wciąż nie napisałeś jaki masz zegar procesora i jak to wszystko podłączyłeś. Na wstępie.. czego? Cytuj Link do komentarza Share on other sites More sharing options...
soban Marzec 18, 2012 Autor tematu Udostępnij Marzec 18, 2012 Podłączyłem do PD5 zegar 8MHz Jak masz GG to napisz proszę 4009335 będzie szybciej : ) Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!