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

zewn. pamięć eeprom 24Cxx - zapisanie zmiennej SINGLE - jak?

Madergames9 06 Mar 2008 15:29 2582 21
REKLAMA
  • #1 4879502
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Programuję w BASCOM AVR. Potrzebuję mieć zapisaną wartość zadanej temperatury do porównania z wartością otrzymaną z DS18B20. Nastawiam wartość operując bezpośrednio na zmiennej SINGLE, ale mam ją w pamięci programu, więc jak coś się wyłączy to już nie będzie działało tak jak trzeba. Muszę więc to gdzieś zapisać. Druga sprawa to jak zmieniać wartość dziesiątek po przecinku, bo jak robię INCR bezpośrednio na niej to zmienia mi się tylko wartość przed przecinkiem.... jak powinienem to zrobić..?
    Pozdrawiam
  • REKLAMA
  • #2 4879683
    nsvinc
    Poziom 35  
    Posty: 2870
    Pomógł: 262
    Ocena: 88
    Single ma 4 bajty jakiegos badziewia w sobie, więc:
    skompiluj program i dowiedz sie w okienku informacujnym pod jakim adresem jest pierwszy bajt, a potem czytasz te 4 bajty oddzielnie i juz masz zmienna rozbita na kawałki tak zeby je zapisać do eeproma. W bascomie są funkcje do odczytywania wartosci spod podanego adresu ram.
    Jak zmienić wartość dziesiątek po przecinku:
    zmienna = zmienna + 0.01

    Incr zawsze zwieksza o jedność
  • #3 4879764
    seba_x
    Poziom 31  
    Posty: 2071
    Pomógł: 29
    Ocena: 112
    poczytaj w helpie o "high" i "low"
  • REKLAMA
  • #4 4879774
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Wielkie dzięki kolego, druga część odpowiedzi jest jasna i klarowna. Ponieważ nie bardzo rozumiem pierwszą to o jakie okienko chodzi bo jakby co nigdy czegoś takiego nie szukałem...
    Pozdrawiam

    Kolego SEBA_X rozumię, że z wartości 21,7 wyciągnę HIGH = 21, a LOW = 7...?. Więc do porównania potrzebowałbym, albo poskładać ją w całość łącznie z przecinkiem ( z tym mam problem), lub tą odczytaną wartość z DS18B20 też rozłożyć na części. Wolałbym jednak, aby podczas startu programu załadować te klocki z pamięci poskładać je w całość i zapisać do zmiennych w programie tak, aby już tego więcej nie robić, a tylko móc je porównywać. Dałoby się to zrobić...? Ale jak...?
    Pozdrawiam
  • REKLAMA
  • #6 4880182
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Łopatologicznie i zrozumiale to napewno. Problem jest jednak w tym jak proces ten odrocić. Naprawdę przepraszam, że tak pytam, ale przyszedł czas na operacje właśnie takie na zmiennych, a najlepsa dla mnie pomoc to właśnie elektroda. Naprawdę nie wiem czy to po prostu trzeba dodać do siebie...?
    Pozdrawiam

    Ps. Zdobytej wiedzy nie trzymam tylko dla siebie, ale staram sie pomagać innym, bo w końcu taka jest chyba idea tego forum, a nie odsyłanie typu weź i sobie pogooogluj... :D
  • #7 4880837
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    nsvinc napisał:
    nie bardzo...High i low rozbija jedna czterobajtowa zmienne na dwa kawałki po dwa bajty (słowa)...

    Kompletna bzdura i to na resorach :|
    Skąd Ty wytrzasnąłeś takie rewelacje :?:
    Twój przykład , nadaje się tylko do działu Na wesoło HydePark
    Nie dziwię się , że krążą po forum dowcipy o Bascomowcach :(

    :arrow: Madergames9
    Zainteresuj się wskaźnikami na zmienną Word=Varptr i instrukcjami Byte=Inp(adres),Out adres,Byte.Za pomocą tych 3 magicznych instrukcji , możesz "pociąć" na bajty zmienną dowolnego typu i "wyeksportować/zaimportować" w/z dowolny obszar wszechświata :D
    Albo użyj sposobu z nadpisywaniem zmiennych - Dim ... Overlay.



    Piotrek
  • #8 4881004
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Wielkie dzięki Piotrek. Ubaw po same pachy, ale w końcu komuś trzeba wierzyć...?. Zainteresowałem się Twoimi sugestiami i mam pytanie. Zmienna typu SINGLE to 4 bajty, więc gdy wyłuskam adres tej zmiennej to spod tego adresu jak wyssać owe bajty..?. Druga sprawa to sprawdz mnie czy dobrze łapię, czyli:
    1. W programie ustawiam zmienną typu SINGLE do zadanej wartości.
    2. Znajduję jej adres, dzilę ją na bajty i zapisuję je w pamięci zewnętrznej, lub stałej XRAM procka (coby nie znikły podczas zaniku napięcia).
    3. Po załączeniu programu od nowa przepisuję te bajty z pamięci do programu bajt po bajcie więc od nowa składam je w całość w pamięci programu do ponownego wykorzystania..?

    Czy tak to ma wyglądać i wszystko to zrobię dzięki obyciu z 3 magicznymi instrukcjami..?

    Pozdrawiam

    Ps. Według Ciebie OVERLAY jest łatwiejsze..? tego też jeszcze nie robiłem :cry:
  • #9 4881073
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Madergames9 napisał:
    ...
    Czy tak to ma wyglądać i wszystko to zrobię dzięki obyciu z 3 magicznymi instrukcjami..?

    Pozdrawiam

    Ps. Według Ciebie OVERLAY jest łatwiejsze..? tego też jeszcze nie robiłem :cry:

    Przykładziki powinny wyjaśnić wszystko.
    
    Dim C As Single , D As Single
    
    Dim Cptr As Word , Dptr As Word
    
    Dim E As Byte , F As Byte 
    
    
    
    C = 12.555555555
    D = 0.0
    
    Print "C= " ; C ; "   D=" ; D
    'wysyłamy bajt po bajcie zmienną C do wew. eepromu lub do dowolnego układu/urządzenia
    Cptr = Varptr(c)
    For E = 1 To 4
       F = Inp(cptr)
       Writeeeprom F , E       'zastąpić procedurą zapisu bajtu do np. zew. eepromu
       Incr Cptr
    Next
    'wczytujemy bajt po bajcie do zmiennej D z wew. eepromu lub z dowolnego układu/urządzenia
    Dptr = Varptr(d)
    For E = 1 To 4
       Readeeprom F , E       'zastąpić procedurą odczytu bajtu z np. zew. eepromu
       Out Dptr , F
       Incr Dptr
    Next
    
    Print "C= " ; C ; "   D=" ; D ;
    
    Print
    nop
    Stop
    

    lub
    
    Dim C As Single , D As Single
    Dim Ct(4) As Byte At C Overlay , Dt(4) As Byte At D Overlay
    'Dim Cptr As Word , Dptr As Word
    
    Dim E As Byte , F As Byte
    
    
    
    C = 12.555555555
    D = 0.0
    Print "C= " ; C ; "   D=" ; D
    For E = 1 To 4
       F = Ct(e)
       Writeeeprom F , E
    Next
    
    
    For E = 1 To 4
       Readeeprom F , E
       Dt(e) = F
    Next
    Print "C= " ; C ; "   D=" ; D
    
    nop
    Stop
    
    

    Wybierz sobie :D
    Jeśli byś korzystał z wewnętrznego eepromu , to można bez tych kombinacji użyć przypisania.
    
    Dim C As Single , D As Eram Single
    '...
    D=C 'zapamiętaj C w EEprom
    C=D 'Odtwórz C z EEprom
    


    Piotrek
  • REKLAMA
  • #10 4881165
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Czuję się powalony na łopaty..... Piotrek ja nie wiedziałem, że do wewnętrznego eeprom-u można tak bezpośrednio zapisać zmienną SINGLE. Ciągle czytałem o konieczności rozbiórki, a nikt do tej pory takiej prostej rzeczy nie napisał.... Nawet w Pomocy BASCOM-a (tłumaczenie na polski) tego nie ma, ba nawet w książkach na temat AVR "tysz ni ma".... To jest najprostsze co mogłeś powiedzieć tak proste że ąz mi głupio...

    Pozdrawiam

    Ps. Tak, już dla ścisłości to skoro do tej pory nie używałem tej pamięci to czas to zrobić. A przy okazji to czy zmienną typu STRING też tak samo łatwo tam zapiszę...?

    Ijeszcze jedno podejście do tematu..
    Napisałem kod z uwzględnieniem Twoich uwag Piotrek tzn:
    Dim x As Eram Single
    Kod się skompilował i jest oki. Kosteczka Atmega32 się zaprogramowała, ale w zakładce "eeprom" Bascomowego programatora jest pusto tzn sa same FF. Czy to znaczy, że coś zrobiłem nie tak...?. Po drugie operacje zapisu i odczytu przeprowadza się tak samo jak na zmiennych programu?. Czyli nie trzeba podawać, żadnego adresu zapisu ani odczytu..?. I jeszcze jedno czy podczas ładowania od nowa programu po zaniku napięcia zmienne zapisane w eeprom-ie nie zostaną "nadpisane" tą samą ale "czystą" zmienną?
    Pozdrawiam po raz kolejny
  • #11 4881979
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Madergames9 napisał:
    ...Ps. Tak, już dla ścisłości to skoro do tej pory nie używałem tej pamięci to czas to zrobić. A przy okazji to czy zmienną typu STRING też tak samo łatwo tam zapiszę...?

    To działa ze zmienną dowolnego typu :D
    Madergames9 napisał:

    Ijeszcze jedno podejście do tematu..
    Napisałem kod z uwzględnieniem Twoich uwag Piotrek tzn:
    Dim x As Eram Single
    Kod się skompilował i jest oki. Kosteczka Atmega32 się zaprogramowała, ale w zakładce "eeprom" Bascomowego programatora jest pusto tzn sa same FF. Czy to znaczy, że coś zrobiłem nie tak...?.

    Tak ma być , bo dopiero działający program (X=C) spowoduje zapis do eepromu ;)
    Jak już tak bardzo chcemy , to możemy nadać jakąś wartość początkową zmiennej EEprom-owej :D
    Np.
    
    Dim Empty As Eram Byte At 0 ' zmienna , która zajmie nam "felerną" 1-szą komórkę w EEpromie - nigdy tej zmiennej nie używamy w kodzie.
    
    Dim X As Eram Single At 1
    Dim Y As Single
    
    Y=X
    Lcd Y ' i tu już Y bedzie = 1.0000543 , mimo że nigdzie w kodzie nie przypisaliśmy zmiennej X żadnej wartości
    
    $EEPROM
    Data &HFF - 1-sza komóra bez zmian 
    'Teraz wartość dla naszego X-a
    Data 1.0000543!   'zajmie 4 bajty , będzie "widoczna" w zakładce eeprom  i bedzie przypisana do zmiennej X 
    

    Aby to działało , to w procesie programowania proca, należy również zaprogramować EEprom ;)
    Madergames9 napisał:

    Po drugie operacje zapisu i odczytu przeprowadza się tak samo jak na zmiennych programu?. Czyli nie trzeba podawać, żadnego adresu zapisu ani odczytu..?.

    O wszystko zadba kompilator.Jeśli byś się jednak uparł , to możesz "poprosić" by zmienna była umieszczona pod konkretnym adresem. :D
    Np. Dim X As Eram Single At 5
    Madergames9 napisał:

    I jeszcze jedno czy podczas ładowania od nowa programu po zaniku napięcia zmienne zapisane w eeprom-ie nie zostaną "nadpisane" tą samą ale "czystą" zmienną?
    Pozdrawiam po raz kolejny

    Chyba chodzi Ci o restart programu po zaniku zasilania :?:
    To zależy co tam napiszesz w kodzie.

    I jeszcze jedno: zaprogramuj fusebit EESAVE (w Bascom dla M32 to bit G=0 ;Preserve EEprom when chip erase) , a wtedy nawet Chip Erase , nie wymaże danych z eepromu , a to oznacza że będziesz mógł zmieniać/modyfikować program we falshu , a eeprom pozostanie nietknięty.

    Kończę , bo sie rozgadałem :D

    Piotrek

    PS
    I nie zapominaj , że ilość zapisów do eepromu jest ograniczona.
  • #12 4882729
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Jak dobry uczeń stosuję zalecenia nauczyciela :D i póki co jest klapa... :cry:. Napiszę to tak :
    Problem 1.
    Mam napisany kod programu do obsługi zał/wył 4 urządzeń. Chodzi to dobrze, ale warunek zał lub wył jest prawdziwy dla kazdego kanału tylko jeden raz tzn gdy czas zaprogramowany = czasowi upływającemu. Ponieważ stan portu już jest zmieniony więc nie ma to żadnego problemu, ale gdy zniknie zasilanie to ustawienia się tracą do następnego dnia. Wymyśliłem, że zapiszę sobie te 4 ustawienia każdego urządzenia w eeprom. Zgodnie z Twoimi sugestiami Piotrek kawałki programu odpowiedzialne za to wyglądają tak:
    
    Dim Empty As Eram Byte At 0        ' Twoja sugestia :)
    Dim Ua As Eram Byte
    Dim Ub As Eram Byte
    Dim Uc As Eram Byte
    Dim Ud As Eram Byte
    
    Dim Value As Byte
    
    Main:                      'pętla glówna
    Zapis = 1                'wlączenie możliwosci dokonywania zapisu do zegara
    Cls
    
    Do
       X = Licznik + 1 : Call Read_eeprom(x , Value)
       If Minuty = Value Then
        X = Licznik + 2 : Call Read_eeprom(x , Value)
        If Godziny = Value Then
         X = Licznik + 3 : Call Read_eeprom(x , Value)
         If Dni = Value Or Value = 32 Then
            X = Licznik + 9 : Call Read_eeprom(x , Value)
           Call Wlacz_urzadzenie
          'End If
         End If
        End If
       End If
    
           X = Licznik + 5 : Call Read_eeprom(x , Value)
           If Minuty = Value Then
            X = Licznik + 6 : Call Read_eeprom(x , Value)
            If Godziny = Value Then
             X = Licznik + 9 : Call Read_eeprom(x , Value)
             Call Wylacz_urzadzenie
            End If
           End If
       Licznik = Licznik + 10
       If Licznik = 20 Then Licznik = 0
    Call Wlacz_urzadzenie2
    Loop
    End
    
    
    Sub Wlacz_urzadzenie2
     If Ua = 1 Then
      Reset U1
     End If
     If Ub = 1 Then
      Reset U2
     End If
     If Uc = 1 Then
      Reset U3
     End If
     If Ud = 1 Then
       Reset U4
     End If
    End Sub
    
    Sub Wlacz_urzadzenie
    If Value = 1 And Ua = 0 Then Reset U1 : Ua = 1
    If Value = 2 And Ub = 0 Then Reset U2 : Ub = 1
    If Value = 3 And Uc = 0 Then Reset U3 : Uc = 1
    If Value = 4 And Ud = 0 Then Reset U4 : Ud = 1
    End Sub
    
    Sub Wylacz_urzadzenie
    If Value = 1 And Ua = 1 Then Reset U1 : Ua = 0
    If Value = 2 And Ub = 1 Then Reset U2 : Ub = 0
    If Value = 3 And Uc = 1 Then Reset U3 : Uc = 0
    If Value = 4 And Ud = 1 Then Reset U4 : Ud = 0
    End If
    

    Pominąłem celowo niektóre fragmenty kodu, które dotyczą tego programu, aby nie zaśmiecać forum. Program ten beż dopisanych kawałków dotyczących eeprom działa prawidłowo, wię nie tutaj jest pies pogrzebany.
    I w tak skonstruowanym programie chyba powinno działać, bo jeżeli ustawię przed wejściem do pętli głównej np.
    Ua = 1
    Ub = 0
    to włączy mi się kanał U1 (Ua w eeprom-ie). Natomiast, gdy to usunę to po przejściu ustawionego czasu na zał w kanale U2 to załączają mi się wszystkie 4 i po restarcie procka nic się nie zmienia co sugeruje, że w eeprom-ie wszystkie 4 bajty są ustawione w stan wysoki.
    Uff ponieważ się trochę rozpisałem nad tym problemem drugi określę w poźniejszym poście :D
    Pozdrawiam
  • #13 4883088
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Madergames9 napisał:
    Jak dobry uczeń stosuję zalecenia nauczyciela :D i póki co jest klapa... :cry:.

    Jak dobry nauczyciel :D , pragnę zwrócić uwagę , że jesteś troszkę na bakier z Bascomem :|
    
    If Value = 1 And Ua = 0 Then Reset U1 : Ua = 1
    

    Taka konstrukcja warunku If powoduje , że instrukcja po dwukropku wykona sie zawsze , bez względu na to czy warunek If jest spełniony , czy też nie.Reasumując , wywołanie procedury Wlacz_urzadzenie() spowoduje , że zmienne Ua,Ub,Uc,Ud przyjmą wartość 1 , a w procedurze Wylacz_urzadzenie() - wprost przeciwnie Ua,Ub,Uc,Ud zostaną wyzerowane.
    Konkluzja - do poprawki :D

    Piotrek
  • #14 4884192
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Psia kucha jak ja to mowie zdrobniale..
    Zmieniłem na coś takiego....
    
    Sub Wlacz_urzadzenie
    If Value = 1 And Ua = 0 Then
     Reset U1
     Ua = 1
     Waitms 200
    End If
    If Value = 2 And Ub = 0 Then
     Reset U2
     Ub = 1
     Waitms 200
    End If
    If Value = 3 And Uc = 0 Then
     Reset U3
     Uc = 1
     Waitms 200
    End If
     If Value = 4 And Ud = 0 Then
      Reset U4
      Ud = 1
      Waitms 200
    End If
    End Sub
    

    .... i na to wogole nie zareagowal
    Zmienilem na coś takiego...
    Chociaż instrukcji CASE jeszcze nie stosowalem...
    
    Sub Wlacz_urzadzenie3
    Select Case Value
      Case 1 : U1 = 0
               Ua = 0
      Case 2 : Reset U2
               Ub = 0
      Case 3 : Reset U3
               Uc = 0
      Case 4 : Reset U4
               Ub = 0
    End Select
    End Sub
    

    ... i też martwy jest...Więc zbaraniałem. Piotrek dlaczego instrukcja we wcześniejszym poście w każdym rzędzie wykona się pomimo warunku...?. Tzn to po dwukropku...?. Jeżeli odcięcie tych końcówek powoduje prawidłowe wykonanie programu to co to zmienia...?. Pierwszy kod z tego postu to właściwie to samo i instrukcje umieszczone w dwóch linijkach po instrukcji Then muszą się wykonać tak samo podobno po instrukcji Case... więc o co chodzi.... bo wyłysieje......:cry:
    Pozdrawiam
  • #15 4884708
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Program nie zyska na jakości jeśli stosujesz liczby przecinkowe. Generalnie lepiej robić na całkowitych (szybki i zwarty kod) a tylko wprowadzenie i wyprowadzenie danych zrealizować na przecinkach.
  • #16 4884824
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Odnośnie zmiennych SINGLE to jestem do tego zmuszony. Temperaturę odczytu z DS-a otrzymuję właśnie jako ten typ zmiennej... rozbieranie jej na kawałki też trochę zajmuje. O ile ma się jeden taki termometr to sprawa łatwa, ale jeżeli chodzi o większą ilość to już problem... Skoro istnieje zapisywanie takich zmiennych bezpośrednio do eeprom-u procka to już nie ma żadnego problemu... Wydaje mi się, że pójście w kierunku skorzystania z bezpośredniego dostępu do Single zapisanej w eeprom daje możliwość przechowania nastaw termostatu podczas zaniku napięcia. O to mi właściwie chodzi. A ponieważ tego jeszcze nie robiłem to trzeba się nauczyć :D
    Pozdrawiam
  • #17 4886194
    lelekx
    Poziom 30  
    Posty: 1220
    Pomógł: 158
    Ocena: 90
    
    dim temp (4) as byte
    dim costam as single
    ...
    ' single -> byte
    
     lds r16,{costam}
     lds r17,{costam+1}
     lds r18,{costam+2}
     lds r19,{costam+3}
     sts {temp},r16
     sts {temp+1},r17
     sts {temp+2},r18
     sts {temp+3},r19
    
    
    ' byte->single
     lds r16,{temp}
     lds r17,{temp+1}
     lds r18,{temp+2}
     lds r19,{temp+3}
     sts {costam},r16
     sts {costam+1},r17
     sts {costam+2},r18
     sts {costam+3},r19
    
  • #18 4909794
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Właściwie to mój temat, ale przepraszam, że go trochę odpuściłem. Wracam więc do niego, bo nie chcę tworzyć nowego. Problem nie został rozwiązany, chociaż wyglądał tak prosto po podpowiedzi od Ciebie Piotrek... Otóż o ile pracuję na zmiennych programowych to jest wszystko oki, ale jak mówiłem, tracę pewne dane po zaniku napięcia. Natomiast, jeżeli zaczynam używać odwołania do eeprom-u wewnętrznego to program przestaje wykonywać sekwencje programu w których te odwołania tworzę. Prosty podprogram .
    
    Sub Wlacz_urzadzenie
    If Value = 1 And Ua = 1 Then
     Portb.0 = 0
    End If
    If Value = 2 And Ub = 1 Then
     Portb.1 = 0
    End If
    If Value = 3 And Uc = 1 Then
     Portb.2 = 0
    End If
    If Value = 4 And Ud = 1 Then
     Portb.3 = 0
    End If
    End Sub
    

    wykonuje się bez problemu i załącza właściwie urządzenia podpięte do odpowiednich pinów portu B. Jeżeli jednak dodam do tego przypisanie zmiennym w eeprom stanu tego portu w taki sposób:
    
    Sub Wlacz_urzadzenie
    If Value = 1 And Ua = 1 Then
     Portb.0 = 0
     Ua = 0
    End If
    If Value = 2 And Ub = 1 Then
     Portb.1 = 0
     Ub = 0
    End If
    If Value = 3 And Uc = 1 Then
     Portb.2 = 0
     Uc = 0
    End If
    If Value = 4 And Ud = 1 Then
     Portb.3 = 0
     Ud = 0
    End If
    End Sub
    

    to ten podprogram już się nie wykonuje. Dotyczy to tak samo zmiennej SINGLE uzytej w innym podprogramie, ale myślę, że jeden i drugi problem ma to samo źródło. Deklaruję zmienne w ERAM zgodnie z tym co napisałeś Piotrek czyli:
    
    Dim Empty As Eram Byte At 0
    Dim Tzap1 As Eram Single
    Dim Ua As Eram Byte
    Dim Ub As Eram Byte
    Dim Uc As Eram Byte
    Dim Ud As Eram Byte
    

    Czy to jest wszystko co powinienem zrobić.?. Czy powinienem jeszcze używać dyrektyw typu np $eeprom i $data ?. Czy wręcz odresować bezpośrednio tą pamięć zapis/odczyt?. A powinno być takie proste, ale nie jest, więc w czym problem..? Co mogę robić źle..? Utknąłem w tym punkcie i bardzo proszę o pomoc...
    Pozdrawiam
  • Pomocny post
    #19 4910490
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Madergames9 napisał:

    
    Dim Empty As Eram Byte At 0
    Dim Tzap1 As Eram Single
    Dim Ua As Eram Byte
    Dim Ub As Eram Byte
    Dim Uc As Eram Byte
    Dim Ud As Eram Byte
    

    Czy to jest wszystko co powinienem zrobić.?. Czy powinienem jeszcze używać dyrektyw typu np $eeprom i $data ?. Czy wręcz odresować bezpośrednio tą pamięć zapis/odczyt?. A powinno być takie proste, ale nie jest, więc w czym problem..? Co mogę robić źle..? Utknąłem w tym punkcie i bardzo proszę o pomoc...
    Pozdrawiam

    Po uruchomieniu programu napisanego w Bascom , zmienne - a właściwie cała pamięć RAM, są zerowane , a "czysta" pamięć eeprom , jest zapisana wartością 255(&HFF).Jeśli więc nie programujesz pamięci eeprom , to wszystkie zmienne typu byte zadeklarowane w eeprom , mają wartość 255.A skoro tak jest , to warunek If Value = 1 And Ua = 1 Then NIGDY nie będzie spełniony.Widzę(na razie ;) ) 2 wyjścia:
    1)Zadeklarować wartości początkowe dla zmiennych w eeprom (przykład podałem), lub zmienić warunek na If Value = 1 And Ua <> 0 Then.

    Piotrek
  • #20 4910543
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Dzięki za odpowiedź Piotrek. Sytuacja jest taka. Urządzonko pracuje sobie samo cały czas bez włączonego komputera, a tym bardziej Bascom-a. Więc jeżeli komputer wyłączę wieczorkiem a o 8 rano ma mi się załączyć kanał 1 to powinien to zrobić bo w końcu pracuje na czystym eprom-ie. Więc jak rozumiem zapis i odczyt powinien się odbywać normalnie bez problemów. Tylko jest jedna sprawa, dlaczego jeżeli używam podprogramu z zapisem do eeprom-u to nie wykonuje się również ustawienie stanu portu w stan niski...?. Jak wyremuję zapis Ua = 0 to nie wykonuje się również Portb.0 = 0 po funkcji Then. Jeszcze jedno zapiszę wstępne wartości do eeprom tak jak mówiłeś Piotrek i co dalej. Mam przestawić fusebit aby następne programowanie nie wymazało pamięci..?. A z pliku programu wykasować te linijki, które to zrobiły...?. Jak pożniej jest z zapisem i odczytem pamięci jak jest przestawiony fusebit "G"
    Pozdrawiam

    Dodano po 15 [minuty]:

    Środek nocy trochę się orzeźwiłem i chyba zrozumiałem to co napisałeś... zrobię zmiany tak jak napisales w sugesti drugiej.... za dnia napisze czy to pomogło i w jakimstopniu, ale jak zwykle chyba masz rację, gdzie ja miałem oczy, a o mózgu nie powiem... :D.
  • #21 4913135
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Witam.
    Wielkie dzięki Piotrek za podpowiedź. Wiem, że sugerowałeś mi to już wcześniej, ale jakoś nie ukierunkowałem się na to w taki sposób. Wygląda, że te zmienne są zapisywane do eeprom-u bo jak wyłączę i włączę to zapala mi się LED z kanału, który ma być załączony... Sprawdzę to jeszcze.... ale myślę, że jest oki... Jak tylko to sprawdzę do końca to poruszę drugi i właściwy problem tzn temat zmiennej SINGLE. Mam z tym również problem, ale odłożyłem go troszeczkę na bok, aby nie rozdrabniać się na dwa tematy...
    Pozdrawiam

    Dodano po 5 [godziny] 16 [minuty]:

    Teraz problem zmiennej SINGLE. Otóż mam w programie coś takiego:
    
    Dim Tzap1 As Eram Single
    Dim Tterm1 As Single
    
    Tterm1 = Tzap1
    
    Cls
    Napis = Fusing(tterm1 , "#.#")
    Lcd Napis
    Wait 3
    Cls
    
    Main: 'program główny
    . . . . . .  cos tam dalej . . . . 
    

    Chodzi w tym o to, że podczas startu programu zapisaną wartość SINGLE mam "przepisać" do zmiennej w programie i na niej pracować. Problem jest taki, że jak wyświetlam tą wartość początkową na LCD to otrzymuję wartość "-0.0" i na takiej zmiennej nic dalej nie mogę zrobić w programie chodzi mi chociażby o wykonanie funkcji Incr. Natomiast, jeżeli wyremuję część
    
    Tterm1 = Tzap1
    

    to po pierwsze na LCD mam "0.0" a wartość zmiennej Tterm1 można zmieniać w programie... O co w tym chodzi...?. Dlaczego występuje znak "-" podczas przepisywania zmiennej z eeprom do programu, natomiast normalnie w zmiennej jest wartość bez minusa...?
    Praca na zmiennej BYTE z eeprom jest prawidłowa...
    Pozdrawiam

    Dodano po 30 [minuty]:

    Jeszcze jedno... Jak zmiennej typu SINGLE mającej adres 40 w eeprom-ie wewnętrznym przypisać stałą wartość instrukcją DATA ..?
  • #22 4915124
    Madergames9
    Poziom 15  
    Posty: 212
    Pomógł: 4
    Ocena: 2
    Ten temat zamykam, bo chyba "umarł" samoistnie, a otwieram nowy jako ciąg dalszy tego samego...

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemu zapisu i odczytu zmiennej typu SINGLE (4 bajty) w zewnętrznej pamięci EEPROM 24Cxx oraz wewnętrznej pamięci EEPROM mikrokontrolera AVR programowanego w BASCOM AVR. Autor potrzebuje przechować wartość zadanej temperatury do porównania z odczytem z czujnika DS18B20, aby nie tracić jej po zaniku zasilania. Poruszono kwestie rozbicia zmiennej SINGLE na pojedyncze bajty za pomocą wskaźników (Varptr) i instrukcji Inp/Out, co umożliwia zapis i odczyt bajt po bajcie do EEPROM. Zaprezentowano przykładowy kod BASCOM pokazujący jak zapisać i odczytać zmienną SINGLE do/z EEPROM. Omówiono także użycie zmiennych typu Eram (EEPROM) w BASCOM, które pozwalają na deklarację zmiennych bezpośrednio w pamięci EEPROM z możliwością inicjalizacji wartości początkowych. Zwrócono uwagę, że po uruchomieniu programu pamięć RAM jest zerowana, a EEPROM zawiera wartości 0xFF, co wymaga inicjalizacji zmiennych EEPROM lub odpowiedniej obsługi warunków logicznych. Poruszono problem poprawnego zapisu i odczytu stanów urządzeń sterowanych portami mikrokontrolera oraz poprawnej składni instrukcji warunkowych w BASCOM. Wskazano, że operacje na liczbach zmiennoprzecinkowych są wolniejsze i często lepiej operować na liczbach całkowitych, konwertując dane tylko na wejściu i wyjściu. W dyskusji pojawiły się także fragmenty asemblerowego kodu do kopiowania bajtów zmiennej SINGLE. Ostatecznie autor potwierdził działanie zapisu i odczytu zmiennych EEPROM, ale problem z obsługą zmiennej SINGLE i jej konwersją pozostaje do dalszego rozwiązania.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA