zapis zmiennej


Witam mam takie pytanko jak zapisać zmienną do pamięci mikrokontrolera której wartość mogę zmieniać za pomocą przycisku aby po wyłączeniu i włączeniu wartość zmiennej była taka jaka była ustawiona przed wyłączeniem zasilania?
Na przykład mam taki programik i czego tu brakuje?

...
dim A as byte
Do
Debounce Pinb.0 , 0 , Zw , Sub                           
Debounce Pinb.1 , 0 , Zm , Sub
Loop
 
Zw:
   Incr A
Return
Zm:
   A = A - 1
Return




Portret użytkownika matrix

Re: Zapis zmiennej

Brak zapisu zmiennej do pamięci eeprom.

Portret użytkownika mirley

RE; Zapis eeprom

Poszukaj w helpie poleceń writeeeprom i readeeprom jako argumenty podajesz zmienną i adres w pamięci pod który chcesz zapisać

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

re zapis

Czyli że zapis ma być umieszczony w podprogramie a odczyt przed pętlą główną czyli tak?

...
dim A as byte
Readeeprom A , 1
Do
Debounce Pinb.0 , 0 , Zw , Sub                           
Debounce Pinb.1 , 0 , Zm , Sub
Loop
 
Zw:
   Incr A
   Writeeeprom A , 1
Return
Zm:
   A = A - 1
   Writeeeprom A , 1

Czyli każda zmiana zmiennej A będzie powodować wykasowanie starej wartości i zapisanie nowej. Czyli oznacza to że zmienną A mogę zmienić około 100000 razy bo taka jest trwałość pamięci eeprom ATmega8.
Od jakiego adresu można zacząć adresowanie pamięci EEPROM?
Chodzi mi o to czy jakieś komendy automatycznie nie zapisują danych na kilku pierwszych bajtach pamięci EEPROM i bezpieczniej zaczynać zapisywanie swoich zmiennych od jakiegoś adresu?
W przypadku ATmega8 posiadam 512 B pamięci EEPROM czyli do jakiego adresu mogę maksymalnie zapisywać zmienne?

Portret użytkownika mirley

Re: EEprom

do eeprom żadna komenda nic nie zapisuje, możesz zacząć zapisywać od adresu 1, adres 0 jest niepewny bo może się wykasowac po zresetowaniu procka. Jeśli chcesz zapisywac ustawienia to ja np robie to tak że zapisuje dopiero po ustawieniu całości jeśli przez kilka sekund użytkownik nie klika po przyciskach. Zmniejsza to ilość niepotrzebnych zapisów

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

eeprom

O tym bym nie pomyślał żeby zrobić zapis po jakimś czasie. A mógł byś podać przykładową komendę zapisu, np że jeśli przycisk S1 nie zostanie naciśnięty przez czas 3 s to ma zostać wykonana instrukcja zapisu. Czy to się robi że np co 3 sekundy sprawdzana jest wartość zmiennej A i jeśli nie równa się ona tej z przed 3 s to wtedy zapisuje jej wartość do EEPROM?
W przypadku ATmega8 posiadam 512 B pamięci EEPROM czyli mogę zapisywać do adresu 511 lub szesnastkowo do 1FF?

Portret użytkownika mirley

Re: Zapis

Można sprawdzać czy zmienna się zmieniła i zapisać ją dopiero wtedy. Ja przeważnie robię licznik który liczy od pewnej wartości w dół. Jak dojdzie do 0 to następuje zapis i czeka do momentu aż zmienna licznikowa znowu nie zostanie ustawiona na jakąś wartość. Przyciskanie przycisków ustawia tą zmienna cały czas a jak przestanie się klikać po klawiaturze to wkońcu wartośc licznika spadnie do 0 i wartości się zapiszą. W efekcie zapis jest zrobiony dopiero po jakimś czasie od skończenia ustawiania parametrów

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

podprogram

Faktycznie wsadzenie licznika w pod program obsługujący dany przycisk jest chyba najlepszym rozwiązaniem. A zapisywać mogę do adresu 511?

Portret użytkownika mirley

Re: Zmienna

Tak

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

Dzięki

Jeszcze raz wielkie dzięki za szybką i fachową pomoc.

Portret użytkownika michal512

Kilka zmiennych

Witam a co jeśli bym miał kilka zmiennych i nie chciał bym zapisywać wszystkich tylko tę która została zmieniona

...
dim A as byte
On Timer0 5sekund
Enable Interrupts
Enable Timer0
Load Timer0 = 250
 
Do
Debounce Pinb.0 , 0 , Zw , Sub                           
Debounce Pinb.1 , 0 , Zm , Sub
Loop
 
Zw:
   Incr A
   Start Timer0 
Return
 
Zm:
   A = A - 1
   Start Timer0 
Return
 
5sekund:
   Load Timer0 , 250
   Incr 8ms
 
      If 8ms = 625 Then
         8ms = 0
         Stop Timer0
         Writeeeprom A , 1
      End If
Return
.
Przypuszczam że wystarczy w pod programie obsługi timer0 umieścić odpowiednie instrukcje If Then. Tylko jak sprawdzić czy wartość zmiennej np A po tych 5 s się zmieniła czy nie lub czy jest równa tej zapisanej w eeprom? Muszą być wprowadzone jakieś dodatkowe zmienne?

Portret użytkownika mirley

Re: Zmienne

Możesz odczytać wartość z pamięci, porównać i jeśli są różne to zapisać na jej miejsce nową wartość. Nie wiem jednak czy ma to sens, to wszystko zależy do czego to ma dokładnie finalnie służyć

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

re zapis

Dokładnie to chodzi o to że to ma być część większego programu i nie będzie zapisywana jedna zmienna a 8. Po co np po zmianie tylko jednej zmiennej o jakąś wartość miała by się reszta ponownie zapisywać jeśli była by taka sama.
Mam jeszcze pytanie do komendy 'Start Timer0' ona powoduje zliczanie od początku? Mam namyśli sytuacje gdy np. nacisnę przycisk podłączony do PB.0 to zmienna A się zwiększy i wystartuje się odliczanie 5s ale po 3s nacisnę przycisk podłączony do PB.1 to zapis nastąpi po 2s czy po 5s. Zliczanie czasu po kolejnej komendzie Start Timer0 będzie kontynuowane czy ruszy od nowa?

Portret użytkownika mirley

Re: Zmienna

No to zrób sprawdzanie tak jak pisałem wcześniej.

Co do timera to nie masz go zatrzymywać ani resetowac bo po co.... resetować masz wartość zmiennej, która sobie zrobisz. Masz np zmienną A typu byte i ona ma zwiększa swoją wartość co każde przerwanie timera. Naciśnięcie przycisku przypisuje A=0 a zapis następuje np dopiero jak zmienna A=100

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

re zmienna

Ale po zliczeniu A=100 to muszę zatrzymać timer?
Bo jeśli go nie zatrzymam to zmienna A będzie się zliczać dalej i przekroczy wartość 255.
A jakiego stanu uśpienia musiał bym użyć w przypadku gdy do zmiennej A zapisywał bym wartość temperatury z DSa i np co 30minut mikrokontroler miał by sprawdzać czy temperatura nie przekroczyła jakiejś określonej wartości i w zależności od tego wykonywał by odpowiednie instrukcje. Dodatkowo chciał bym móc go wybudzić za pomocą przycisku w celu odczytania bieżącej temperatury lub za pomocą RS-232 w celu wyświetlenia temperatury w komputerze.

Portret użytkownika mirley

Re: Zapis

Ja to robie w taki sposób że liczę np do 100 ale odliczanie idzie tylko wtedy gdy zmienna jest mniejsza niż 100 a gdy osiąga 100 to następuje zapis:

if A < 100 then
  incr A
  if A = 100 then
    'tutaj zapis
  end if
end if

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika michal512

tryby uśpienia

To chyba będzie najlepsze rozwiązanie.
A za pomocą których rozkazów można wprowadzić i wyprowadzić mikrokontroler w jeden z trybów uśpienia?

Portret użytkownika matrix

Re: tryby uśpienia

Jak podamy Ci rozwiązanie na tacy to niczego się nie nauczysz. Ja ze swej strony proponuję poczytać choćby polski help bascoma. Na przykład komendy:

Idle
Powerdown
Powersave

Portret użytkownika michal512

rozkazy

Ja to rozumiem tylko że, polski help w tej wersji co mam ma ponad 400 stron. Można go sobie dogłębnie analizować tylko że, wątpię żeby ktoś go całego rozkaz po rozkazie przerobił. Do nauki potrzebny jest konkretny przykład zastosowania i wtedy dopiero to wciąga i jak się nie wie co robi konkretna komenda to można a nawet trzeba zajrzeć do helpu. najbardziej interesowała by mnie instrukcja

Idle

W helpie piszą że, wybudzenie procesora następuje po zgłoszeniu przerwania np. z liczników i wejść przerywających.
Czyli że muszę odblokować przerwania i użyć rozkazu
on Interrupt

O transmisji szeregowej natomiast pisze że, działa cały czas. Pod pojęciem układ transmisji szeregowej ukrywają się interfejs RS232 oraz magistrala I2C, czy tylko jeden z nich?

Portret użytkownika matrix

Re: tryby uśpienia

W stanie bezczynności, jednostka centralna zostaje zatrzymana i nie wykonuje żadnych rozkazów. Działa jednak system przerwań, układ transmisji szeregowej i liczniki.
Wyprowadzenie procesora ze stanu bezczynności następuje po zgłoszeniu przerwania (np.: z układu Watchdog, liczników, wejść przerywających czy przetwornika A/D) lub na skutek wyzerowania procesora ? aktywny stan końcówki RESET.
 
(c) Zbigniew Gibek, 2002-2005   (c) MCS Electronics, 1999-2005

Czyli oznacza to ni mniej ni więcej jak to że najłatwiej wybudzić procka jakimś przerwaniem. A jakim to już wybierz sobie sam jakie Ci pasuje.