Skocz do zawartości

piwniczne

Użytkownicy
  • Zawartość

    10
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O piwniczne

  • Ranga
    2/10
  • Urodziny 01.01.1992

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Wrocław
  • Zawód
    Student

Ostatnio na profilu byli

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

  1. Wspólne GND zrobiło robotę. Bardzo dziękuję.
  2. Hej, dopiero zaczynam zabawę z elektroniką i mam mocne braki w wiedzy dlatego zapewne mam też sporo problemów Robię kurs arduino i dotarłem do sterownia serwem. Mój problem: jeżeli sero (SG90) podłączę pod zasilanie arduino (5V i GND) to działa i jest super sterowalne. natomiast gdy spróbuje te zasilanie zmienić na własne, to zaczynają się problemy. Próbwałem zasilanie dać z: ładowarki (wyjście 5V 2A). ładowarki przez stabilizator napięcia (3.3V) To co wyżej plus kondensatory (od 20 do 1000 uF) miedzy + i -. W przypadku stabilizatora miedzy wejściem a GND oraz między wyjściem a GND. dodatkowo użyłem także moduł mini przetwornicy DC DC (której dawałem prąd z baterii 9V). Wszystko niestety na nic. O ile napięcia są OK (na przetwornicy 5V ustawiłem), O tyle serwo nie pracuje (albo wcale, albo szaleje czyli czasem coś ruszy a czasem cos tylko pyka w środku). Chciałem zmierzyć prąd jaki płynie za przetwornicą (opornik 1K, dioda led, szeregowo mój multimetr) ale niczego nie pokazywał (nie wiem czy zepsuty czy co) ale dioda swiecila.
  3. wielkie dzieki, pomogło. działajacy kod: /* * main.c * * Created on: 9 kwi 2014 * Author: Dawid */ #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> int pomiar=1; int main(){ DDRB |= (1<<PORTB0); // wyjscie DDRA = 0xff ; // Ustawienie bitu LED jako wyjścia PORTA= 0xff ; _delay_ms(1000); PORTA= 0x00 ; _delay_ms(500); TCCR1B |= (1 << CS10); // Ustawienie timera DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie. DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie. //PORTD|=(1<<PORTD2); // do kazdego rezystor podciagajacy //PORTD|=(1<<PORTD3); // czyli normalnie jest stan wysoki. MCUCR|=(1<<ISC01)|(1<<ISC11)|(1<<ISC10); // ustawiamy przerwanie na spadek0 i wzrost1. GICR|=(1<<INT0)|(1<<INT1); // umozliwiamy przerwania sei(); // inicjalizacja przerwan. while(1){ PORTB |= (1<<PORTB0); _delay_ms(1); // wysylamy impuls PORTB &= ~(1<<PORTB0); _delay_ms(300); // probkowanie 3Hz } } ISR(INT1_vect){ TCNT1 = 0; // Zeruje wartość timera } ISR(INT0_vect){ pomiar=TCNT1; PORTA= (pomiar/58) ; // w cm } /* DDRC = 0xff; // port jako wyjscie. DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie. DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie. PORTD|=(1<<PORTD2); // do kazdego rezystor podciagajacy PORTD|=(1<<PORTD3); // czyli normalnie jest stan wysoki. MCUCR|=(1<<ISC01)|(1<<ISC11); // ustawiamy przerwanie na spadek. GICR|=(1<<INT0)|(1<<INT1); // umozliwiamy przerwania sei(); // inicjalizacja przerwan. */ /********************************************************/ /* void InitInterrupt(void) { //PRZERWANIA ZEWNĘTRZNE DDRD = 0xf8; //PD0-PD2 - wejscie (Echo); PD3-PD5 - wyjścia(Trig) MCUCR = 0x3f; //Przerwanie zostanie wywołane zboczem narastająym //na wejściach INT0, INT1, INT2 //TIMER2 TCNT2 = 0x00; //Zerowanie rejestru TCNT2 (Rejestr jednostki zegara) TCCR2 = (1<<WGM01)|(1<<CS00); //Ustawia timer2 w tryb CTC bez preskalera //Czestotliwość 16Mhz/1=16MHz OCR2 = 0x10; //Górna wartość licznika wynosi 16 //Przerwania będą następować co 1us SREG = 0x80; } //F-cja przerwania od Timera2 ISR(TIMER2_COMP_vect) { licznik++; } //F-cja przerwania zewnętrznego INT0 ISR(INT0_vect) { if(flaga==0) { TIMSK = (1<<OCIE2); //włącza Timer2 w trybie dopasowania (START) ClrBit(EIMSK, INT0); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem opadającym MCUCR = (1<<ISC01); //na wejściu INT0 SetBit(EIMSK, INT0); flaga=1; } else if(flaga==1) { TIMSK &=~(1<<OCIE2); //zatrzymuje Timer2 (STOP) ClrBit(EIMSK, INT0); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem rosnącym MCUCR = (1<<ISC01)|(1<<ISC00); //na wejściu INT0 SetBit(EIMSK, INT0); odl0=licznik; //Zapisuje wartość licznika do zmiennej "odl" odl0/=20; //oraz skaluje go licznik=0; //Zerowanie licznika flaga=0; } } //F-cja przerwania zewnętrznego INT1 ISR(INT1_vect) { if(flaga==0) { TIMSK = (1<<OCIE2); //włącza Timer2 w trybie dopasowania (START) ClrBit(EIMSK, INT1); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem opadającym MCUCR = (1<<ISC11); //na wejściu INT1 SetBit(EIMSK, INT1); flaga=1; } else if(flaga==1) { TIMSK &=~(1<<OCIE2); //zatrzymuje Timer2 (STOP) ClrBit(EIMSK, INT1); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem rosnącym MCUCR = (1<<ISC11)|(1<<ISC10); //na wejściu INT1 SetBit(EIMSK, INT1); odl1=licznik; //Zapisuje wartość licznika do zmiennej "odl" odl1/=20; //oraz skaluje go licznik=0; //Zerowanie licznika flaga=0; } } //F-cja przerwania zewnętrznego INT2 ISR(INT2_vect) { if(flaga==0) { TIMSK = (1<<OCIE2); //włącza Timer2 w trybie dopasowania (START) ClrBit(EIMSK, INT2); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem opadającym MCUCR = (1<<ISC21); //na wejściu INT2 SetBit(EIMSK, INT2); flaga=1; } else if(flaga==1) { TIMSK &=~(1<<OCIE2); //zatrzymuje Timer2 (STOP) ClrBit(EIMSK, INT2); MCUCR = 0x00; //Przerwanie zostanie wywołane zboczem rosnącym MCUCR = (1<<ISC21)|(1<<ISC20); //na wejściu INT2 SetBit(EIMSK, INT2); odl2=licznik; //Zapisuje wartość licznika do zmiennej "odl" odl2/=20; //oraz skaluje go licznik=0; //Zerowanie licznika flaga=0; } } double l_pomiar(void) { SetBit(EIMSK, INT0); SetBit(PORTD, 3); _delay_us(15); ClrBit(PORTD, 3); _delay_ms(8); ClrBit(EIMSK, INT0); return odl0; } double p_pomiar(void) { SetBit(EIMSK, INT2); SetBit(PORTD, 5); _delay_us(15); ClrBit(PORTD, 5); _delay_ms(8); ClrBit(EIMSK, INT2); return odl2; } double s_pomiar(void) { SetBit(EIMSK, INT1); SetBit(PORTD, 4); _delay_us(15); ClrBit(PORTD, 4); _delay_ms(8); ClrBit(EIMSK, INT1); return odl1; } */
  4. Hej, chciałbym zmierzyć odległość czujnikiem HC-SR04. Mam jednak problem - nie odpala on moich przerwań. oto kod: #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> int pomiar=1; int main(){ DDRB |= (1<<PORTB0); // wyjscie, do odpalenia trig na czujniku PORTB |= (1<<PORTB0); // daje w stan wysoki DDRA = 0xff ; // Caly port A pracuje jako wyswietlacz (8 LED) PORTA= 0xff ; // sprawdzam czy dziala - zapalam i gasze. _delay_ms(3000); PORTA= 0x00 ; _delay_ms(1000); TCCR1B |= (1 << CS10); // Ustawienie timera taktowanie to 1Mh wiec bez preskalera DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie. DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie. //PORTD|=(1<<PORTD2); // do kazdego rezystor podciagajacy //PORTD|=(1<<PORTD3); // czyli normalnie jest stan wysoki. (to chyba nie) MCUCR|=(1<<ISC01)|(1<<ISC11)|(1<<ISC10); // ustawiamy przerwanie na spadek0 i wzrost1. GICR|=(1<<INT0)|(1<<INT1); // umozliwiamy przerwania sei(); // inicjalizacja przerwan. while(1){ } } ISR(INT0_vect){ pomiar=TCNT1; // sprawdzamy czas pomiaru (1 tyk to 1 us) PORTA= 0xff ; _delay_ms(3000); PORTA= 0x00 ; _delay_ms(1000); } ISR(INT1_vect){ PORTA= 0xff ; _delay_ms(3000); PORTA= 0x00 ; _delay_ms(1000); TCNT1 = 0; // Zeruje wartość timera } Działam na płytce stykowej, cU ATmega32. Co do połączeń. Cały port A idzie na diody. Czujnik: gnd - do masy. VCC do zasilania. (z płytki, z programatora). Echo wchodzi do INT0 i INT1 - chciałbym aby zależnie od tego jakie zbocze, odpalało się odpowiednie przerwanie. Trig PB0 <- powinien byc ciagle stan wysoki. Efektem dzialania jest dojscie do pętli while, potem nie dzieje się nic. Oczywiście _delay_ms(x) w przerwaniach dałem jedynie po to by sprawdzić czy w ogóle są wywoływane- otóż nie są. Pomocy Panowie
  5. Hej, piszę w elektronice chociaż nie jestem pewien, czy nie jest to kwestia oprogramowania. Mam problem - piszę prosty program który ma obsłużyć przerwania: wcześniej tylko sprzęt: Programator USBasp. zasilanie z programatora 5V. Płytka stykowa, ATmega 32. #include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> int main(){ DDRC = 0xff; // port jako wyjscie. DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie. DDRD &= ~(1<<PORTD3); // drugi pin portu D jako wejscie. PORTD|=(1<<PORTD3); // rezystor podciagajacy PORTD|=(1<<PORTD3); // czyli normalnie jest stan wysoki. MCUCR|=(1<<ISC01)|(1<<ISC11); GICR|=(1<<INT0)|(1<<INT1); sei(); PORTC=0xff; _delay_ms(300); PORTC=0x00; while(1){ } } ISR(INT0_vect){ PORTC=0xff; } ISR(INT1_vect){ PORTC=0x00; } Z tego co rozumiem, oba INT0/1 powinny reagować na zbocze opadające. Myślę- spoko. Piny są podciągnięte więc będą w stanie wysokim a jak je zewrę do masy to wejdą w stan niski. Więc domyślnie diody się nie świecą, jak zaczne się bawić raz jednym przerwaniem raz drugim to będą migać zależnie od tego co podłączać do masy. Problem polega na tym, że program mi wariuje. Nawet jak nic nie zmienię- do pinów na przerwanie nie jest nic podpięte - to dioda i tak się sama zapala po jakiejś sekundzie. Jeżeli gaszę ją przerwaniem- po krótszej chwili (<1s) znów się zapal i świeci. Nie mam pomysłu o co chodzi dlatego piszę temat. Wcześniej widziałem dziwne zależności pokroju dioda gaśnie gdy dotykam okolic portu USB dla przykladu jak zrobię obsługę przerwań w postaci: ISR(INT0_vect){ //PORTC=0xff; } ISR(INT1_vect){ PORTC=0xff; _delay_ms(500); PORTC=0x00; } to jest ok.
  6. Mam problem, pewnie dla was banalny, a dla mnie dziwny. Robiłem PWM i działa normalnie, tyle, ze gdy daje proponowane ustawienia: TCCR1A |= (1 << WGM10); // Fast PWM 8bit TCCR1B |= (1 << WGM12); TCCR1A |= (1 << COM1A1) | (1 << COM1B1); //Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM TCCR1B |= (1 << CS10) | (1 << CS11); // Preksaler = 64 fpwm = 976,5Hz //sterowanie prędkością silników OCR1A = 0xff; //kanał A = 0 OCR1B = 0x00; //kanał B = 0 ktore pochodza z jednego z waszych tutków. Sam natomiast chciałem rejestry wyznaczyć w ten sposób: TCCR1A = 0b10100000; CCR1B = 0b00000011; I nie wiem dlaczego przy pierwszej metodzie działa, przy drugiej nie. Cały czas myślałem, że wystarczy, że dam gdzieś 0 i 1nki. Natomiast zapisu |= szczerze mówiąc nie kumam
  7. Dzięki wielkie za opis. Przechodzę do napisania założeń projektowych, jeżeli interesuje Cię projekt to mogę napisać w późniejszym czasie o postępach/problemach !
  8. marek1707, na wstępie wielkie dzięki za odpowiedź! To pierwszy projekt jaki robię, nie wiem dlaczego zakładasz, że to wszystko wiem (chyba, ze prowokujesz mnie do szukania, to dobrze Ci to wychodzi ). Nie, nie wiem większości z tych rzeczy. Dobra z tego co ogarniam PC5 (ADC5/SCL) PC4 (ADC4/SDA) zmienię, żeby zostawić miejsce choćby na I2C, które może się przydać do późniejszego rozbudowywania urządzenia. Podobnie piny do UART czyli (RXD) PD0 (TXD) PD1. obecnie: Muszę ogarnąć jak wykorzystać timery do mierzenia wartości z czujnika. Jeżeli miałeś coś konkretnego na myśli, fajnie jakbyś powiedział jak to zrobić, albo dał jakiś poradnik/tut
  9. Z tego co czytałem w dokumentacji technicznej, czujnik daje na wyjściu sygnał prostokątny którego częstotliwość jest zależna od natężenia barwy którą szczytuje. Za pomocą S0, S1 regulujemy skalowanie funkcji wyjściowej (2% 20% 100%) za pomocą S2, S3 ustalamy którą z barw chcemy zbierać ( R, B, G, Clear) Program będzie zbierał przebiegi i porównywał je z oczekiwanymi (na starcie 3 R, G, B), Dla trzech kolorów z początku wystarczy, żeby zebrał dane z 3 barw i wybrał tę która ma największą wartość. W późniejszych etapach można to rozbudować do większej palety kolorów oraz dopuszczalnych błędów. Póki co tak to widzę, kwestia regulowania prędkości. Myślę o zastosowaniu przed mostkiem PWM, jednak nie robiłem tego nigdy i nie bardzo wiem, czy da się nim sterować cyfrowo - zaraz to będę ogarniał. Gdyby była taka możliwość to byłoby najlepiej, ponieważ na starcie wystarczą 2 piny które daja 4 stany -> 3 dla kolorów i 1 na postój. Znajdywanie linii póki co nie jest w jego zakresie- z założenia linia miała być bardzo szeroka, nie brałem pod uwagę tego by korygował swój ruch. Kwestia rozbija się o to, w jakim czasie zgubi linie, ponieważ zależy mi na tym, by podążał za nią powiedzmy póki co przez metr. Jeżeli chodzi o rozwój w tym kierunku to widze to w postaci czujników odbiciowych, tyle, że wtedy podłoże musiałoby mieć ( z tego co rozumiem ) jednolity kolor odległy od tych które wykrywa robot. (by wykrywały, że któryś z nich najeżdża na linie.)
  10. Hej, to mój pierwszy post więc witam was serdecznie. Tworze (właściwie, to próbuję) robota, którego zadaniem będzie rozpoznawanie koloru linii która jest pod nim i zmiana prędkości w zależności od wykrytego koloru. Linia póki co ma być prosta. Jako rdzeń użyłem schematu z tutka: https://www.forbot.pl/forum/topics20/dla-poczatkujacych-przepis-na-robota-w-pelni-programowalny-line-follower-vt2356.htm zmieniłem go nieco, dodałem czujnik który sam potrzebuje użyć. ( TSC3200 ) Jako napędu planuje użyć: http://electropark.pl/napedy-tamiya/563-przekladnia-podwojna-tamiya-70168-5901000563005.html ponieważ już go posiadam. Pytanie do was, to prośba o wskazanie błędów oraz zbędnych elementów. Oprócz tego, chciałbym was prosić o doradzenie, w jaki sposób regulować jego prędkość? Na tę chwilę myślę o zamieszczeniu PWM przed mostkiem, w celu zmian napięcia w zależności od zadanej wart przez mikroprocesor. SCHEMAT:
×
×
  • Utwórz nowe...