logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zapis liczby int do pamieci eeprom wymnażanej z tablic [C]

Master Dragon 11 Gru 2009 11:21 2627 10
  • #1 7373727
    Master Dragon
    Poziom 12  
    Panowie mam taki problem mam tablice 6 znakową i z niej wymnażam licznik który później zapisuje do eeprom. Wygląda to tak.

    
    unsigned char licznik[6] = {0,0,0,0,0,0};
    
    void licznik(void)
    {
       unsigned long int stan=0;
       stan = ((licznik[0]*100000)+(licznik[1]*10000)....+licznik[5]);
       if(stan<=255)
       {
         eeprom_write(address,stan);
       }
       if(256 <= stan <= 65535 )
       {
         eeprom_write(address,stan);
         eeprom_write(address,stan>>8);
       }
       if(65536<=stan<=999999)
       {
          eeprom_write(address,stan);
          eeprom_write(address,stan>>8);     
          eeprom_write(address,stan>>16);
       }
       //byte 4 jest ignorowany nie potrzebny
    }
    


    i program się wysypuje i powoduje zły zapis jak to rozwiązać doszłem do tego że gdzieś jest błąd w tym co wylicza. Bo program przy liczbie z zakresu 2 przechodzi przez wszystkie pentle a program z zakresu 3 przechodzi tylko prez 3,2 petle zapisu.
  • #2 7373760
    tmf
    VIP Zasłużony dla elektroda
    stan jest typu unsigned int, czyli miesci liczby z zakresu <0,65535>. Sprawdzanie wiec czy jest wiekszy niz 65536 jest bez sensu, zreszta kompilator w tym miejscu wyrzuca ci zapewne ostrzezenie. Podobnie sprawdzanie warunku czy stan jest <-65535 jest bez sensu, bo zawsze ten warunek jest spelniony.
    BTW, jesli poszczegolne elementy tablicy moga byc liczbami w zakresie <0;255> to masz problem - najwiekszym typem jakim dysponuje AVR jest unsigned long, ktory jednak nie umozliwia zapisania maksymalnego mnozenia 6 elementow 8-bitowych. Mozesz przejsc na float ze wszystkimi tego konsekwencjami.
  • #3 7373823
    Master Dragon
    Poziom 12  
    ale przecież one po wyliczeniu są zapisywane do long int i powinny zmieści się w zakresie.
    A to jak by to rozwiązać żeby dało się to wyświetlić na wyświetlaczu i na dodatek żeby każdą cyfrę dało się ostawić np klawisz w góre dodaje o jeden klawisz w dół odejmuje o jeden a klawisze w bok przesuwają liczbę.

    A GDYBY TO ROZBIĆ NA DWA DZIAŁANIACH LUB ZROBIĆ STRUCTURE PO 2* UNSIGNED LONG INT.

    
    struct
    {
         unsigned long int byte0;
         unsigned long int byte1;
    }64bit;
    


    lub nawet złożyć go z czarów żeby łatwiej było zapisać
  • #4 7374255
    tmf
    VIP Zasłużony dla elektroda
    Ale co chcesz osiagnac?
    Po pierwsze wydaje mi sie, ze w oryginalnym poscie miales unsigned int a nie unsigned long int. Po drugie jesli sumujesz kolejne bajty tablicy mnozac je razy kolejne potegi liczby 10 to znaczy, ze na tych bajtach zapisujesz tylko liczby <0,9>? Inaczej nie ma to sensu. Jesli tak to long w zupelnosci wystarczy, tylko po co rozbijasz to na tablice, zamiast przechowywac jako liczbe? Druga sprawa to, ze w zaleznosci od wielkosci liczby zapisujesz tylko 1, 2 lub 3 bajty, jak przy odczycie bedziesz wiedzial jaka ta liczba byla?
  • #5 7374284
    Master Dragon
    Poziom 12  
    Tak zmieniłem bo zauważyłem że źle przepisałem z projektu jest long int

    Zacznę od początku mam licznik który chce ustawiać za pomocą klawiszy czyli w gorę w dół + - o jeden Prawo lewo przesuniecie którą cyfrę przestawiam i potem enter wprowadzenie.

    licznik ma 6 miejsc

    i z tego musi mi wyliczyć liczbę całkowitą dodatnią bo będzie ona informowała nawijarkę ile zwoi ma jeszcze nawinąć na uzwojenie(nawijarka w fazie testowej)licznik potem będzie jeszcze zwiększony i w późniejszym czasie będzie dodane zapamiętani ilości uzwojeń lub stałych które się często używa tak jak trafek 12v itp. i poto mi to potrzebne.

    Pomoże ktoś proszę!!!
  • #6 7374372
    tmf
    VIP Zasłużony dla elektroda
    Ale co ci nie dziala? Napisalem ci, ze niezaleznie jaka to liczba musisz zapisac cala zmienna long, a nie tylko pojedyncze bajty, bo nijak z tego potem nie wynika jaka to byla liczba. Tu masz tutorial jak sie poslugiwac EEPROMEM:
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38417
  • #7 7374421
    Master Dragon
    Poziom 12  
    Nie działa mi to mnożenie tam u góry bo zapis zrobiłem w ten sposób że rzutuje zmienną na czar potem przesuwam o 8 bitów i znów rzutuje przesuwam znów rzutuje. I tak to zapisuje i przy zapisie wyskakują dziwne licznik.

    A tak w ogóle dzięki za tutorial ale ja używam zewnętrzny eeprom bo wewnętrzny atmegi jest zarezerwowany na co innego.

    Post raportowany,
    proszę poprawić post,
    i nie stosować Caps Lock podczas pisania treści postu
    And!
  • #8 7374590
    piti___
    Poziom 23  
    Przykro mi to mówić ale z kodu na górze wynika że zapisujesz wszystko na pod jednym adresem... to nie ma prawa działać... Co do sensowności powyższego kodu nie będe się wypowiadał...
  • #9 7374693
    Master Dragon
    Poziom 12  
    dobra zapomniałem dopisać +1 i +2 bo w komórkach mi zapisuje w zależności od stanu liczby raz dobrze a raz coś rzeźbi. dalej nie dziła
  • Pomocny post
    #10 7375239
    Konto nie istnieje
    Konto nie istnieje  
  • #11 7375595
    Master Dragon
    Poziom 12  
    Z pracy pisałem a tam do programu kasowego musi być włączony capslock przepraszam.

    Chyba rozumiem o co chodzi ten pomysł z podziałem zasięgu zmiennej był kiepski fakt i tak w tych komórkach nic nie będzie można je zostawić jako zera.
REKLAMA