Skocz do zawartości

szimon

Użytkownicy
  • Zawartość

    60
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    2

szimon wygrał w ostatnim dniu 19 listopada 2009

szimon ma najbardziej lubianą zawartość!

Reputacja

9 Neutralna

O szimon

  • Ranga
    4/10

Informacje

  • Płeć
    Mężczyzna
  • Lokalizacja
    Koszalin / Warszawa
  1. Funkcja ROR przesuwa w prawo. Wartość bitu 7 idzie na bit 6, 6 na 5 itd. Dwie instrukcje ROR sprawiają, że dwa interesujące mnie bity idą na linię 4 i 5, a po SWAPie na 0 i 1. Sytuacja, którą opisujesz wystąpiłaby w przypadku użycia funkcji ROL.
  2. Na wstępie zaznaczam, z nadzieją na ograniczenie objętości całego wątku, że procesor jest sprawny (przynajmniej używane przeze mnie moduły), to samo programator. Fakt, że umieszczam ten temat wynika z tego, ze najczęstsze przyczyny ewentualnych błędów zostały wyeliminowane. Nie będę opisywał całego programu, bo nikt nie przeczytałby ani opisu, ani kodu. Postaram się pokrótce opisać jedynie fragment, który działa mi w symulatorze AVRStudio. Mikrokontroler generuje przebieg PWM typu Phase & Frequency Correct. W momencie osiągnięcia przez licznik T1 wartości szczytowej (określającej częstotliwość przebiegu), układ zgłasza żądanie przerwania typu określanego przez autorów noty jakże uroczą nazwą "Timer/Counter Capture Event". Przerwanie uaktywnia pojedynczą konwersję przetwornika A/C. Wewnątrz procedury obsługi przerwania od przetwornika A/C program wykonuje dwie podstawowe czynności: 1. Na podstawie odczytanej wartości odpowiednie ustawienie wypełnienia PWM - to działa. 2. Dwa najstarsze bity portu B stanowią dwubitową liczbę określającą kanał wyjściowy podłączonego demultipleksera. Z każdym przerwaniem od przetwornika A/C program ma za zadanie zwiększenie tej liczby, a tym samym ustalenie adresu kolejnego wyjścia demuxa. W ten sposób jeden kanał PWM używam do sterowania maksymalnie 8 obiektami sterowanymi modelarskim PWMem. Poniżej prezentuję fragment kodu odpowiedzialny za zwiększenie adresu: ADconv: ADconvStart: ... ;Doprowadzenie odczytanej wartosci do uzytecznej postaci ... UstawAdres: in r16, PINB andi r16, 0xC0 cpi r16, 0xC0 breq ADCzerujAdres clc ror r16 ror r16 swap r16 inc r16 swap r16 rol r16 rol r16 in r17, PINB andi r17, 0x0F or r16, r17 out PORTB, r16 rjmp ADCustaw ADCzerujAdres: in r16, PINB andi r16, 0x0F out PORTB, r16 ;Okreslenie szerokosci PWM na podst. odczytanej wartosci ADCustaw: ... reti Działanie fragmentu jest następujące: 1. Odczytuje obecne wartości portu B, maskując sześć młodszych bitów.W końcu nie obchodzą mnie one - interesują mnie dwa najstarsze; 2. Przesunięcie w prawo i zamiana półbajtów, w wyniku czego interesujące mnie bity znajdują się na pozycji 0 i 1; 3. Zwiększenie liczby o 1, a w przypadku gdy miała ona przed zwiększeniem wartość bitową 11, wyzerowanie jej (fragment ADCzeruj); 4. Operacje odwrotne do wymienionych w pkt. 2., w celu sprowadzenia liczby na początkową pozycję. W wyniku tego program wybiera cztery kolejne wyjścia demultipleksera. Problem jest taki, że program działa jak należy w symulatorze (tzn. odpowiednio zmienia wartości dwóch najstarszych bitów portu B). Ponadto sam port jest sprawny, ręczne ustawienie/zerowanie bitów daje przewidywany efekt. Jednak program ten wgrany do mikrokontrolera nie zmienia w żaden sposób wartości bitów. PWM chodzi jak należy, ale zmieniane docelowo linie przyjmują stale poziom zadany na początku programu (podczas określania kierunku portu). Czy ktoś w gronie diodowiczów miał podobny problem, tzn. program działający w symulatorze nie działał wgrany do układu? Miałem kiedyś problem taki, że w symulatorze program nie działał, a wgrany do układu już tak, więc takie coś nie byłoby dla mnie zaskoczeniem. Spodziewałbym się jednak, że jeżeli kod przeszedł nawet przez mocno wadliwy symulator AVRStudio, to będzie działał wgrany do komputera pokładowego Fiata 126p.
  3. Ja w prawdzie jestem inżynierem OMC, a nie polonistą, ale tak z punktu widzenia językowego i własnych opinii trochę pomarudzę. 1. Wyraz "nieamatorski" to swojego rodzaju radosne słowotwórstwo. Przeciwieństwem wyrazu "amator", od którego, jak zapewne wszyscy wiedzą, pochodzi określenie "amatorski", jest "profesjonalista". 2. Idąc dalej, ze Słownika języka polskiego możemy się dowiedzieć, że amator to osoba zajmująca się daną dziedziną dla przyjemności, nie zawodowo. Profesjonalista natomiast jest: po pierwsze primo osobą zajmującą się daną dziedziną zawodowo, a po drugie primo, osobą posiadającą duży zasób wiedzy na temat danej dziedziny. Można więc, bazując na przytoczonych definicjach, stwierdzić, iż oba określenia, zarówno "profesjonalny", jak i "amatorski" pokrywają się w pewnym stopniu - można być wykształconym w danej dziedzinie, być profesjonalistą, a zarazem dziedzinę tę możemy traktować jako chwilowe odejście od przyziemnych spraw, jako hobby, stając się tym samym amatorem danej dziedziny. To samo tyczy się wszelkiego rodzaju prac. Mogę zbudować ręcznie model MQ-1 Predator, oczywiście przy wykorzystaniu pewnych gotowych podzespołów, jak gotowy napęd etc. Model ten posłużyłby później do prowadzenia w Afganistanie operacji zwiadowczych. Równie dobrze, mógłbym jednak napalić się na wykonanie mega-zajebiście wyglądającego Waldka Światłoluba, zlecając profesjonalnej firmie wykonanie kompletnej płytki drukowanej (razem z elementami), wykonanie szkieletu i obudowy zlecić zajmującej się różnego rodzaju obróbką materiałów firmie, a do tego wszystkiego dorzucić silniki używane w łazikach księżycowych/marsjańskich itp. Po tych wszystkich działaniach model opublikowany na diodzie spotkałby się z licznymi formami aprobaty wobec zaangażowania autora w jego hobby. I można by się wówczas zastanawiać, która konstrukcja jest bardziej amatorska/profesjonalna. Więc ja pozwolę sobie zadać pytań kilka osobie, której pochopna wypowiedź przyczyniła się do wywołania tej dyskusji: 1. Czy według Ciebie istnieje wyznaczalna granica między konstrukcją profesjonalną, a amatorską? 2. Czy użycie choćby jednego elementu złożonego (przez co rozumiem przeciwieństwo elementu dyskretnego), wykonanego przez zajmujące się produkcją przedsiębiorstwo dyskwalifikuje konstrukcję jako amatorską? 3. Czy konstrukcję wykonaną w formie czyjegoś zlecenia (płatnego lub nie) można wykonać w taki sposób, aby nazwać ją amatorską, czy sam fakt wykonywania jej nie tylko dla czystej przyjemności czyni ją profesjonalną? 4. Czy użycie jakiegokolwiek, wykonanego przez inną osobę na nasze życzenie, elementu, który sami moglibyśmy wykonać bez większego nakładu pracy i kosztów, a z tą samą skutecznością, powinno się traktować jako nadanie konstrukcji określenia "profesjonalna"?
  4. Problem jest następujący. W mojej konstrukcji wykorzystuje cztery silniki BLDC. Fabrycznie mają uzwojenia wyprowadzone na ok. 5cm, końcówka ok. 1 cm jest pocynowana. Niestety kilka końcówek ułamało się i teraz mam poważny problem, bo druty są w emalii, więc nie mogę niczego przylutować i generalnie uzyskać połączenia galwanicznego. Znacie jakieś domowe sposoby usuwania emalii z drutów? Pilnik nie wchodzi w grę, bo każde uzwojenie to 5 czy 6 drutów skręconych ze sobą. Na elektrodzie opisują dwa sposoby: podgrzewanie drutu i zanurzenie rozgrzanego w denaturacie (wtedy ponoć emalia schodzi bezproblemowo), oraz przyciskanie drutu rozgrzanym grotem do tabletki polopiryny (kwas acetylosalicylowy ponoć jakoś reaguje z emalią). No ale próbuję i próbuję i jakoś nie bardzo te metody działają. A więc zapytuję: Czy wiadome są użytkownikom jakieś inne, możliwe do zrealizowania w domu, metody usuwania emalii?
  5. Właściwie to bilion (10^12). Anglojęzyczni trochę innej skali używają i w dataszicie napisali trylion.
  6. Co do elektrody - patrząc na nazwy tematów tworzone na diodzie, nie dziwię się, że elektroda usuwa Wam tematy. Poza tym jest tam obecnie taki zbiór wiedzy, że w ogóle zakładanie tematu nowego mija się z celem. Znalazłem tam odpowiedzi na kilkadziesiąt, jeśli nie kilkaset pytań, a tematy założyłem może trzy. Regulamin na elektrodzie jest prosty i za łamanie jego punktów temat leci. Co do Diody - jeśli ktoś nie czyta regulaminu (a wątpię, żeby więcej niż 20% użytkowników diody przeczytało go w całości), to nie może narzekać. Ja osobiście jestem za wyrzucaniem tak tematów, jak i postów nie wnoszących nic do dyskusji. Jeśli chcecie być bardzo łaskawi to możecie dać nowemu użytkownikowi na PW link do tematu, w którym poruszono już dany temat i usunąć temat utworzony przez niego. Na pewno nie przeszkodzi to nowej krwi tak, jak użytkownicy szydzący z początkujących. Pomysł mi się podoba, niemniej ludziom nie chce się czytać regulaminu, wątpię więc, żeby mieli czytać taki "MegaFAQ".
  7. Nie znam ani Bascoma, bo nigdy nie chciałem, ani C dla procków, więc mogę najwyżej podać takie ustawienie rejestrów, które wygeneruje Ci 36kHz na wyprowadzeniu OC0 (PB0). Tylko chciałbym znać częstotliwość taktowania Twojego procka.
  8. Jeśli to ma się poruszać na gąsienicach z łańcucha rowerowego, to serwo musi dać radę to pociągnąć, trochę to ważyć będzie. Wątpię, żeby te mniejsze to ruszyły.
  9. Warto też zajrzeć raz na jakiś czas na ich stronę, żeby dowiedzieć się, czy nie są organizowane w którymś mieście dni dawcy. Wtedy pobierają krew. Całość, od rejestracji do wyjścia trwa jakieś 5-10 minut.
  10. Piszę program w AVRStudio 4.13SP2. Działanie programu jest (a właściwie powinno być) następujące: Mikrokontroler generuje sygnał PWM o częstotliwości 50Hz i czasie trwania od 0,5ms do 2,5ms. Sygnał wysyłany jest na wyprowadzenie OC1A. Przy wyzerowaniu licznika podczas zliczania w dół wywoływane jest przerwanie włączające przetwarzanie A/C. Wewnątrz przerwania od przetwornika A/C ustalana jest szerokość impulsów PWM. Przetwornik działa dobrze, ale z Timerem męczę się już jakiś czas, a niestety do szafy tego schować i zapomnieć nie mogę. Problem jest taki: Zgodnie z trybem pracy ustalonym bitami WGM1 3:0 = 8 licznik powinien zliczać w górę aż do osiągnięcia wartości rejestru ICR1, następnie zacząć zliczać w dół, aż do osiągnięcia poziomu zerowego, co uruchamia przerwanie. W międzyczasie osiąga wartość zapisaną w rejestrze OCR1A, co powoduje zmianę stanu na wyjściu. Przeglądam program któryś raz z kolei i nie mogę dojść dlaczego licznik po osiągnięciu wartości TOP (ICR1) nie przestaje zliczać w górę. Liczy dalej, dochodzi do wartości 0xFFFF, zeruje się i generuje przerwanie. Próbowałem jeszcze trybu Phase correct PWM (WGM1 3:0=9). Być może ktoś miał podobny przypadek? Niewykluczone, że gdzieś się rypnąłem w pojedynczym bicie i od ciągłego szukania błędu przestałem cokolwiek zauważać. Poniżej kod programu: .include "m8def.inc" .cseg ;******** DEFINICJA WEKTORA PRZERWAŃ ************ .org 0x00 rjmp Reset ; RESET .org 0x08 rjmp T1ovf ; T1 OVERFLOW .org 0x0E rjmp ADconv ; ADC CONVERSION COMPLETE ;************************************************ Reset: ldi r16, high(RAMEND) out SPH, r16 ldi r16, low(RAMEND) out SPL, r16 ldi r16, 0xFF out DDRD, r16 ldi r16, 0xFF out PORTD, r16 ldi r16, 0xFF out DDRB, r16 ldi r16, 0x00 out PORTB, r16 ;********* PRZETWORNIK A/C *************** ldi r16, 0x00 ori r16, (1<<REFS0 | 1<<ADLAR) out ADMUX, r16 ldi r16, 0x00 ori r16, (1<<ADEN | 1<<ADIE | 1<<ADPS1 | 1<<ADPS0) out ADCSRA, r16 ;***************************************** ;********* TIMER1 ************ ldi r16, 0x00 out TCNT1H, r16 out TCNT1L, r16 ldi r17, 0x01 ldi r16, 0xF4 out OCR1AH, r17 out OCR1AL, r16 ldi r17, 0x27 ldi r16, 0x10 out ICR1H, r17 out ICR1L, r16 ldi r16, 0x00 ori r16, (1<<TOIE1) ;T1 ovf enable out TIMSK, r16 ldi r16, 0x00 ori r16, (1<<COM1A1) ;kanal OC1A, non-inv PWM out TCCR1A, r16 ldi r16, 0x00 ori r16, (1<<WGM13 | 1<<CS11) ;PWM phase & freq correct out TCCR1B, r16 ;***************************** sei Main: rjmp Main ;********** PROCEDURY OBSŁUGI PRZERWAŃ ********** ; Czytaj wynik przetwarzania i wyrzuć na port D ADconv: in r16, ADCH ldi r17, 240 cp r17, r16 brcs ADCgreater ldi r17, 60 cp r17, r16 brcc ADClower out PORTD, r16 rjmp ADCustaw ADCgreater: ldi r16, 240 out PORTD, r16 rjmp ADCustaw ADClower: ldi r16, 60 out PORTD, r16 ADCustaw: ldi r17, 10 mul r16, r17 out OCR1AH, r1 out OCR1AL, r0 reti T1ovf: sbi ADCSRA, ADSC reti
  11. Każde odejście od synchronizmu w silniku BLDC skutkuje natychmiastowym spadkiem momentu obrotowego do bardzo małych wartości. Przy niskich prędkościach można sobie stosować sam stopień wyjściowy z przełączników tranzystorowych i prosty program który w odpowiednich kolejnościach poda impulsy sterujące, ale jeśli chce się uzyskać jakiś przyzwoity moment to musi być jednak jakiś czujnik położenia - hallotron, pomiar napięcia na uzwojeniach (przejście przez zero, wartość szczytową).
  12. No ja osobiście zaciskam zębami, bardzo skuteczna metoda. Przez chusteczkę można, żeby nie zostawiać śladów zębów na wtyczce.
  13. Takie cuś? http://www.atel.com.pl/produkt.php?hash=02266
  14. Mógłbyś użyć przetwornika z serii AD5300. Z noty katalogowej wynika, że obsługuje interfejs SPI. Mógłbyś wtedy użyć modułu RFM12, obsługującego SPI. Tyle, że moduł jest dwukierunkowy, więc byłby to pewnego rodzaju przerost formy nad treścią. Poza tym są tańsze moduły radiowe. Mógłbyś użyć modułów HM-T868S i HM-R868S, które są jednokierunkowe. Wtedy można by na przykład wysyłać UARTem, a po stronie odbiorczej dać mikrokontroler, który będzie odbierał UARTowy kod, a na przetwornik będzie wysyłał już jego postać w SPI. Tyle z moich pomysłów.
  15. Te goldpiny na dwóch zdjęciach kolejnych to ten sam element, tylko w jednym przesunąłem plastik. Na zdjęciu pazurami przesuwam, coby było coś widać, najłatwiej ścisnąć palcami i przycisnąć do twardej powierzchni. Aha, długość nie jest może odpowiednia, żeby robić jakieś bardzo odporne mechanicznie połączenia (prom kosmiczny, SR-71 itp.), ale w przypadku płytki stykowej to w zupełności wystarcza. Do poniższego posta, prawdopodobnie chodzi o ten temat: https://www.forbot.pl/forum/topics27/jak-ugryzc-goldpiny-domowy-sposob-na-robienie-zlacz-blt-vt3535.htm
×
×
  • Utwórz nowe...