Skocz do zawartości

slon

Użytkownicy
  • Zawartość

    158
  • Rejestracja

  • Ostatnio

  • Wygrane dni

    1

slon wygrał w ostatnim dniu 3 czerwca

slon ma najbardziej lubianą zawartość!

Reputacja

94 Bardzo dobra

O slon

  • Ranga
    5/10

Informacje

  • Płeć
    Mężczyzna

Ostatnio na profilu byli

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

  1. W tym czujniku jest po soczewką miejsce na fotorezystor. https://www.eevblog.com/forum/beginners/photoresistor-with-hc-sr501-pir-39212/ @mihuu jak poszukasz to pewnie znajdziesz kompletny przewodnik jak dokładnie to zrobić i na co zwrócić uwagę. W ten sposób wystarczy tranzystor/przekaźnik do załączania oświetlenia. Jak chcesz energooszczędny procek to możesz spróbować z stm8L zamiast AVR. To dalej 8bitów ale o wiele więcej peryferiów i pobór prądu nawet <1uA (tak podaje dokumentacja). Ciekawy zestaw z tym procesorem to stm8L-DISCOVERY.
  2. Można by też sięgnąć do dokumentacji i skonfigurować odpowiednie rejestry na piechotę. Poniżej przykład dla stm8L. // config PORTB PB_DDR = 0xff; // all output PB_CR1 = 0xff; // all push_pull // buton pin : input floating with interrupt PC1_CR2 = ENABLE; procedura przerwania @far @interrupt void buttonPress (void) { static char pin; EXTI_P1IS1 = SET; PB_ODR = ((unsigned char)(1<<pin)); if(pin<8) ++pin; else pin=0; EXTI_P1F = CLEAR_W1; }
  3. @Chev spróbowałem u siebie ustawić przerwania na stm8L w ten sposób: //Clock source/prescaler default HSI div/8 = 2MHz //Enable clock to periphrals CLK_PCKENR2 |= 1<<PCKENR2_TIM1; //Counter clock frequency 1ms CK_CNT = CK_PSC/(PSCR + 1) TIM1_PSCRH = 0x07; TIM1_PSCRL = 0xCF; //Enable TIM1 TIM1_CR1 = 1<<CEN; // Enable tim1 update interrupts TIM1_IER = 1<<UIE; // tim1_ARR = 6000 1ms*6000=6s TIM1_ARRH=0x17; TIM1_ARRL=0x70; //enable interrupts rim(); W przerwaniu kasuje flagę przepełnienia UIF=0. Działa poprawnie.
  4. Tak zgadza się. Aczkolwiek w tym projekcie jest void setAddress(int address) dlatego podałem możliwość użycia highByte() oraz lowByte. w twoim kodzie jest: address >> 8 highByte() robi to samo #define highByte(w) ((uint8_t) ((w) >> 8)) w przypadku lowByte() jest inaczej. Aczkolwiek trzymaj się tego co bardziej Ci odpowiada.
  5. Ogólnie bardzo fajny projekt. Jedyne co zapisał bym inaczej (bardziej arduinowo) to: shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, highByte(address)); shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, lowByte(address)); Jak dla mnie jest to bardziej "human readable"
  6. Konkursu nie robię. Na hobby czasu ostatnio mało. Na jednej płytce mam timer1 skonfigurowany tak jak wyżej: F_CPU 16000000UL Preskaler 1024 1024/16= 64 mikrosekundy dla OCR1A=1 (najkrótszy impuls). Maks. czas trwania stanu wysokiego/niskiego 16ms (256*64=16384). Więcej na razie nie potrzebuję. Na drugiej płytce timer1 ustawiony w tryb input capture (F_CPU i preskaler tak jak na pierwszej płytce). Czas trwania stanu niskiego i wysokiego (ilość cylki TCNT1) ma być wyświetlana na ledach jako wartość binarna (czyli dobrze by było mieć dwa całe porty do dyspozycji). Na chwilę obecną przetestowałem to na atmedze328p (docelowo kod zostanie nieco zmieniony): #include <util/atomic.h> #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t captureL[256]; volatile uint8_t captureH; volatile uint8_t i=0xFF; void timer1_input(){ TCCR1A = 0; TCCR1B = 1<< ICES1 | 0<< WGM13 | 0<< WGM12 | 1<< CS12 | 0<< CS11 | 1<< CS10; //prescaler 1024 TIMSK1 = 1<< ICIE1; // enable capture event interrupt TCNT1 = 0xFF00; } int main(void) { DDRD |= 1<<DDD7 | 1<<DDD6 | 1<<DDD5 | 1<<DDD4 | 1<<DDD3 | 1<<DDD2; timer1_input(); sei(); while(1) {} return 0; } ISR(TIMER1_CAPT_vect) { i++; captureL[i] = ICR1L; captureH = ICR1H; /* change edge detection */ TCCR1B ^= 1<< ICES1; /* clear input capture interrupt flag */ TIFR1 |= 1<< ICF1; /* ICR1L on PORTD */ if (i != 0) PORTD = captureL[i] - captureL[i-1]; } Najniższa wartość dla OCR1A jaką wpisywałem to 4 (czyli 256 mikrosekund). Z racji tego , że chciał bym mieć dwa pełne porty i najlepiej jeden mikrokontroler AVR zastanawiam się nad atmegą 169P ? TQFP64 (cena jak za atmege32).
  7. Dla zgodności z AS7 i dokumentacją DDRB = 1<< DDB1 | 1<< DDB0; if (!(timer1Copy == 0x00FF || timer1Copy == 0xFF00)) PORTB ^= 1<<PORTB0;
  8. @Karolus odpaliłem dzisiaj AS7 żeby zobaczyć jak to dokładnie wygląda. W external tools w polu command wklejasz: C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe poniżej w arguments -p m328p -c arduino -PCOM4 -b 57600 -D -v -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i -b 57600 będzie poprawne dla większości klonów z atmegą 328p -b 115200 dla orginalnego uno R3 (może inne też) Możesz sobie podejrzeć te wartości w : C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt Wstaw poprawny numer portu com i daj znać czy działa. Zapomniałem o avrdude.conf. Aby to zadziałało skopiuj wspomniany plik avrdude.conf z C:\Program Files (x86)\Arduino\hardware\tools\avr\etc do C:\Program Files (x86)\Arduino\hardware\tools\avr\bin czyli tam gdzie jest avrdude.exe. W ten sposób nie będziesz musiał przekazywać parametru -C. Lub jak chcesz możesz go przekazać w polu arguments
  9. @atMegaTona jeśli piszesz do mnie to ja usbISP czy usbasp-clone? posiadam. Używam z progISP(przy zakupie programatora dostałem informację , że z avrdude nie jest kompatybilny) Jeśli chodzi o ilość miejsca przeznaczonego na bootloader to tak jak widać mam 4 opcje dla fusebitu BOOTSZ (tak też podaje reference manual). Czyli jak by nie patrzeć to i tak muszę zarezerwować przynajmniej 4 strony w pamięci flash chociaż bootloadera nie wgrywam. Więc jak to w zasadzie jest z tym oszczędzanie miejsca? O BLB NRWW i RWW tylko pobieżnie przeczytałem ale jakoś w całość mi się to nie ułożyło. Jak byś miał trochę czasu i chęci to opisz ja to dokładnie wygląda.
  10. Dla pewności sprawdziłem jak to działa w arduino-cli. arduino-cli upload -b arduino:avr:pro:cpu=16MHzatmega328 -p COM16 mysketch Konwerter mam z wyprowadzonym sygnałem DRT więc celowo go nie podpinałem. Za trzecim podejściem wgrałem kod przy ręcznym resetowaniu pro mini a więc stwierdzenie : jest nieprawdziwe. Rozwiązanie masz sprawdzone i możesz go użyć z dowolnym edytorem pod windows/linux.
  11. Ok skoro tak to najprościej zainstaluj arduino-cli. W AS7 odpalasz terminal kompilujesz i wgrywasz przez arduino-cli.
  12. czyli rozumiem, że wklejasz lub zaznaczasz w arduino IDE(external editor) kod, który piszesz w AS7 następnie kompilujesz i wgrywasz przez Arduino IDE? Czy przy tym konkretnym arduino pro mini za każdym razem jak naciśniesz reset program wgrywa się przez arduino IDE ? Czas jaki masz na wciśnięcie przycisku reset jest bodajże zależny od bootloadera (w arduinowym jest go naprawdę niewiele). CH340 posiada sygnał DTR tyle , że w tym konwerterze nie jest wyprowadzony (aczkolwiek można by go było wyprowadzić). Jeśli masz kilka sekund na wciśnięcie przycisku reset (ponoć w niektórych bootloaderach nawet około 5s) to spokojnie można obejść się bez DTR.
  13. Masz na myśli Arduino IDE? Co to za programator? Najlepiej pokarz (foto ,rysunek) jak to jest podłączone do arduino. Pewnie czytałeś wątek na forum pod tytułem "dlaczego arduino jest fajne". Ja na chwilę obecną korzystam z notepada++ oferuje naprawdę wiele możliwości. Kompilacja i upload też jest z poziomu notepada++(lub progISP do upload). Z Arduino IDE w zasadzie już nie korzystam od jakiegoś czasu. A atmelStudio nie przypadło mi do gustu. Notepad++ ma opcje , których niema w atmelStudio (Oczywiście działa to też w drugą stronę ).
  14. W zasadzie to procedurę przerwania można zapisać tak: ISR(TIMER1_COMPA_vect) { timer1 ^= 0xFFFF; } Działa zgodnie z założeniami. Nie pozostaje mi nic innego jak przyznać , że @Elvis i @ethanak mieli rację.
×
×
  • Utwórz nowe...