Skocz do zawartości

leh_16

Użytkownicy
  • Zawartość

    17
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O leh_16

  • Ranga
    2/10

Informacje

  • Płeć
    Mężczyzna
  1. Doszedłem w końcu do tego jak wysłać chociaż jedną ramkę dzięki małej pomocy. Opisuje to tutaj by forumowicze którzy tego szukają mogli to odnaleźć. Przy symulacji używałem Real Term a kod do programu wygląda tak: #include<avr/io.h> #include<util/delay.h> #define F_CPU 8000000UL #define USART_BAUDRATE 9600 #define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) void wyslij_bajt(unsigned char bajt); void wyslij_bajt(unsigned char bajt) { UDR=bajt; //wyślij bajt while(!(UCSRA&0x20));// czekaj na wysłanie } void ustaw_USART(void) { UBRRH=(BAUD_PRESCALE>>8); UBRRL=BAUD_PRESCALE; UCSRB =_BV(RXEN)|_BV(TXEN); // włączenie odbiornika RX i nadajnika TX UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //8-n-1 } int main() { ustaw_USART(); DDRB|=0xff; while(1) { wyslij_bajt(0xaa); //start wyslij_bajt(0x0c); //Mini Maestro 12 wyslij_bajt(0x04); //komenda _ ustaw pozycje wyslij_bajt(0x00); //kanał 0 /*pozycja neutralna*/ wyslij_bajt(0x70); wyslij_bajt(0x2e); } } Mam nadzieje że pomoże i prosze bardziej doświadczonych o sprawdzenie
  2. I jeszcze co mnie trapi to fakt że za każdym razem jak próbuje program to na mini maestro świeci sie czerwona i mruga żółta
  3. Chce tak zrobić tylko powiedz mi czy takie ustawienie USART jest dobre: void ustaw_USART(void) { UBRRL=51; UCSRB =_BV(RXEN)|_BV(TXEN); // włączenie odbiornika RX i nadajnika TX UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); // transmisja 8N1 }
  4. No właśnie te wartości i wystarczy wpisac np 51 to UBRRL?? A jak rozwiązać to z UBRRH żeby tam się nic nie wpisywało
  5. Wpisuje tą wartość do UBRRL ale i tak zas mi sie zmienia UBRRH (w symulacji) tak jak UCSRC mimo że ustawiam URSEL. A w dokumentacji ta wartość jest podana heksadecymalnie czy dziesiętnie?
  6. Mam taki problem że gdy wpisuje UBBRH to wpisuje się w symulacji ta sama wartośc też do UCSRC mimo ustawienia bitu URSEL. Wg datasheet atmega8 dla zegara 8MHz oraz predkosci uart 9600 do UBRR nalezy wpisac 51 wiec wystarczy gdy to wpisze do UBRRL?
  7. No wiadomo że też tak może być ale w symulacji wszystkie bity rejestrów są ustawione tak jak wyżej. Mój kod wygląda mniej więcej o tak : #include<avr/io.h> #include<util/delay.h> #define UART_BAUD 9600 static void UART_init() { UCSRB|=0x18;//ustawienie RXEN i TXEN UCSRC|=0x8e;//ustawienie URSEL UMSEL UCSZ0 UCSZ1 UCSRC|=0x04;//ustawienie USBS } int main() { UART_init(); DDRB|=0xff; while(UCSRA&0x20)//jeżeli UDR jest pusty { _delay_ms(1000); UDR=0xaa;//Bajt startu while(UCSRA&=~0x20);// oczekiwanie na wysłanie UDR=0x0c;// Mini maestro 12 while(UCSRA &=(1<<TXC)); UDR=0x04;//Komenda ustaw pozycje while(UCSRA &=(1<<TXC)); UDR=0x00;//kanał 0 while(UCSRA &=(1<<TXC)); UDR=0x70; // pozycja neutralna dla serwa while(UCSRA &=(1<<TXC)); 0UDR=0x2e; while(UCSRA &=(1<<TXC)); _delay_ms(1000); /*analogicznie druga część*/ UDR=0xaa; while(UCSRA&=~0x20); UDR=0x0c; while(UCSRA&=~0x20); UDR=0x04; while(UCSRA&=~0x20); UDR=0x00; while(UCSRA&=~0x20); UDR=0x40; while(UCSRA&=~0x20); UDR=0x2e; while(UCSRA&=~0x20); _delay_ms(1000); } }
  8. Programowo mam ustawione URSEL UMSEL UCSZ0 UCSZ1 RXEN oraz TXEN i WUSBS więc nie wiem czego tu jeszcze może brakować
  9. A co do tej transmisji dla PIC18 jak się ona rózni dla ATmega8 bo próbuje wysyłać te same wartości i Maestro nie reaguje
  10. Napisałem prosty program aby sterowac serwem zeby w ustawial sie kolejno w dwoch pozycja po okreslonym czasie tylko ze przy podłaczeniu z mini maestro serwo jest martwe dosłownie. Co zrobiłem źle przy transmisji UART? #include<avr/io.h> #include<util/delay.h> #define UART_BAUD 9600 static void UART_init() { UCSRB|=0x18;//ustawienie RXEN i TXEN UCSRC|=0x8e;//ustawienie URSEL UMSEL UCSZ0 UCSZ1 UCSRC|=0x40;//ustawienie USBS } int main() { UART_init(); DDRB|=0xff; while(UCSRA&0x20)//jeżeli UDR jest pusty { _delay_ms(1000); UDR=0xaa;//Bajt startu while(UCSRA&=~0x20);// oczekiwanie na wysłanie UDR=0x0c;// Mini maestro 12 while(UCSRA &=(1<<TXC)); UDR=0x04;//Komenda ustaw pozycje while(UCSRA &=(1<<TXC)); UDR=0x00;//kanał 0 while(UCSRA &=(1<<TXC)); UDR=0x70; // pozycja neutralna dla serwa while(UCSRA &=(1<<TXC)); 0UDR=0x2e; while(UCSRA &=(1<<TXC)); _delay_ms(1000); /*analogicznie druga część*/ UDR=0xaa; while(UCSRA&=~0x20); UDR=0x0c; while(UCSRA&=~0x20); UDR=0x04; while(UCSRA&=~0x20); UDR=0x00; while(UCSRA&=~0x20); UDR=0x40; while(UCSRA&=~0x20); UDR=0x2e; while(UCSRA&=~0x20); _delay_ms(1000); } }
  11. Sądze, że trafiłem do odpowiedniego miejsca... otóż złapałem ostatnio bakcyla (m.in dzięki forbotowi) i zabrałem się za projekt manipulatora. Na razie mam w planie zrobienie sterowania z Joysticka. Już nauczyłem się używać przerwań przede mną jeszcze UART. Do rzeczy... Posiadam sterownik serw Mini maestro i Atmege 8 i chciałbym się dowiedzieć na jakiej zasadzie działa zapamiętywanie ruchów. Już od kilku dni mnie to męczy i nie mam bladego pojęcia. Pomożecie?
  12. Dzięki panowie pomogliście. W razie wątpliwości będe pytał. Wiem że to nie ten temat ale gdzie mógłbym znaleźć sposób połączenia joysticka do ps2 z atmega:D
  13. No tak jest też dodatkowo oprogramowanie ale do Windowsa a mi chodzi o sterowanie z uC. Jak mu ustawić pozycje. Bo w SK było przesyłanie ramki.
  14. Wiem też, że sterowanie serwokontrolerem SK18 odbywa się za pomocą ramki, gdzie wysyła się 4 bajty z informacją jakie serwo gdzie i z jaką prędkością ma iść. A jak sprawa się ma z mini maestro. I czy jest jakaś różnica między łączeniem się z komputerem przez port RS232, a USB tak jak jest z mini maestro?
×
×
  • Utwórz nowe...