Skocz do zawartości

jogurt_wisniowy

Użytkownicy
  • Zawartość

    11
  • Rejestracja

  • Ostatnio

Reputacja

0 Neutralna

O jogurt_wisniowy

  • Ranga
    2/10

Informacje

  1. Jestem na razie pod wrażeniem, widać ze włożyliście w pierwszą część dużo pracy, mam nadzieję że dalej będzie tak samo dobrze. Mam tylko jedną uwagę i to natury estetycznej, a nie merytorycznej. U mnie pod firefoxem 3 listing kodu wyświetla się w Times new roman, pod wszystkimi innymi przeglądarkami (opera chrome, IE) jest ok. Moglibyście to poprawić?
  2. Kshaq. Za ciekawe tematy, przystępny język, ładnie sformatowane posty i dużą ilość fotografii. Pojawienie się jego artykułów spowodowało że swój wyrzuciłem do kosza, bo uznałem że i tak go nie przeskoczę
  3. No niestety nie potrafię tego uruchomić, ostateczny kod: void Inicjalizacja(void) { DDRC = 0x3; //00000011 PORTC= 0xFF; ADMUX |= _BV(REFS0); // Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH) ADMUX |= _BV(ADLAR); // Wybór kanału wejścia - PC3 (ADC3) ADMUX |= _BV(MUX1)|_BV(MUX0); // Zezwolenie na konwersję ADCSRA |= _BV(ADEN); // Wybranie częstotliwości dla taktowania przetwornika ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1); ADCSRA |= _BV(ADPS2); } int main(void) { Inicjalizacja(); PORTC |= _BV(0); //dioda żółta zgaszona PORTC |= _BV(1); //dioda zielona delay_ms(1000); PORTC &= ~_BV(1); //zaświeć PORTC &= ~_BV(0); //zaświeć delay_ms(1000); while(1) { ADCSRA |= _BV(ADSC); delay_ms(25); pomiar=ADCH; if (pomiar > 256) { PORTC |= _BV(0); PORTC &= ~_BV(1); } else { PORTC &= ~_BV(0); PORTC |= _BV(1); } delay_ms(100); } Mam nadzieję ze poprawiłem wszystko tak jak trzeba.
  4. Dorobiłem się w końcu swojej własnej płytki testowej, zaczynam powoli programować na prawdziwym układzie, a nie symulatorze i pojawił się pierwszy problem, którego nie potrafię przeskoczyć sam. Krótkie info: uP: Atmega8 16MHz Diody Led podpięte pod Portc.0 i PortC.1 Sharp podpiety pod Portc.3 W bascomie potrafię to obsłużyć, ponizszy kod (na podstawie kursu z Komputer Świata) działa: $regfile = "m8def.dat" $crystal = 16000000 Config Pinc.0 = Output Config Pinc.1 = Output Led Alias Portc.0 Declare Function Sharp() As Word Config Adc = Single , Prescaler = Auto , Reference = Avcc Start Adc Led = 0 Wait 1 Led = 1 Do If Sharp() > 256 Then Led = 0 Else Led = 1 End If Waitms 25 Loop Function Sharp_odczyt() As Word Sharp_odczyt = Getadc(4) End Function End niestety w C, już nie, mój dotychczasowy kod (starałem się go robić na podstawie (http://www.tkdami.net/~voytek/programy/adc/Przetwornik_AC.html) kompiluje się, ale odmawia współpracy: #define F_CPU 16000000L #include <avr/io.h> #include <util/delay.h> unsigned int pomiar; // Zmienna do przechowywania wyniku pomiaru void delay_ms(uint16_t ms) { while(ms) { _delay_ms(1); ms--; } } void Inicjalizacja(void) { DDRC = 0xC0; PORTC= 0xFF; ADMUX |= _BV(REFS0); //napięcie odniesienia ADMUX |= _BV(REFS1); // Wybranie sposobu zapisu wyniku z wyrównaniem do lewej (osiem starszych bitów wyniku w rejestrze ADCH) ADMUX |= _BV(ADLAR); // Zezwolenie na konwersję ADCSRA |= _BV(ADEN); // Wybranie częstotliwości dla taktowania przetwornika ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1); ADCSRA |= _BV(ADPS2); } int main(void) { Inicjalizacja(); PORTC |= _BV(0); PORTC |= _BV(1); while(1) { ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania delay_ms(25); // Oczekiwanie na zakończenie przetwarzania pomiar=ADCH; if (pomiar > 256) { PORTC |= _BV(0); } else { PORTC &= ~_BV(0); } delay_ms(25); } } Mógłby ktoś pomóc mi przerobić ten bascomowy kod? Przede wszystkim jak powiedzieć uP że chcę odczytać dane z przetwornika ADC3? Z tego co pisze w dokumentacji służą do tego rejstry MUX3:0, ale nie wiem jak z nich skorzystać. Prosiłbym o obszerne komentarze, bede bardzo wdzięczny bo z C jestem zielony jak trawa na wiosnę, a mimo wszystko chciałbym opanować ten język.
  5. faktycznie dzięki abxyz za kod,wstępnie w proteusie coś tam się kręci próbuję rozgryźć jak to działa, na razie znalazłem takie coś: Generating PWM signals using Timers in the ATMega chip myślę ze z pomocą Twojego kodu i tej strony jakoś sobie poradzę
  6. witam, potrzebuję pomocy przy rozgryzieniu PWM dla atmega32 (16MHz) docelowo jest to potrzebne do sterowania prędkością silników z wykorzystaniem mostka H. Chciałbym to napisać w C, mam gotowy kod w bascomie z ks ekspert, ale w żaden sposób nie mogę przenieść tego do C. Tak w ogóle to dopiero zaczynam moją przygodę z elektroniką i programowaniem, poprzeglądałem już kilka kodów źródłowych w których był stosowany pwm, ale nie mogę wyciągnąć żadnego wspólnego mianownika. Widziałem źródła programów w których cały pwm miescił sie w 4 krótkich linijkach, a były też kobyły które ciągnęły się jak makaron do spaghetti. Mój układzik wygląda tak: http://www.wynajem-maszyn.pl/poligon/sumo/sumo.gif a kod źródłowy który na razie udało mi się do tego stworzyć prezentuje się tak: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <stdlib.h> #include "lcd.c" #define cbi(sfr, b) (sfr &= ~(1<<b)) // bit 0 na pin portu #define sbi(sfr, b) (sfr |= (1<<b)) // bit 1 na pin portu // lewe kolo PortB 7,6 // prawe kolo PortB 4,5 // lewe kolo enable PORTD 5 // prawe kolo enable PORTD 4 long i2=0; void delay_ms(uint16_t ms) { while(ms) { _delay_ms(1); ms--; } } // sterowanie kolami void lkp() { cbi(PORTB,7); sbi(PORTB,6); sbi(PORTD,5); } // lewe koło przód void lkt() { sbi(PORTB,7); cbi(PORTB,6); sbi(PORTD,5); } // lewe koło tył void lks() { cbi(PORTB,7); cbi(PORTB,6); cbi(PORTD,5); } // lewe koło stop void pkt() { sbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło tył void pkp() { cbi(PORTB,5); sbi(PORTB,4); sbi(PORTD,4); } // prawe koło przód void pks() { cbi(PORTB,5); cbi(PORTB,4); sbi(PORTD,4); } // prawe koło stop //sterowanie jazdą void przod() { lkp(); pkp(); } // jazda do przodu void tyl() { lkt(); pkt(); } // jazda do tyłu void lewo() { lkt(); pkp(); } // skręt w lewo void prawo() { lkp(); pkp(); } // skręt w prawo void stop() { lks(); pks(); } // wyłącz silniki int main(void) { DDRD = 0xff; // port D jako wyjscie DDRB = 0xff; // port B jako wyjscie //lcd_init(LCD_DISP_ON); przod(); // jedz do przodu //lcd_puts("Przod"); delay_ms(2000); // przez 2 sekundy stop(); // stop delay_ms(2000); // przez 2 sekundy lewo(); // skret w lewo delay_ms(2000); // przez 2 sekundy prawo(); // skret w prawo delay_ms(2000); // przez 2 sekundy tyl(); stop(); // zatrzymaj silniki } To są moje początki w C także wszelkie optymalizacje mile widziane, ten kod powyżej nie jest do końca mojego autorstwa, jest wypadkową kilku rozwiązań jakie udało mi się znaleźć. Obszerne komentarze do ewentualnego kodu mile widziane
  7. Teraz kolejne pytanie jak widać w mojej poprzedniej wiadomości zmiana kątu serwa jest dokonywana co jeden krok po wykryciu naciśnięcia odpowiedniego znaku. Chciałbym jednak żeby obrót był dokonywany przy pomocy jakiejś dłuższej sekwencji znaków (np: A10 wtedy mógłbym to przerobić takżeby serwo A obróciło się za jednym zamachem o 10 kroków) Jaką instrukcję do tego użyć? bo kombinowałem z inkey, input i jakoś niespecjalnie mi to wychodzi. Nie wiem czy to ma jakieś znaczenie ale układ na razie testuje nie na rzeczywistym modelu lecz w Proteusie.
  8. ok już sobie z grubsza poradziłem, kod wygląda tak: $regfile = "m8def.dat" $crystal = 10000000 $baud = 9600 Config Servos = 4 , Servo1 = Portc.0 , Servo2 = Portc.1 , Servo3 = Portc.2 , Servo4 = Portc.3 , Reload = 2 Config Portc = Output Config Portd.0 = Input Enable Interrupts 'Dla reload 2 i 10 Mhz od 126-250 kąt 1.45 stopnia Servo(1) = 126 Servo(2) = 150 Servo(3) = 150 Servo(4) = 250 Dim Servo_pos(4) As Byte Do Servo_pos(1) = Servo(1) Servo_pos(2) = Servo(2) Servo_pos(3) = Servo(3) Servo_pos(4) = Servo(4) Dim A$ As String * 1 A$ = Waitkey() If A$ = "z" And Servo_pos(1) > 126 Then Servo(1) = Servo_pos(1) - 1 End If If A$ = "x" And Servo_pos(1) < 250 Then Servo(1) = Servo_pos(1) + 1 End If If A$ = "c" And Servo_pos(2) > 126 Then Servo(2) = Servo_pos(2) - 1 End If If A$ = "v" And Servo_pos(2) < 250 Then Servo(2) = Servo_pos(2) + 1 End If If A$ = "b" And Servo_pos(3) > 126 Then Servo(3) = Servo_pos(3) - 1 End If If A$ = "n" And Servo_pos(3) < 250 Then Servo(3) = Servo_pos(3) + 1 End If If A$ = "m" And Servo_pos(4) > 126 Then Servo(4) = Servo_pos(4) - 1 End If If A$ = "," And Servo_pos(4) < 250 Then Servo(4) = Servo_pos(4) + 1 End If Loop End Precyzja sterowania serwem zależy od częstotliwości kwarcu i parametru reload, udało mi się dojść do wielkości rzędu 0.8 stopnia (16MHz, reload = 1) ale brakuje mi zakresu w przypadku instrukcji servo() (jest ona typu BYTE i obsługuje wartości do 255) i serwo nie wykonuje obrotu w pełnym zakresie swoich możliwości. Czy można to ominąć pisząc swoją procedure obsługi serwa, i do jakich wielkości można dojść. Jak bardzo to jest skomplikowane do napisania? I pytanie z innej beczki, próbuje dogadać się z mikroprocesorem przez rs232 ale nie bardzo mi wychodzi, na dole widać kawałek kodu który wymyśliłem posiłkując się googlem i helpem, ale to bydle nie chce działać, można prosić o jakieś wskazówki? //zmieniłem kod na taki jaki mam obecnie, żeby nie wklejać kolejnego prawie że identycznego kawałka kodu w kolejnym poście. Transmisja rs232 działa już jak należy
  9. Małe pytanie co do tej instrukcji, jaki minimalny kąt obrotu można uzyskać za jej pomocą?
  10. korzystałem z Google SketchUp świetne narzędzie gdy trzeba zamodelować szybko coś prostego, A jakieś konkretniejsze rady co do materiału? Bo bez tego nie dobiorę mocy serw.
  11. Zabieram się za zrobienie pierwszego robota i pojawiły się pierwsze problemy Jeżeli chodzi o konstrukcję będzie on wyglądał mniej więcej tak: i teraz zastanawiam się z czego go wykonać aluminium czy pcv (a może jakeś inne propozycje?) Co byście doradzali? Jaka powinna być orientacyjna grubość któregoś z tych materiałów żeby miało to odpowiednią sztywność? Prawdopodobnie wenątrz i tak zrobię jakąś małą kratownicę dla zwiększenia sztywności ale jestem ciekaw jak to orientacyjnie powinno wyglądać. Robot w całości na pełnym wysięgu (z chwytakiem którego tu nie ma) będzie miał ok 25-30 cm Łączenia będą klejone, pasuje żeby materiał dobrze kleił się ze stalą (łożyska przy osiach)
×
×
  • Utwórz nowe...