Skocz do zawartości

andrews

Użytkownicy
  • Zawartość

    28
  • Rejestracja

  • Ostatnio

Wszystko napisane przez andrews

  1. https://techniczny.net/po-co-jest-i-jak-skonfigurowac-przekierowanie-portow/
  2. W celu dokonania konwersji na string potrzebne jest zarezerwowanie odpowiedniej ilości miejsca w pamięci RAM, w której funkcja itoa będzie mogła umieścić wynik operacji, czyli ciąg znaków. Każdy ciąg znaków w języku C musi kończyć się znakiem terminującym (bajt o wartości 0). Do tego potrzebne jest miejsce na 5 cyfr, co wynika z zakresu wartości, jakie może przyjmować zmienna typu int (jak napisałem wcześniej w przypadku AVR jest to wartość 16-bitowa), no i miejsce na znak minus w przypadku liczb ujemnych. To daje razem 7 znaków. Jest to taka wartość minimalna rozmiaru bufora gwarantująca popr
  3. sprintf na pewno pomoże, jest to funkcja mająca duże możliwości konwersji różnych typów danych oraz formatowania tekstu, jednak jej użycie spowoduje spore zwiększenie rozmiaru kodu wynikowego (czyli zajętości FLASH), co w mniejszych mikrokontrolerach AVR może nie być bez znaczenia. Ponadto użycie tej funkcji może początkującemu programiście sprawić problem. Jeśli chodzi tylko o prostą konwersję liczby całkowitej do ciągu znaków, osobiście proponowałbym funkcję itoa oferowaną przez avr-libc (plik nagłówkowy <stdlib.h>). Przykład użycia: #include <avr/io.h> #include <
  4. To nie jest preprocesor, tylko pliki nagłówkowe, które wykorzystują możliwości preprocesorów standardu C99, bo domyślam się, że z takiego właśnie korzystasz. Zresztą dla C11 też powinno działać. Wchodzisz na stronę https://gitlab.inria.fr/gustedt/p99/. Ściągasz folder o nazwie p99 (oczywiście z zawartością). #include "ścieżka_do_folderu_p99/p99_logical.h" #define STRINGIFY1(x) #x #define STRINGIFY(x) STRINGIFY1(x) #define ILOSC 16 const char PROGMEM napis[]="Wpisz liczbę od zera do " STRINGIFY(P99_MINUS(ILOSC,1));
  5. O jakim dodatkowym preprocesorze piszesz?
  6. Jeśli można, to może ja coś doradzę: https://stackoverflow.com/questions/7126329/how-do-i-stringify-macros-that-are-the-results-of-operations-on-macros
  7. andrews

    Silnik krokowy i Arduino

    Pokaż może jakiś schemat, jak to masz połączone. Jakie napięcie zasilania silnika? Wejścia M0, M1 i M2 masz gdzieś podłączone? Możesz zmierzyć, jakie są na nich napięcia? Dobrze byłoby też, gdybyś mógł zmierzyć faktyczną częstotliwość na wejściu STEP (miernikiem/oscyloskopem), bo może problem jest w taktowaniu mikrokontrolera i generowana przez niego częstotliwość jest niższa od zamierzonej. Możesz mieć np. nieprawidłowo ustawione fusebity i mikrokontroler jest taktowany częstotliwością 1 MHz zamiast 16MHz, co będzie skutkować również 16-krotnie niższą częstotliwością na pinie STEP. Z dru
  8. andrews

    Silnik krokowy i Arduino

    Problemem może być to, że w kółko bardzo szybko wywołujesz funkcję tone(). Funkcję tę powinno się wywołać raz, a działa ona do momentu wywołania funkcji noTone(). Dopiero później można ponownie wywołać funkcję tone(). Spróbuj może czegoś takiego: void loop() { tone(STEP, 800); delay(5000); noTone(); delay(5000); } Silnik powinien się kręcić przez 5 sekund, po czym przez 5 sekund powinie być zatrzymany i tak na zmianę. Nie znam zbytnio Arduino, ale wydaje mi się, że ta funkcja to nie najlepszy sposób sterowania silnikiem krokowym (zależy oczywiście, jaki efekt chce
  9. andrews

    Przerwanie pętli While

    A mi się tak coś wydaje, że może wystarczyłoby w tym kodzie przenieść jeden z nawiasów klamrowych z końca funkcji loop() do linijki następującej po linijce: liczba = odebraneDane.toInt();
  10. Jeśli chodzi o wersję z PROGMEM, to przyczyną nieprawidłowego działania jest funkcja LCD_Write_Text(). Akceptuje ona tylko wskaźniki do pamięci RAM, więc stamtąd są wyświetlane dane, a nie z pamięci FLASH, w której tak na prawdę znajduje się tekst do wyświetlenia. Rozwiązaniem tego błędu może być np. utworzenie dodatkowej funkcji, która będzie odczytywała i wyświetlała dane dane z pamięci FLASH: // dane w pamięci FLASH const char T1[] PROGMEM = "DS1307"; const char T2[] PROGMEM = "TESTER"; const char * const menu[2] PROGMEM = {T1, T2}; // funkcja void LCD_Write_Text_P(const char * Text){
  11. Nie tylko "low level interrupt on INT0" może wybudzić z trybu Power-down. Zgodnie z tabelką 7-1 dokumentacji jak i informacją w punkcie 7.1.2 na stronie 35 do wybudzenia można też użyć Pin Change Interrupt. Przerwanie to, odpowiednio skonfigurowane, może wybudzić mikrokontroler przy pomocy zmiany stanu na dowolnych pinach PCINT bez konieczności używania jakichkolwiek dodatkowych elementów zewnętrznych.
  12. Chyba źle to analizujesz. Dorysuj sobie może do powyższego schematu kondensator, który jest zwykle w zasilaczu i spróbuj ponownie to przeanalizować. Może wtedy zauważysz, w jaki sposób energia samoindukcji będzie zwracana do zasilania (prąd zamyka się poprzez ten właśnie kondensator, doładowując go). Weź też pod uwagę, które pary tranzystorów biorą udział w kluczowaniu PWM (T3 i T6 dla jednego kierunku obrotów oraz T5 i T4 dla drugiego) i że nie musisz wyłączać obydwu tranzystorów, aby przerwać przepływ prądu w silniku. Jeśli jeden z nich pozostanie włączony, to obwód rozładowania energii
  13. Tranzystory , których użyłeś, mają wbudowane diody, i to najprawdopodobniej przez diodę dolnego tranzystora płynie prąd, a nie przez sam tranzystor (ze względu na polaryzację prądu). Spróbuj użyć samej diody (o odpowiednim prądzie przewodzenia oczywiście) a efekt zapewne będzie bardzo podobny. Ogólnie sposób sterowania jednym tranzystorem, bez tej diody podłączonej równolegle do silnika, jest mało bezpieczny ze względu na indukowanie się sporych impulsów napięcia po wyłączeniu prądu płynącego przez silnik. Energia zgromadzona w rdzeniu elementu indukcyjnego, po odłączeniu prądu płynącego
  14. andrews

    Problemy z Pololu A4988

    Może źle to ująłem. Miałem na myśli, że tyle maksymalnie może pobierać silnik, ale nie zawsze tak będzie. Właściwie to nawet przy pracy pełnokrokowej prąd płynie przez obydwie cewki, ale tylko ok. 70% maksymalnego. Sterownik sam sobie to reguluje na podstawie napięcia ustawionego potencjometrem na pinie REF sterownika A4988 w zależności od trybu pracy i kolejnego kroku. Napisz dokładnie, jak mierzysz prąd. Obawiam się, że przy pomiarze prądu podłączasz przewody pomiarowe tak samo jak podczas pomiaru napięcia, czyli do VMOT i GND. Jeśli chcesz zmierzyć prąd pobierany przez układ, musi
  15. andrews

    Problemy z Pololu A4988

    12 V, 0,8A (wcześniej było 0,4A), natężenie może być minimalnie niższe (0,78A) Co się zmieniło, że teraz jest większy prąd? Zwróć uwagę, co napisałem w poprzednim poście. Napięcie na wejściu REF układu A4988 (czyli na suwaku potencjometru) powinno być równe 160mV, a przynajmniej nie powinno być większe, żebyś nie przegrzał silnika. Coś tu zdecydowanie nie pasuje. Może jednak coś źle mierzysz. Jeśli bezpośrednio na płytce sterownika pomiędzy VMOT i GND jest napięcie 12V i płynie prąd 0,8A, to na czym jest spadek napięcia, jeśli nie na cewkach? Gdyby z kolei przez cew
  16. Na początek: gdzie masz definicję zmiennej im5? Kompilator się nie buntował? Zakładając, że to pomyłka i w miejscu im5 miało być im10. Jeśli zostanie naciśnięty 3 razy np. IMPULS_1 to zmienna im1 nadal będzie równa 1, bo za każdym razem przypisujesz jej wartość 1. Jeśli chcesz sumować punkty, to spróbuj może tak: if (impuls(IMPULS_1)) { LED3_TOG; _delay_ms(500); LED3_TOG; im1 += 1; } Oczywiście dla IMPULS_2 powinno być im2 += 2; Nie wiem też, czy to zamierzone działanie, ale przy takim kodzie wciśnięcie przycisku na dłużej niż 500ms spowoduje ponowne
  17. andrews

    Problemy z Pololu A4988

    Teoretycznie coś powinno być. Trudno jednak pomagać na odległość, kiedy Ty podajesz tak mało danych. W tej sytuacji istotne jest także: jakie jest napięcie pomiędzy 2A i 2B, jakie jest w ogóle napięcie zasilania silnika mierzone bezpośrednio na płytce (pomiędzy VMOT i GND), jakie napięcie jest na wyjściu stabilizatora napięcia. Dodatkowo należałoby sprawdzić dla pewności stabilność wszystkich połączeń, zmierzyć napięcia wejściowe na poszczególnych pinach sterujących oraz napięcie zasilające logikę (pomiędzy VDD i GND) bezpośrednio na płytce. Problemem może też by
  18. andrews

    Problemy z Pololu A4988

    Witam. Jak już mierzysz napięcie, to na cewkach, czyli pomiędzy 1A-1B lub 2A-2B. Kiedy silnik stoi, należy mierzyć napięcie stałe, kiedy się kręci - przemienne. Taka różnica nie ma krytycznego znaczenia. Ja bym tu widział inny problem. Jak tak patrzę na schemat, który przedstawiłeś, to widzę, że w zasilaniu silnika masz włączony stabilizator napięcia. Ten stabilizator właściwie jest zbędny. Oprócz tego pomiędzy wyjściem stabilizatora a sterownikiem masz wstawione szeregowo dwa rezystory o łącznej rezystancji (jeśli dobrze widzę) 30 Ohm. Te rezystory też są zbędne, a właściwie m
  19. Jeśli chodzi o częstotliwość multipleksowania, to chyba trzeba będzie dobrać eksperymentalnie. Być może trzeba będzie nieco zwiększyć, ale nie przesadzałbym. Myślę, że maksymalnie około 600Hz powinno wystarczyć. Istnieje jednak jeszcze inna możliwość. W przypadku multipleksowania wyświetlaczy LED wystarczy zgaszenie jednej cyfry i zapalenie w trakcie jednej procedury obsługi przerwania. W przypadku nixie jednak taki czas wygaszania cyfry może być niewystarczający. Rozwiązanie, które przedstawiłem powoduje, że ten czas wygaszenia jest wystarczająco długi, ale może niekoniecznie musi być aż
  20. Moim zdaniem w przypadku multipleksowania nixie lepszym sposobem jest naprzemienne gaszenie i zapalanie kolejnych cyfr. Inaczej to ujmując, w nieparzystych przerwaniach gasisz wszystko (wyłączasz wszystkie anody i katody), a w parzystych zapalasz kolejne cyfry. Przykładowa procedura obsługi przerwania (starałem się zbyt wiele nie zmieniać, więc może nie być optymalnie, ale powinno działać): ISR(TIMER0_COMP_vect) { static uint8_t anoda = 1, licznik; licznik ^= 1; if (licznik) { // wygaszenie wszystkich wyświetlaczy; ANODY_PORT = (ANODY_PORT | M
  21. andrews

    Sterownik Pololu i pompka

    A sprawdzałeś może używając większych współczynników wypełnienia PWM? ...lub nawet podając na pin PWMA na stałe logiczną jedynkę (czyli PWM=100%)? Jeszcze uwaga dotycząca zmiany kierunku obrotów. Wprawdzie to mały silniczek i ma zapewne małą bezwładność, niemniej nie polecałbym takiej gwałtownej zmiany kierunku wirowania. Po odczekaniu tych 20s najpierw wyłącz obroty (np. wolny wybieg poprzez AIN1=0, AIN2=0 lub hamowanie poprzez PWMA=0), odczekaj chwilę i dopiero włącz obroty w drugą stronę.
  22. Schemat to jedno, istotny jest również algorytm multipleksowania. Lampy NIXIE mają dużo większą bezwładność (czas gaśnięcia cyfry po odłączeniu napięcia sterującego) w porównaniu z LED, dlatego należałoby to uwzględnić w kodzie. Kodu nie przedstawiłeś, więc trudno się wypowiedzieć, czy Twój algorytm multipleksujący jest odpowiedni. Zwykle multipleksowanie odbywa się cyklicznie w procedurze obsługi przerwania jakiegoś timera, więc gdybyś mógł przedstawić chociaż ten fragment kodu, może udałoby się coś podpowiedzieć. Myślę, że przy prawidłowym algorytmie multipleksowania kombinowanie z diod
  23. Problemem mogą być źle skonfigurowane ścieżki do plików nagłówkowych. Poczytaj może ten wątek.
  24. Nie sądzę, że to powoduje problemy. Przed zaprogramowaniem nowego wsadu zawsze wykonywana jest komenda Chjp Erase, która kasuje zawartość FLASH, EEPROM oraz lock bity, więc jeśli tam miałeś jakiś bootloader, to już powinien zostać wykasowany po wgraniu programu przez avrdude. Chip Erase nie kasuje tylko fuse bitów, więc trzeba je zmienić samodzielnie. Stąd zapewne ta "pozostałość" w postaci ustawionego fuse bitu BOOTRST. Napisałeś, że przekompilowałeś program. Zakładam, że wgrałeś go do mikrokontrolera przed sprawdzeniem, czy dioda działa? Przy takich ustawieniach fuse bitów z pra
  25. Stopień komplikacji programu nie ma związku ze stabilnością pracy oscylatora. Proponuję jednak podłączyć te kondensatory (z zakresu12-22pF). Jeśli chodzi o wartość bajtu low, powinno być OK. Jeśli chodzi o wartość bajtu high, to obydwie użyte przez Ciebie wartości włączają fuse bit BOOTRST, który powinien być zaprogramowany w przypadku używania w mikrokontrolerze tzw. bootloadera. Z Twojej wypowiedzi wynika, że nie używasz bootloadera, więc ten bit powinien być wyłączony. Dodatkowo wartość high równa DA oznacza wyłączenie fuse bitu CKOPT, który w przypadku użycia kwarcu 16MHz
×
×
  • 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.