Skocz do zawartości

starcu

Użytkownicy
  • Zawartość

    15
  • Rejestracja

  • Ostatnio

Wszystko napisane przez starcu

  1. Nie jestem pewien czy którykolwiek z wymienionych w twoim poście parametrów to parametr sygnału prostokątnego. Nie posiadasz pełnej treści zadania takiej jaką podał wam prowadzący, bo nie chce mi się wierzyć, że brzmiała wprost w ten sposób?
  2. Na jaki uC piszesz program? Najlepiej też wklej swój kod tutaj żeby rzucić okiem czy wszystko jest ok.
  3. Witam, mam pytanie, chciałbym odczytać na jednym timerze dwa sygnały PWM. Wydaje mi się, że można to zrobić skoro jeden timer posiada 4 kanały, jednak nie potrafię skonfigurować go w ten sposób a zwyczajnie podłączenie dwóch sygnałów do timera daje wpływające na siebie pomiary. Wydaje mi się, że należy inaczej niż dla jednego sygnału skonstruować callback, ale nie wiem jeszcze jak to zrobić. Realizował ktoś kiedyś coś takiego i mógłby mi podsunąć jakiś pomysł? A co do poradnika to jest ekstra i czekam na kolejną część, pozdrawiam!
  4. Jeżeli ktoś miałby kiedyś problem z f-cją pow() to znalazłem rozwiązanie. Należy odznaczyć użycie -lm w linkerze i dodać ręcznie do linkera (kolumna z literą -l) "c" oraz "m" w takiej kolejności.
  5. Jeśli tak go dodaję to wyrzuca mi 18 błędów m.in. unknown type name 'uint32_t' .
  6. Dopiero teraz zrobiłem jak mówiłeś i po stworzeniu pliku "dodatkowy.c" wyrzuca błąd, że nie może znaleźć odwołania do funkcji mimo, że dołączam w main'ie i nowym pliku "dodatkowy.c" nagłówkowy plik "dodatkowy.h", w którym są deklaracje funkcji i zmiennych. W pliku "dodatkowy.c" wrzuciłem tylko realizacje funkcji i jak pisałem wcześniej odnośnik do pliku .h. W przypadku jakiegokolwiek programu w C taka opcja działa, ale dla projektu z CubeMX nie chce. Dodam, że po dodaniu pliku "dodatkowy.c" do listy plików linkowanych kompilator wyrzuca masę błędów.
  7. Obie funkcje znajdują się w pliku dodatkowy.h a w pliku main.c dołączam je za pomocą: #include "dodatkowy.h"
  8. Witam, mam problem z przekazaniem do funkcji pow() wartości zwracanej prze inna funkcję. Funkcja zwracająca wartość ma postać: uin32_t foo() { uin32_t a = 2.5 + 2.32; return a; } Natomiast funkcja wykorzystująca zwracaną przez nią wartość: float foo2() { float b = foo(); float c = pow(b, 1.9); return c; } Obie funkcje znajdują się w pliku nagłówkowym dołączonym do pliku głównego. Do teraz program przy kompilacji nie zwraca żadnego błędu, ale gdy chcę użyć funkcji foo2 w pętli while eclipse zwraca błąd, który nie ma opisu oprócz nazwy Error1 i nazwy pliku .elf w nawiasach kwadratowych. Jednakże kiedy wyrzucę funkcję foo z argumentu pow() i zmienię funkcję foo2 na: float foo2() { float b = 2.464534535; float c = pow(b, 1.9); return c; } wszystko działa bez problemu. Nie mogę poradzić sobie z tym błędem a wykorzystanie tej funkcji jest w moim programie niezbędne, więc proszę o pomoc. Dodam, że błąd nie występuje przy wykorzystanie biblioteki standardowej dla STM32F103TBU6 i tutaj funkcja oblicza wartość bez problemu, ale dla HAL'a generowanego przez CubeMX nie chce działać mimo identycznej jak wcześniej implementacji. Korzystam z SW4STM32 zainstalowanego jako dodatek do Eclipe Luna i CubeMX 4.15.0.
  9. Po pojawieniu się kursu programowania stm32 postanowiłem podszkolić się w programowaniu tych mikroprocków i utknąłem na obsłudze i2c. Próbuje odczytać dane z modułu MPU6050, ale nie udaje mi się to. W debugerze zauważyłem, że program zatrzymuje się na pętli while w jednej z funkcji obsługującej i2c. Poniżej zamieszczam kod, w którego komentarzach zaznaczyłem gdzie jest problem. Plik "mpu6050.h": /* * mpu6050.h * * Created on: 13 mar 2016 * Author: Łukasz */ #ifndef MPU6050_H_ #define MPU6050_H_ #include "stm32f10x.h" #define MPU6050_ADDRESS ((uint16_t)(0x69)) #define MPU6050_RA_WHO_AM_I ((uint16_t)(0x75)) void mpu_set_reg(uint8_t reg){ I2C_GenerateSTART(I2C1, ENABLE); //start i2c while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS); //dziala ok I2C_Send7bitAddress(I2C1, MPU6050_ADDRESS, I2C_Direction_Transmitter); while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS); //zatrzymuje sie tutaj, flag1 w I2C_CheckEvent wynosi 1024 zamiast 2 I2C_SendData(I2C1, 0x80 | reg); //dlazcego tu jest 0x80??? while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS); } void mpu_write(uint8_t reg, const void* data, int size){ int i; const uint8_t* buffer = (uint8_t*)data; mpu_set_reg(reg); for (i = 0; i < size; i++) { I2C_SendData(I2C1, buffer[i]); while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTING) != SUCCESS); } I2C_GenerateSTOP(I2C1, ENABLE); } void mpu_read(uint8_t reg, void* data, int size){ int i; uint8_t* buffer = (uint8_t*)data; mpu_set_reg(reg); I2C_GenerateSTART(I2C1, ENABLE); while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT) != SUCCESS); I2C_AcknowledgeConfig(I2C1, ENABLE); I2C_Send7bitAddress(I2C1, MPU6050_ADDRESS, I2C_Direction_Receiver); while (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) != SUCCESS); for (i = 0; i < size - 1; i++) { while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS); buffer[i] = I2C_ReceiveData(I2C1); } I2C_AcknowledgeConfig(I2C1, DISABLE); I2C_GenerateSTOP(I2C1, ENABLE); while(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED) != SUCCESS); buffer[i] = I2C_ReceiveData(I2C1); } #endif /* MPU6050_H_ */ Plik "main.c": /** ****************************************************************************** * @file main.c * @author Lukasz S. * @version V1.0 * @date 01-December-2013 * @brief Default main function. ****************************************************************************** */ #include "stm32f10x.h" #include "mpu6050.h" #include "uart.h" #include <stdio.h> volatile uint32_t timer_ms = 0; void SysTick_Handler(){ if (timer_ms) { timer_ms--; } } void delay_ms(int time){ timer_ms = time*1000; while (timer_ms) { SysTick_Handler(); } } int main(void){ GPIO_InitTypeDef gpio; I2C_InitTypeDef i2c; USART_InitTypeDef uart; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); GPIO_StructInit(&gpio); gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); gpio.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_4; gpio.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &gpio); USART_StructInit(&uart); uart.USART_BaudRate = 115200; USART_Init(USART2, &uart); USART_Cmd(USART2, ENABLE); gpio.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; // SCL, SDA gpio.GPIO_Mode = GPIO_Mode_AF_OD; gpio.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &gpio); I2C_StructInit(&i2c); i2c.I2C_Ack = I2C_Ack_Enable; i2c.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; i2c.I2C_Mode = I2C_Mode_I2C; i2c.I2C_OwnAddress1 = 0; I2C_Init(I2C1, &i2c); I2C_Cmd(I2C1, ENABLE); unsigned char who_am=0; while(1){ mpu_read(MPU6050_RA_WHO_AM_I, &who_am, sizeof(who_am)); if(who_am==0x68){ printf("Znaleziono modul.\n"); }else{ printf("Niepoprawna odpowiedz ukladu.\n"); } //printf("Hello world!\r\n"); GPIO_SetBits(GPIOA, GPIO_Pin_4); GPIO_ResetBits(GPIOA, GPIO_Pin_5); delay_ms(500); GPIO_ResetBits(GPIOA, GPIO_Pin_4); GPIO_SetBits(GPIOA, GPIO_Pin_5); delay_ms(500); } } Ponadto nie rozumiem dlaczego wykonano or z 0x80 na rejestrze. [ Dodano: 15-03-2016, 22:36 ] Udało mi się dojąć poprzez debugger, ze błąd zwracany przez i2c ma kod 0x0400 co oznacza "acknowledge failure", spotkał się ktoś z czymś takim? [ Dodano: 16-03-2016, 10:41 ] Ok, wszystko działa, miałem ustawiony adres urządzenia 0x69 zamiast 0x68, a mógłbym przysiąc, że to już wcześniej sprawdzałem.
  10. Wszystko działa, dziękuję, nie wiem jak mogłem przeoczyć ten poradnik.
  11. Witam, chciałbym wymieniać dane między dwoma Arduino przez bluetooth. Mam dwa moduły HC-05, ale mają one niewielki zasięg, posiadam również jeden moduł BTM222, który z anteną ma zasięg do 100 metrów, ale po ustawieniach go komendami AT nie chce on się sparować z HC-05. W internecie nie mogę znaleźć informacji czy jest taka możliwość i chciałbym się dowiedzieć czy może ktoś kiedyś parował te moduły, lub wie czy jest taka możliwość?
  12. Dziękuję za odpowiedź, czy ten schemat sterowania takim silnikiem byłby ok: Posiadam tranzystor irfy44e, rozumiem, że nie przyda mi się on bo jego Rds(on) jest podane dla 10V a ja muszę mieć 5V zgodnie z logiką uC, jaki w takim razie mosfet, z waszego doświadczenia, będzie dobry? Czy równoległa do silnika dioda o parametrach 5A, 1000V będzie odpowiednia? Znalazłem w internecie wzmiankę, że rezystor między bramką a masą ma mieć wartość od 47k do 100k, natomiast jaką wartość najlepiej dobrać dla rezystora uC->bramka? Sorry za banalne pytania, ale w internecie jest tyle różnych opinii, że ciężko coś z nich bezpośrednio wywnioskować.
  13. Witam, posiadam stary, działający quadrocopter i na jego bazie chciałbym zbudować do niego autorski sterownik. Moim problemem jest to, że nie wiem jaki mostek H wykorzystać do sterowania prędkością obrotową za pomocą PWM z atmegi328p. Silniki działają na baterii LiPo 3,7V, czy dwa scalaki L293D będą do nich dobre? Czy lepiej zbudować własny mostek na mosfetach jak np. ten z obrazka poniżej?
  14. Dzięki wielkie za pomoc, już wszystko działa. Rzeczywiście problemem był głównie URSEL, a żeby przejść z 2 bitów stopu na jeden bezmyślnie niechcący skasowałem jeden z bitów UCSZ robiąc ramkę 6-bitową. Gdy kiedyś będę miał jakiś problem to opiszę go lepiej, jeszcze raz dziękuję.
  15. Witam, próbuję napisać program obsługujący UART w mojej atmedze8. Na atmega328p nie mam żadnych z tym problemów, ale do 8 już nie mam siły. Mój mikrokontroler to czysta atmega8 bez zewnętrznego kwarcu, próbowałem różnych ustawień BAUD i nic. Mój kod .c: #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> #include "USART.h" int main (void) { DDRD |= 0xff; USART_Init(MYUBRR); while(1){ USART_Send_string("hello world \n"); _delay_ms(500); } return 0; } Mój kod .h /* * USART.h * * Created: 2015-09-16 16:03:58 * Author: Łukasz */ #ifndef USART_H_ #define USART_H_ #define FOSC 1000000 #define BAUD 9600 //baud #define MYUBRR (((FOSC / (BAUD * 16L))) - 1) //inaczej: (((((FOSC * 10) / (16L * BAUD)) + 5) / 10) - 1) //UBR ratio void USART_Init( unsigned int ubrr); void USART_Sendbyte( uint8_t data ); void USART_Send_string(const char *str); void USART_Send_int(unsigned int d); unsigned char USART_Receive( void ); void USART_Init( unsigned int ubrr){ /*Set baud rate */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; //wlaczenie rx-receiver i tx-transmitter UCSRB = (1<<RXEN)|(1<<TXEN); //UCSRB = (1 << RXCIE); //przerwanie gdy ramka zostanie odebrana // ramka 8bitowa z 1 bitem stopu UCSRC = (1<<USBS)|(1<<UCSZ0); } void USART_Sendbyte(uint8_t data){ /* czekaj az bufor sie wyczysci */ while ( !( UCSRA & (1<<UDRE)) ) ; /* dane do bufora i wyslanie danych */ UDR = data; } void USART_Send_string(const char *str){ while (*str) USART_Sendbyte(*str++); } #endif /* USART_H_ */
×
×
  • Utwórz nowe...