Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

początki programowania

26 Lut 2004 17:29 5626 10
  • Poziom 12  
    zacząłem się bawić w programowaie na atmelach (dokładnie na ATMega). zapalanie, gaszenie, zmiany portów to mi wychodzi, ale pojedyncze bo kilka zmian na wyjścach nie jestem w stanie zauważyć przez brak opóźnienia. Czy ktoś mógłby mi pomóc jak zrobić jakąś przerwe czasową ok. 1-10ms oraz w granicach 1-2s.kwarc zastosowany w mikrokontrolerze to 11MHz. krąże myślami obok procedury
    wait:
    ldi temp, 255 ; załaduje do temp 255
    dec temp ; zmniejszam o 1 temp
    cpi temp, 0 ; porównuje czy jest równe 0
    brne wait ; jeśli tak to koniec podprogramu jeśli nie to powrót do wait
    ret
    ; i powinno to iść 255 razy jak sie skończy to powrót z podprogramu; zakładając że każda instrukcja zajmuje 1 do 2 cykli to przy 11MHz zajmie to ok 4*255*1/11M to wychodzi ok. 90mikrosekund
    ale nie wiem czy dobrze kombinuje.w każdym razie wydaje mi się że dojście do 1s wymagałoby ok 11000 takich odwołań a na pewno jest prostszy sposób. Wszędzie gdzie nie poszukam znajduje tylko programowanie w C albo Bascomie i obszerne do tego opisy ale nigdzie nie potrafie znaleźć coś na temat asemblera (jest coś ale to dotyczy programowania mikroprocesorów w komputerach-a to stanowczo za wysoko dla mnie i inna obsługa, a do mikrokontrolerów znalezione opisy to już poważne programy zajmujące po kilka stron), a to co sie w mojej główce narodziło powyżej to jest na podstawie tych nielicznych na temat asemblera. nie moge znaleźć tych "podstawowych" podstaw. kto może pomóżcie. dzieki

    Przeniesiono z Programowanie Ogólne. - arnoldziq
  • Poziom 42  
    A nie możesz tej pętli umieścić w jeszcze jednej pętli a potem w jeszcze jednej? Powinno wystarczyć chociaż nie mam praktyki na AVR. Jeśli ma procek tylko generować opóźnienia to będzie ok, ale jeśli w tym czasie ma robić jeszcze coś innego, to trzeba zastanowić się nad użyciem timerów i przerwań.
  • Poziom 11  
    Witaj
    Kolega elektryk dokladnie a raczej fachowo :) ci to wytlumaczyl a ja ci pokaze na przykladzie :

    wait:
    ldi temp, 255 ; załaduje do temp 255
    wait_1:
    ldi temp1,255
    wait_2:
    ldi temp2,255
    wait_3:
    dec temp2 ; zmniejszam o 1 temp2
    ;cpi temp, 0 ; porównuje czy jest równe 0-> z tego mozesz zrezygnowac bo
    ; flaga Z jest automatycznie ustawiona gdzy wynik dec temp2 jest rowny 0 czyli instrukcja ta jest zbedna

    brne wait_3 ; jeśli rowne zero to odejmij nastepna
    dec temp1
    brne wait_2
    dec temp
    brne wait_1 ;jesli rowne zero to zakoncz jesli nie skocz na poczatek
    ret

    Jak widzisz kod niewiele sie zwiekszyl a czas mozesz ustawiac do ok 6 sekund a wstawiajac dodatkowe petle mozesz ten czas wydluzyc 255 *6 = ok 1500 sekund -> 1500*255 = .... itd. Mozesz tez inaczej wstawiajac sobie podprogram ktory odmieza dokladnie np 1 ms i go wstawic w petle(lub petla w petli) :
    ...
    ldi temp,255 ;w zmeinnych temp i temp1 mozesz ustawiac opuznienie w zakresie 1 do 65535 (255*255) ms
    wait:
    ldi temp1,255 ;w zmeinnych temp i temp1 mozesz ustawiac opuznienie w zakresie 1 do 65535 (255*255) ms
    wait_1:
    call wait_1ms ;pamietaj aby NIE kozystac ze zmiennych (rejestry) temp w podprogramie wait_1ms, albo
    ;odkładać na stos uzywane zmienne w podprogramie wait_1ms !!!
    dec temp1
    brne wait_1
    dec temp
    brne wait
    ...

    ps. Zbadaj swoj program i zastanow sie czy on by dzialal. :wink:
  • Poziom 11  
    aaa i jeszcze jesli chcesz sie dowiedzie sporo o asemblerze na avr to polecam ksiazke "Programowanie mikrokontrolerów rodziny AVR" Arkadiusza Krysiaka. Dobra ksiazka uczaca od podstaw asemblera z czescia praktyczna gdzie sa gotowe podprogramy z opisami np. obslugi wyswietlaczy LED, czy klawiatury matrycowej. Kiedys byla dostepne w sklepie AVT nie wiem jak teraz.
  • Poziom 12  
    dzieki Feniks własnie o takie proste wytłumaczenie mi chodziło, sprawdze to w domu i zobacze jak działa. w miedzyczasie sie troche pobawiłem i natknąłem się na jeszcze jeden problem:
    czy ktoś mógłby mi wytłumaczyć co sie dzieje? a wiec tak napisałem głupi programik dla zabawy:
    .include "M16def.inc"
    .def Temp =r16
    poczatek: jmp reset ;skok do reset
    RESET: ser Temp ;ustawienie temp
    out DDRB,Temp ;ustawienie B jako wyjście
    a: ldi temp, 120 ;załadowanie 120 do temp
    dec temp ;dekrementacja
    call czekaj ;przeskok do podprogramu czekaj
    dwa:
    ldi temp, 245 ;załadowanie 245
    out portB, temp ;załadowanie temp na wyjście B (zaświecenie części diód)
    koniec: rjmp koniec ;koniec i zapętlenie
    czekaj: ;podprogram czekaj
    ldi temp, 255 ;załadowanie 255
    cz1: dec temp ;dekrementacja
    cpi temp, 253 ;porównanie z 253
    brne cz1 ;jeśli różne to skok do cz1 i tak do czasu aż bedzie 253
    ret ;powrót z podprogramu
    i po tym powrocie z podprogramu nie wraca tak jak by mi się wydawało do miejsca w którym sie rozpoczął (koniec etykiety a:), tylko do początku programu (etykieta poczatek:). robiłem to na przykładzie innych programów, które znalazłem w sieci-W nich podobno wszystko grało. nie wiedziałem co sie dzieje aż załatwiłem sobie AVR-studio i tam na symulatorze dopiero zobaczyłem te powroty do początku programu. robiłem różne warianty tego programu i zawsze to co znajdowało się poniżej jakiegokolwiek odwołania do podprogramu nie było wykonywane bo program zawsze po wykonaniu podprogramu wracał do początku. nie wiem może stosuje złe komendy, ale próbowałem wszystkich komend dla tego procesora na wywołanie podprogramów i nic (chyba że źle zrozumiałem całą zasadę wywołania podprogramów). siedze nad tym już drugi dzień i nie mam pojecia co robić, a kończy mi sie czas na wypożyczenie sprzetu do programowania. pomóżcie.
    a propo książki mam jedną nie pamiętam autora ale tytuł "mikrokontrolery AVR". bardzo dobra i dokładnie opisana tyle że przykładowe programy są tam pisane w C arghh.. ale widze że on pojawia się coraz częściej a asembler jakoś zanika. ale dzieki za informacje
  • Poziom 11  
    Wszystko dobrze napisales tylko zapomniales o tym ze funkcje call itp. odkladaja adres powrotu na stos, a u ciebie nie masz ustawionego tego stosu Musisz na samym poczatku, zaraz pod etykieta RESET wstawic instrukcje inicjalizujace stos:

    ldi temp, LOW(RAMEND)
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp

    Musisz zawsze o tym pamietac.
    A jesli chodzi o asembler i C to polecam ci nauczyc sie asemblera a potem jezyka C. Bo napisac program np na ATMEGA16 w asemblere to 8000 linijek asemblera (przy uzyciu calej pamieci) !!! wiec zycze powodzienie :P ale za to asm przydaje sie jak mamy napisac jakies "szybkie" i malo zajmujace procedurki ktore potem wstawiamy do C.
  • Poziom 12  
    FeniX wisze ci piwo i to duże. jak bedziesz w Jastrzębiu albo w okolicy to daj znać. jedna komenda i zaczeły mi chodzić wszystkie programiki pisane dla zabawy - dla mnie bardzo duży krok naprzód. mam w domu 3 książki związane z programowaniem ale (tej o której pisałeś nie udało mi się na razie dostać) i w żadnej nie znalazłem komendy z dopiskiem "RAMEND" - nie wiem skąd się wzieła ale działa.dzieki za przykład praktyczny, z tego najlepiej się uczy. paru znajomych zrezygnowało z nauki programowania ponieważ zacinali się właśnie na początku na takich błachostkach, ja ruszyłem dzieki tobie troche dalej. jeszcze raz dzieki. w sumie mógłby powstać gdzieś kącik dla "początkujacych " początkujących. teraz jeszcze czeka mnie uruchomienie wyświetlacza LCD ale chyba już jakoś pójdzie.
  • Poziom 11  
    Hehe dzieki zawsze sluze pomoca jak chodzi o programowanie AVR'kow :lol:

    Teraz jesli chodzi o te "RAMEND" to zajrzyj do pliku z definicja danego procesora zobaczysz ze to poprostu ostatnia komorka pamieci ram (raczej jej adres). Dlatego ostatnia, ze stos w AVR'kach jest "malejacy", czyli wartosci odkladane sa na coraz mniejszy adres pamieci, czyli jednym slowem po kazdym odlazeniu na stos zmienjszany jest wskaznik stosu (SPH i SPL), ktory jest natomiast adresem komorki, pod ktora zostanie zapsiana odkladana wartosc. Przy pobieraniu ze stosu jest dokladnie odwrotnie. Czyli moglbys za mast slowa RAMEND wstawic adres ostatniej komorki pamieci RAM. To teraz juz wiesz dlaczego ostania komorka pamieci.

    To takie z grubsza wytlumaczenie stosu, ale mysle powinno pomoc. Jesli bedziesz mail jeszcze jakies nie jasnosci lub na czyms 'utkniesz' to wall smialo, bo przeciez co dwie glowy to nie jedna :D :D :D :D
  • Poziom 12  
    dzieki Fenix. moja sprawa wygląda tak mam zrobć zasilacz sterowany cyfrowo (ustawiamy napięcie i ograniczenie pradowe). gościu mi powiedział bym zrobił część wykonawczą i sterującą przygotował a sam sobie napisze oprogramowanie. obie rzeczy wykonałem a chciałbym jeszcze sprubować to oprogramować. miałem kiedyś styczność z 8051 ale to były małe zabawy a nie nauka programowania a programując tego AVR-a zawsze sie troche podszkole co akurat w dzisiejszych czasach na pewno sie przyda. tyle że to chyba troche duzo jak na początki programowania. wyjasnię ci sprawe:
    a wiec będzie to zasilacz sterowany przez mikrokontroler z wykożystaniem wyjścia PWM-pin PD3, będzie musiał być 10-bit- (pełne wypełnienie ma dać +15V zerowe wypełnienie zaś -15V). część "wykonawcza" jest już gotowa i działa. układ przy okazji dokonuje pomiaru napięcia(-15 do 15V) i prądu (-2A do +2A). sygnały pomiarowe są doprowadzone do wejść 10-bitowych ADC mikrokontrolera, do PA) i PA1, i dostosowane do wewnętrznego napięcia odniesienia (0 do 2,56V). sterowanie będzie przez 2przyciski na napięcie (góra, dół) i dwa na prąd, a właściwie na ograniczenie prądowe (góra, dół) będa dołączone do wejśc PB0 do PB3 i będą zwierały do masy, i może bedzie jeszcze potencjometr cyfrowy do napięcia (firmy BOURNS). ustawione napięcie ma być odwzorowane na wyjściu i układ ma cały czas wyświetlać aktualną wartość napięcia i pradu oraz ustawione ograniczenie prądowe. w razie przekroczenia wartości prądu ma zmniejszać napięcie do wartości przy której prąd jest "dozwolony". ponieważ zostało dośc dużo miejsca wiec LCD będzie w trybie 8-bitowym (DB0 do DB7 na Pc0 do PC7 oraz r/s i E na PD6 i PD7). takie sobie zrobiłem założenia i na razie mam powiedzmy pojedyncze-osobne cząstki programu (jeszcze nie wszystki) i próbuje do czegoś dojść. fktem jest że niezwykle jest tu pomocny AVR-studio bo widać tam co sie dzieje. napisałem sobie szkic programu i myśle że z grubsza powinien być dobry. jak zauważyłbyś jakieś nieścisłości to daj znać, a ja jak będę miał jakis problem to na pewno sie zgłosze. daj mi najwyżej swego mail-a bo ja do kafejki mam dośc daleko a telekomunikacja jeszcze do mnie nie dotarła. jeszcze raz dzieki
  • Poziom 11  
    Projekt brzmi interesująco i dosc ciekawie, W schemacie wszystko wyglada na przemyslene (ja bym tylko zmienil kolejność inicjalizacji LCD, bo trwa ona dosc dlugo ok. 10 ms, z inicjalizacja PWN, bo nie wiedomo jak układ będzie się zachowywal przy braku sygnalu PWN, żeby przypadkiem nie podal napiecia ujemnego i zbyt duzego, chyba ze to uwzgledniles w projekcie  ). Zapewne się troche napracujesz piszac to w asemblerze, ale mysle ze dasz rade, ale pewno nie raz się „zatniesz” na czyms :P. Zycze powodzenie i jak cos to pisz na email gumis(malpa)btk.net.pl
  • Poziom 12  
    jeśli chodzi o brak sygnału to zabezpieczyłem to na zwykłym dzielniku rezystancyjnym i działa. w AVR-ach na razie siedze przy PWM-tylko tryb fastpWM który chce wykożystać mi nie działa a inne uruchamiam bez problemu ale posiedze i jakoś zrobie