Skocz do zawartości

damian11

Użytkownicy
  • Zawartość

    9
  • Rejestracja

  • Ostatnio

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Warszawa

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

Osiągnięcia użytkownika damian11

Odkrywca

Odkrywca (4/19)

  • Za 5 postów
  • To już rok!
  • To już 5 lat!

Odznaki

1

Reputacja

  1. Program odczytuje dwa kanały ADC, używa DMA, wysyła wynik na terminal. Reszta funkcji jest ok, sprawdzałem. Różnicę robi tylko konfig_TXRX(), gdy użyję tej funkcji nic się nie pojawia na terminalu, jak temu zaradzić 🙂 ? W sumie nie sprawia mi to tak dużej różnicy czy te parę linijek będzie w funkji czy nie, ale chcę wiedzieć na przyszłość z czego wynika to, że mi to teraz nie działa 😋 #include <stdio.h> #include <stdint.h> #include "stm32f10x.h" #include "konfig.h" volatile uint32_t timer_ms = 0; void SysTick_Handler() { if (timer_ms) timer_ms--; } void delay_ms(int time) { timer_ms = time; while (timer_ms); } /* void konfig_TXRX(GPIO_InitTypeDef gpio) { //RX LINE gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_Init(GPIOA, &gpio); //TX LINE gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); }*/ int main(void) { //deklaracja struktur konfiguracyjnych GPIO_InitTypeDef gpio; USART_InitTypeDef uart; DMA_InitTypeDef dma; ADC_InitTypeDef adc; konfig_RCC(); konfig_ADC(&gpio,&adc); konfig_SysTick(); konfig_USART(&uart); //konfig_TXRX(&gpio); konfig_DMA(&dma); konfig_LED(&gpio); //RX LINE gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &gpio); //TX LINE gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); extern uint16_t adc_value[ADC_CHANNELS]; while (1) { int i; for (i = 0; i < ADC_CHANNELS;i++) printf("ADC%d = %d\n", i, adc_value[i]); GPIO_SetBits(GPIOA, GPIO_Pin_5); delay_ms(100); GPIO_ResetBits(GPIOA, GPIO_Pin_5); delay_ms(400); } }
  2. Cześć. Mam dziwny problem z konfiguracją pinów TX oraz RX. Otóż, gdy ten sam kod jest po prostu w funkcji main wszystko działa poprawnie, natomiast gdy umieszczę go w funkcji to STM przestaje przesyłać cokolwiek. Zamieszczam poniżej wspomniany kod: void konfig_TXRX(GPIO_InitTypeDef gpio) { //RX LINE gpio.GPIO_Pin = GPIO_Pin_2; gpio.GPIO_Mode = GPIO_Mode_AF_PP; //GPIO_Init(GPIOA, &gpio); //TX LINE gpio.GPIO_Pin = GPIO_Pin_3; gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &gpio); } Próbowałem też odwołania do zmiennej gpio przez referencję jako (GPIO_InitTypeDef* gpio), nic to nie dało. Mam wrażenie jakby funkcja GPIO_Init() nie ustawiała na porcie tego co jest zapisane w liniach wyżej, tylko nie wiem dlaczego. Proszę o wyjaśnienie 😋
  3. [Dodatkowy kwarc] Czy ktoś próbował dołączyć do płytki wspomniany w artykule kwarc x3 zwiększający częstotliwość taktowania do 72 MHz ? Czy wystarczy dolutować ten element czy należy również zmieniać coś software'owo ?
  4. Treker nie marudź tylko wrzucaj kolejną część ;D
  5. Zadanie domowe 6.1 #define BUTTON 7 #define FOT1 A0 #define FOT2 A1 #define POT A2 int fotorez1=0 ,fotorez2=0, potentat=0; byte licznik=1; void setup() { Serial.begin(9600); pinMode(BUTTON,INPUT_PULLUP); //pin pod guzik } void loop() { fotorez1= analogRead(A0); //odczyt wartosci przez ADC fotorez2= analogRead(A1); potentat= analogRead(A2); if(digitalRead(BUTTON)==LOW)//jesli guzik wcisniety, wypisz dane { Serial.print("Fotorezystor 1: "); Serial.print(fotorez1); Serial.print("\t, fotorezystor 2: "); Serial.print(fotorez2); Serial.print("\t, potencjometr: "); Serial.print(potentat); Serial.print(",\t przycisk wcisnieto "); Serial.print(licznik); Serial.print("\t razy \n"); ++licznik; while(digitalRead(BUTTON)==LOW) ; //petla wstrzymujaca program na czas wcisniecia } delay(50);//male opoznienie dla wygody } Może formatowanie nie jest idealne, ale to szczegół [ Dodano: 20-07-2015, 23:16 ] Zadanie domowe 6.2 Pod podanym linkiem nie ma zadania o numerze 2.3, więc nie bardzo wiem o co chodzi 😋
  6. Treker przerabiając 5-tą część kursu spotkałem się z tym samym problemem co Aylard. Podłączałem wszystko tak jak na schemacie, który tam był umieszczony, Aylard tu też tak miał. Dopiero teraz wiem, że schemat był po prostu zły, gdyż nie ma na nim kondensatorów 🙂. Polecam to poprawić, gdyż sam się nieźle przez to nadenerwowałem 😋
  7. Jeżeli poprawnie zrozumiałem polecenia, programy powinny być OK. Co do zadania 5.2 powiem szczerze, że przerobiłem tylko trochę przykładowy kod znajdujący się na stronie, więc zadanie było rozwiązane dla konkretnego przypadku. Zaznaczam, że nie jestem mistrzem programowania, ale wydaje mi się, że tak jest dobrze : #define LED 9 int wypelnienie = 0; int zmiana = 4; void setup() { pinMode(LED,OUTPUT); } void loop() { analogWrite(LED,wypelnienie); if(wypelnienie<255) { wypelnienie+= zmiana; } if( wypelnienie>=255) { while(wypelnienie!=0 && wypelnienie>0) { wypelnienie-=zmiana; analogWrite(LED,wypelnienie); delay(50); } } delay(50); } A i dzięki Treker za uwagę co do tagów 😋
  8. Zadanie domowe 5.5 #include <Servo.h> #define SERVO_PIN A5 int odczytADC; int kat; Servo servo; void setup() { servo.attach(9); Serial.begin(9600); Serial.println("Zmien kat za pomoca potencjometru"); } void loop() { odczytADC = analogRead(SERVO_PIN); kat = map(odczytADC,0,1023,0,180); //Serial.println(kat); servo.write(kat); delay(50); }
  9. Zadanie domowe 5.1 Wystarczy zamienić typ zmiennej wypełnienie na byte i usunąć warunek 🙂 Zadanie domowe 5.2 Pewnie da się prościej, ale proszę : #define LED 9 int wypelnienie = 0; int zmiana = 5; void setup() { pinMode(LED,OUTPUT); } void loop() { analogWrite(LED,wypelnienie); if(wypelnienie<255) { wypelnienie+= zmiana; } if( wypelnienie==255) { while(wypelnienie!=0) { wypelnienie-=zmiana; analogWrite(LED,wypelnienie); delay(50); } } delay(50); } Liczę, że pojawi się kolejna część kursu o wyświetlaczu LCD 🙂 [ Dodano: 16-07-2015, 12:58 ] Zadanie domowe 5.3 🙂 #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwo; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa int pozycja = 0; //Aktualna pozycja serwa 0-180 int zmiana = 6; //Co ile ma się zmieniać pozycja serwa? int przerwa = 200; void setup() { serwo.attach(9); //Serwomechanizm podłączony do pinu 9 } void loop() { if (pozycja < 180) { //Jeśli pozycja mieści się w zakresie delay(przerwa); serwo.write(pozycja); //Wykonaj ruch } else { //Jeśli nie, to powrót na początek pozycja = 0; przerwa = 0; } pozycja += zmiana; //Zwiększenie aktualnej pozycji serwa przerwa += 50; } [size=9][ [i][b]Dodano[/b]: 16-07-2015, 16:37[/i] ][/size] Zadanie domowe 5.4 #include <Servo.h> String katS; byte kat; Servo servo; void setup() { servo.attach(9); Serial.begin(9600); Serial.println("Podaj kat jaki chcesz ustawic :)"); } void loop() { if(Serial.available()>0) { katS = Serial.readStringUntil('\n'); kat = katS.toInt(); if(kat<=180 && kat>=0) { servo.write(kat); Serial.println("Gotowe! Ustawiony kat to: "+ katS); } else Serial.println("Kat powinien miec wartosc <0:180> !"); } delay(50); }
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.