Skocz do zawartości

jnk0le

Użytkownicy
  • Zawartość

    22
  • Rejestracja

  • Ostatnio

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.

Osiągnięcia użytkownika jnk0le

Starszy odkrywca

Starszy odkrywca (5/19)

  • Za 5 postów
  • To już rok!
  • To już 5 lat!
  • Młodszy Juror

Odznaki

1

Reputacja

  1. U mnie wywala "error: odd address operand: -7" (etykieta '1' występuje w __builtin_avr_delay_cycles()). Najlepiej nadawać etykietom unikalne nazwy (np. poprzez '%='), albo skakać do nich w konwencji '1f', '1b'. http://www.nongnu.org/avr-libc/user-manual/inline_asm.html
  2. Ciekawe o ile mniej stron by było gdyby prośba o kod została spełniona 😉
  3. Nie wiem o czym piszesz 🙂. Plik generowany przez avr-objdump, ze zdekompilowanym kodem. Jeśli nigdzie go nie ma, to wrzuć przynajmniej ten problematyczny 11 efekt co się zawiesza.
  4. Jak na razie to widziałem tylko kod do efektu 6. Ale, po głębszej analizie tego co już wrzuciłeś wynika że: 1. Bit_send nie powinien być wywoływany z włączonymi przerwaniami szczególnie że pakuje 3 adresy powrotu na stos (+własny oczywiście). 2. Przed włączeniem przerwań należy zdjąć ze stosu adres powrotu przerwania jak i wywołanej funkcji, chyba że funkcje umieścisz bezpośrednio w przerwaniu. pop r0 pop r0 4. To że z NoSave nie wiesza się to tak łatwo, to raczej kwestia tego że kod już nie zrzuca 32 rejestrów na stos przy każdym wejściu w przerwanie. 5. Różnice w działaniu atmegi z ali i tme wynikają z tego że przepełnienie stosu jest najprawdopodobniej sytuacją niezdefiniowaną, a żółtki mają ogromny problem z kopiowaniem, takowych. Możliwości w tej sytuacji jest kilka: - powrót wskaźnika stosu na swój początek - zatrzymanie się wskaźnika stosu (Bit_send przestaje działać) - pisanie po przestrzeniu IO (Bit_send przestaje działać) - całkowita zwiecha 6. Jakiś babol w 11 efekcie. Bez .lss ciężko mi wywróżyć coś więcęj.
  5. Ehh, czy to co coś zmieni? Skoro na odwrót nie działa, wgrałbym dokładnie ten sam kod, który wgrywałem do arduino mini, uno i na płytkę testową z propoxa, do której jest włożony Atmega328P z Chin. I co rozumiesz pod pojęciem dokładnego testowania? Za każdym razem robię dokładny test. Jak wygląda użycie zasobów przez program (flash, ram)? Bo jeśli jest to problem ze stosem a te chińskie atmegi328 tylko udają że mają 2 kB SRAMu to program się zawiesza po 40 razach zamiast po np. 500.
  6. To już się robi tak zagmatwane że tylko .lss całości może rozwiązać wszelkie wątpliwości. 🙂 Z wrzuconego kodu Bit_send, bez wglądu w całość, ciężko również wywnioskować co właściwie ma robić lub jaki ma efekt wrzucanie rejestrów na stos bez żadnego kodu do ich zdejowania: $asm Bit_send: ldi r17, Ile_ledow clr R18 clr r19 ;**************************************** LDI XL , LOW(LABEL3) LDI XH , HIGH(LABEL3) PUSH XL <------------------- Push XH <------------------ LDI XL , LOW(LABEL2) LDI XH , HIGH(LABEL2) PUSH XL <------------------- Push XH <------------------ LDI XL , LOW(LABEL1) LDI XH , HIGH(LABEL1) PUSH XL <----------------- Push XH <----------------- IN R23, SPL <--- SP jest ładowany już po wrzuceniu danych na stos in R24, sph Led_loop_: ... A wracając do tematu dyskusji; to jeśli przerwanie wywołuje podprogram który czeka w pętli nieskończonej na kolejne przerwanie, to nie tylko musisz zdejmować ze stosu adresy powrotu zarówno w przerwaniu jak i w podprogramie czy tablice alokowane na stosie(SP), ale również zrzucone rejestry na wejściu do przerwania. Coś takiego to tylko w assemblerze się widuje gdzie ma się pełną kontrolę nad stosem a nie w BASCOM'ie. Oczywiście pomijam możliwość zastosowania "chińskich jednostek", przez alternatywnego producenta, gdzie 2kB to w rzeczywistości 1 kB i objawia się to właśnie nachodzeniem stosu na zmienne. 😉
  7. Niestety ta "metoda" w tym przypadku zawiodła bo z 5,5 zrobiło się 12 😉 Najprościej jest się zapoznać z możliwymi prędkościami dla danego zegara i nie kombinować licząc ubbr za każdym razem. http://wormfood.net/avrbaudcalc.php
  8. 9600bps bez U2X nie uzyskasz na 1MHz. A UBBR lepiej makrem wyliczyć niż przepisywać z kalkulatorów. #define BAUD_CALC(x) ((F_CPU+(x)*8UL) / (16UL*(x))-1UL)
  9. Taką metodą bedą przysyłane znaki w kodowaniu ASCII a nie binarne wartości 0-255. Po za tym, zamiast tak kombinować, można zastosować już mocno oklepane formaty ramek czyli : 1: komenda 2: opcjonalne - długość ramki danych jeśli nie jest stała 3: parametr 1 4: parametr 2 n: parametr n n+1: opcjonalne - crc
  10. while (1) //Pętla główna { _delay_ms(30); PORTC |= (1 << TRIG1); _delay_us(10); PORTC &= ~(1 << TRIG1); echo_flag1 = 0; //wprowadzona poprawka!! } while (1) //Pętla główna { _delay_ms(30); PORTC |= (1 << TRIG); _delay_us(10); PORTC &= ~(1 << TRIG); echo_flag = 0; //wprowadzona poprawka!! } Obie te pętle musisz scalić w jedną.
  11. jnk0le

    Szeregowy monitor Atmega8l

    http://www.ascii-code.com/ Znak "3" odpowiada kodowi asci 51. możesz trzymać odebrane znaki w zmiennej typu 'char' albo zrób rzutowanie: Serial.println((char)y);
  12. Wygląda mi to na zaszłość z avr'ów gdzie atmega8 nie była łaskawa zmieścić najprostszego migania diodą na -O0 😉 No ale że to jest arduino to musiało tam się znaleźć -g z którego nikt nigdy nie skorzysta. (pewnie stąd te 72kB) a kompilacja pod i586 to tak jak pisałem wcześniej. Na quarka nikt nie będzie pisał z poziomu Arduino bo a) Arduino już lepiej odpalać na rdzeniu głównym. b) Quark ma własne api z mniejszym narzutem
  13. jnk0le

    PWM do silnika BLDC

    Wcięcia najlepiej tabulatorem robić. Jak dla mnie również klamra otwierająca nie powinna być w tej samej lini co warunek/pętla/etc. if (digitalRead(pierwszy)==1) { //while(1) while(digitalRead(niezerowy)==0) // bezproblemowe podmiany //if (digitalRead(zerowy)==0) { digitalWrite(10,1);digitalWrite(9,0);digitalWrite(8,0); TCCR0A &= ~(1<<COM0A0); TCCR0A &= ~(1<<COM0B0); TCCR2A = (1<<COM2B0); } } Dzięki temu można łatwo namierzyć wszelkie błędy - oraz np. zakomentować "poprawne-ale-jednak-błędne "if'y aby skorzystać z czegoś innego.
  14. http://akizukidenshi.com/download/ds/intel/edison-module_HG_331189-002.pdf ICC, nawet ładny tutorial powstał dla Edisona. https://software.intel.com/sites/default/files/managed/70/1f/Build%20and%20Debug%20Applications%20for%20Intel%20Edison_u1.pdf A oto benchmarki przygotowane o których mowa: https://software.intel.com/en-us/articles/use-edison-sdk-chroot-to-build-up-performance-application tymczasem w niezależnych źródłach różnica bardzo często zawiera się w granicach błędu pomiarowego. Nawet jak użyli tylko -O2/3 to w gcc zabrakło jawnego podania -march=core2 -msse4.2 (icc i tak niejawnie kompiluje z SSE)
  15. "Polityka" Intela to bardzo szeroki temat Problem w tym że jest to Atom (pełne SSE4.2) z wyciętymi nieużywanymi peryferiami i obniżonym taktowaniem. Na podstawowym wariancie i586 bazuje Quark. Traktowanie Atoma jako takiego 100MHz szybszego quarka i przygotowywanie benchmarków (gcc vs icc które linkuje do bibliotek korzystających z SSE) da oczywiste wyniki.
×
×
  • 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.