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.

[ATtiny2313]+Bascom+zapis/odczyt danych do pamięci RAM

22 Maj 2009 21:31 3315 5
  • Poziom 19  
    Witam. Mam następujący problem, który wyskoczył mi podczas zabawy z bascomem. Zadałem sobie pewne zadanie (związane z robotem-samochodzikiem na którego przodzie umieszczona jest krańcówka dająca stan 1 na jeden z portów) którego opis jest następujący:
    Ustawiamy robota w punkcie A.
    Pojazd dostaje komendę "start" i włącza się licznik zliczający czas. Robot jedzie po linii prostej i powiedzmy po 10 sekundach uderza w przeszkodę(oznaczoną jako miejsce "B") zmieniając stan danego portu. Do tego momentu doszedłem bez problemu. Teraz gł. część zadania jest to, by robot zapamiętał ten przejazd.Teraz po usunięciu tej przeszkody(zaznaczając jej położenie markerem) robot musi odtworzyć to co zrobił, czyli po ułożeniu go na punkcie A,musi dojechać do punktu B i na nim się zatrzymać.

    Mam nadzieje, że jasno wyjaśniłem mój problem.
    Wyobrażam sobie to tak, że włączamy jakiś licznik równocześnie z komendą 'start' i w punkcie B krańcówka dając sygnał zapisuje wartość tego licznika do pamięci RAM (bądź eeprom) i po ponownym uruchomieniu podprogramu 'start' robota (nie odłączając zasilania) robot jedzie i zatrzymuje się gdy wartość tego licznika równa się tyle ile wpisaliśmy podczas poprzedniego przejazdu.

    Proszę o jakieś wsparcie odnośnie strony programowej.
    Nie chce gotowców, lecz byście mnie naprowadzili na odpowiednią drogę.
    Pozdrawiam
  • Poziom 22  
    Proponuje użyć tablicy. Do kolejnych jej elementów zapisujesz czasy poszczególnych odcinków. Potem porównujesz zawartość tablicy z aktualnymi pomiarami i wiesz czy jest już przeszkoda czy nie.
  • Poziom 19  
    Z tym, że tablice musiałbym wcześniej wpisać w program, a mi chodzi o to, by "uczyć" tego robota danego zadania. Jeśli zmieniłbym odległośc punktu A od B i znowu postawił przeszkode, w którą by robot uderzył, to wtedy ponownie musiałby zapamiętać nową trase. Przy czym jeśli działałbym w obrębie pamięci RAM, kasowałbym ją po prostu resetem zasilania.
  • Pomocny post
    Poziom 36  
    Kuczus napisał:
    Z tym, że tablice musiałbym wcześniej wpisać w program, a mi chodzi o to, by "uczyć" tego robota danego zadania. Jeśli zmieniłbym odległośc punktu A od B i znowu postawił przeszkode, w którą by robot uderzył, to wtedy ponownie musiałby zapamiętać nową trase. Przy czym jeśli działałbym w obrębie pamięci RAM, kasowałbym ją po prostu resetem zasilania.


    Czyli w zasadzie chcesz odwzorowac to co praktycznie stosuje sie przy programowaniu prostych funkcji robotow przemyslowych t.zw. "Teaching Point-To-Point Mode" (roboty spawalnicze, proste czynnosci przenoszenia, ustawiania itp), polegajacy na ustawieniu robota w okreslonej pozycji i programowaniu do pamieci (zazwyczaj EEPROM) tego polozenia i tak punkt, po punkcie az do zakonczenia zadania. Zabiera to przewaznie 6 informacji dla kazdego punktu (6- punktow swobody w przestrzeni) plus czynnosci towarzyszace tym polozeniom.
    W twoim wypadku programujesz tylko jedna zmienna - wybrales CZAS, moze to byc OK, pod warunkiem ze ze masz zawsze stala predkosc i nie ma poslizgow.

    Jezeli umiescisz ta zmienna w programie to musisz ja kazdorazowo programowac po wlaczeniu systemu lub RESET.
    Zechcesz ta zmienna trzymac dluzej umiescisz ja w eeprom.
    Sposobow programowania jest kilka:
    Jednym z nich moze byc;
    -ten z frontu 'czujnik' podlaczysz i skonfigurujesz jako interrupt - Int0 lub Int1, albo dowolny PCINT;
    w programie umiescisz (nie w 'Do ...... loop')

    On Int0 Program_czas
    albo
    On Int1 Seteeprom

    'albo On dowolny PCINT costam....
    ..............
    Program_czas:
    'tu procedura programowania zmiennej T
    return
    .........
    Seteeprom:
    'tu procedura wpisania zmiennej T do eeprom
    return
    .........

    Oczywiscie:
    zmienna 'T' jest to czas zadany dla pracy silnika w jakiejs funkcji inicjowanej przez okreslony impuls/stan w START
    Zmienna 'Temp' - czas mierzony od pozycji START;
    musisz te zmienne odpowiednio zwymiarowac (Dim) i dac w programie warunek zabezpieczajacy na przypadek "przepelniena" zmiennej 'Temp' powyzej optymalnego czasu dla twoich warunkow, oraz zerowac ja przy starcie.
    Przewidziec mozliwosc wylaczania "programowania" jezeli nie jest potrzebne (przypadkowe programowanie).
    Jezeli zdecydujesz umiescic zmienna T w eeprom, to musisz ta zmienna odczytac w subrutynie START, inaczej program przyjmie maxymalna zwymiarowana wartosc dla zmiennej 'T' lub ostatnio znana jej wartosc.

    Na koniec - jezeli ten frontowy czujnik to zwykly "momentary push ON/OFF sw", to nalezy przewidziec DEBOUNCE i odpowiednio skonfigurowac interrupt z ktorym on pracuje.

    e marcus
  • Poziom 19  
    Ooo, super,dzięki. Doczytam sobie jeszcze parę spraw i chwytam się za to. W razie jakichś problemów, odezwę się tutaj. Jeszcze raz wielkie dzięki, pozdrawiam.
  • Poziom 22  
    Witam

    Podepnę się do tematu.
    Pojawił mi się problem dotyczący zapisu do pamięci danej np. typu long lub single. Wykorzystuje pamięć AT24c04. Mam do zbudowania pewien sterownik, parametry ( nastawy) muszę mieć zapisane w zewn. pamięci, wszystko ładnie i pięknie by było gdyby nie fakt, że nastawy są zmiennoprzecinkowe, a nie stałe liczby.
    Myślałem żeby zapisać singla w 4 kolejnych komórkach pamięci np 1-4 czyli 4 bajty, ale nie wiem jak zrobić aby uzyskać ( rozbić liczbę na 4 bajty - no w sumie to ona jest przechowywana na tych 4 bajtach,ale jak ją poprawnie zapisać i później odczytać ).

    Aha jeszcze taka sprawa ze stronicowaniem tej pamięci - nie bardzo wiem o co chodzi, w datascheet jest napisane że ma 32 strony po 16bytes każda. Czytam Helpa do BASCOM-a i tam jest pokazany zapis i odczyt właśnie z 24c04 ale o stronach nic nie ma. Czy do zapisu i odczytu adresy lecą normalnie od 0-511 ?

    Z góry dziękuję za wszelką pomoc.

    -=pozdrawiam=-