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

Przeróbka programu z Attiny26 na Attiny861A

darekwaw 14 Maj 2010 08:11 1518 12
REKLAMA
  • #1 8073546
    darekwaw
    Poziom 11  
    Witam

    Opierając się na projekcie poruszanym w temacjie poniżej
    [url=]https://www.elektroda.pl/rtvforum/topic779952.html[/url]
    chciałbym przerobić program na wersję dla procesorka Attiny861A.

    Powód - potrzebuję zapisać około 120 kart do pamięci a nie tylko 8.
    Nie za bardzo łąpię jeszcze zadasę programowania w asemblerze aletego chciałbym prosić o pomoc w przeróbce programu.

    Korzystając AVR Studio zmieniłem bibliotekę tn26def.inc na tn861Adef.inc i podczas kompliacji pokazały mi się następujące błędy:

    Zamek.asm(36): warning: Register r20 already defined by the .DEF directive
    Zamek.asm(45): error: Operand(s) out of range in 'ldi r16,0x25f'
    Zamek.asm(46): error: Undefined symbol: SP
    Zamek.asm(234): error: Undefined symbol: EEWE
    Zamek.asm(236): error: Undefined symbol: EEAR
    Zamek.asm(246): error: Undefined symbol: EEWE
    Zamek.asm(249): error: Undefined symbol: EEAR
    Zamek.asm(251): error: Undefined symbol: EEMWE
    Zamek.asm(252): error: Undefined symbol: EEWE

    Mogę proić Was o pomoc i przeróbce ?
  • REKLAMA
  • #2 8076656
    MacGyver 7
    Poziom 21  
    Twój problem dotyczy pamięci EEPROM. W ATTiny861 jest ona nieco inaczej zarządzana niż w Attiny26.
    Po pierwsze w 26 jest 128 bajtów EEPROM, czyli wystarczył jeden rejestr do jej zaadresowania, czyli EEAR. W tiny861 masz 512B więc potrzeba dwóch rejestrów adresowych EEARH (starszy bajt adresu) oraz EEARL (młodszy bajt adresu).
    Po drugie niektóre bity rejestrów sterujących inaczej się nazywają.
    Zamiast EEWE wpisz EEPE
    Zamiast EEMWE wpisz EEMPE.
    Gdzieś masz taki rozkaz ldi r16,0x25f , usuń to f na końcu.

    Kolejny problem wynika z większej ilości pamięci RAM, a właściwie ze wskaźnikiem stosu. Tutaj też zamiast jednego rejestru Sp masz dwa, SPH i SPL. na początku programu masz takie rozkazy:
    ldi		temp,RAMEND		;Init Stack Pointer
    out		SP,temp
    

    Zamień to na:
    ldi		temp, high(RAMEND)		;Inicjacja wskaźnika stosu
    out		SPH, temp
    ldi		temp, low(RAMEND)		
    out		SPL, temp
    


    Nie znam tego projektu ani kodu programu, być może trzeba będzie wprowadzić jakieś inne poprawki.
  • #3 8078368
    Nawigator
    Poziom 33  
    No i jest też nota migracyjna Atmela AVR535 gdzie jest to wszystko opisane co należy zmienić.

    N.
  • REKLAMA
  • #4 8078474
    darekwaw
    Poziom 11  
    Notę migracyjną znalazłem. Jak na razie to co jest w niej napisane nie jest dla mnie za bardzo zrozumiałe.

    Łatwiej przychodzi mi przysfajanie wiedzy przez przykłady pratyczne dlatego też pozwalam sobie Was pytać.

    Odpowiedź jaka jest wyżej to właśnie spora pomoc dla mnie. Zostaje mi jeszcze rozwiązanie problemu z rejestrem EEWE bo on także w nowej Attiny jest zapisany w postaci dwóch bitów H i L
  • #5 8078732
    MacGyver 7
    Poziom 21  
    Rejestrem EEWE? Nie myl takich rzeczy bo łatwo kogoś (albo nawet samego siebie) wprowadzasz w błąd. EEWE to bit z ATtiny26.

    Przypuszczam że chodzi ci o rejestry EEARH i EEARL. Jest to adres komórki którą chcesz zapisać lub odczytać w pamięci EEPROM. W przypadku ATtiny861, który ma 512 bajtów EEPROM starszy rejestr adresowy (czyli EEARH) będzie przyjmował wartość od zera do jeden i nie więcej! Młodszy zaś (EEARL) pełny zakres, czyli od 0 do 255. Aby zaadresować EEPROM należy wpisać takie rozkazy:
    
    ldi R16, high(300)
    out EEARH, R16 ; Zaadresuj starszy bajt adresu
    ldi R16, low(300)
    out EEARL, R16 ; Zaadresuj młodszy bajt adresu.
    
  • REKLAMA
  • #6 8079469
    darekwaw
    Poziom 11  
    Dziękuję za cenną uwagę.

    Wytłumaczyłeś to naprawdę świetnie.
    Teraz zaczyna się mi to układać w całość
  • #7 8085279
    darekwaw
    Poziom 11  
    Z tego co się już zorientowałem przerobienie tego projektu na wersję ATtiny861A nie ma za bardzo sensu. Czytnik zapisuje 16 bajtowe klucze do pamięci EEPROM a ta ma jej 512 bajtów.
    Czyli osnacza to, że mogę zapisać 512/16=32 karty - a to mało bo ma być ponad 120 kart.

    Może ktoś z Was ma już gotowy taki projekt na ATmega128 - tam widzę że EEPROM ma 4KB czyli mogę zapisać 256 kart i to by mnie zadawalało.
  • REKLAMA
  • #8 8086007
    MacGyver 7
    Poziom 21  
    Chcesz kupować Mega128 tylko po to żeby mieć 4kB EEPROM? Taniej ci wyjdzie zastosować zewnętrzną EEPROM, np 24C32, chyba że mas jakieś m128 na zbyciu :D
  • #9 8087118
    darekwaw
    Poziom 11  
    Czyli propnujesz połączyć Attiny861A razem z AT24C32 ?
  • #10 8087359
    GSM
    Poziom 25  
    Witam,

    dokładnie tak, potem tylko dodać do oryginalnego kodu funkcje zapisu/odczytu do zewnętrznej pamięci i wywołaniami takowych zastąpić dostęp do wewnętrznej pamięci.

    Pozdrawiam,
    GSM
  • #11 8088317
    darekwaw
    Poziom 11  
    Nota katalogowa tej pamięci niewielwe mi mówi.
    Czy mógłbyś mi przedstawić jakiś przykład współp;racy ATtiny z tą pamięcią ?
  • #12 8088585
    GSM
    Poziom 25  
    Jej nota katalogowa mówi bardzo dużo, możnaby powiedzieć, że wszystko co jest ci potrzebne.
    Nie wiem w końcu którego mikrokontrolera zamierzasz użyć, niektóre AVR'y mają sprzętowe wsparcie dla I2C (TWI) albo jak jak tiny26 pewnie hardware'owe elementy ułatwiające implementacja obsługi danej magistrali, można nawet zrobić to w pełni softwareowo, będzie trochę wolniej i tyle a w twojej aplikacji nie jest ważna paralelizacja komunikacji an magistrali i dalszego wykonywania się kodu.
    Napisz funkcje zapisu i odczytu bajtów na I2C zgodnie z tym co jest napisane w datasheet'cie pamięci, albo poszukaj gotowca (jest kilka na forum, a w całym internecie jeszcze więcej).
    Ewentualnie powiedz czego nie rozumiesz to postaramy się to objaśnić.

    Pozdrawiam,
    GSM
  • #13 8089024
    darekwaw
    Poziom 11  
    Podsumowując:

    Będę chciał stworzyć ten zamek z wykorzystaniem ATtiny26 i zgodnie z Twoją propozycją, pamięcią zewnętrzną AT24C32.

    Proponujesz aby komunikację oprzeć na I2C. Jako, że dopiero zaczynam proszę o wyrozumiałość i pomoc.
    Chciałbym wszystko napisać w assemblerze (jakoś łatwiej mi zrozumieć ten język).
    Jeśli miałbyś jakieś przykłady lub linki bardzo bym prosił o przesłanie. Oczywiście sam także będę szperał.

    Dziękuję za dotychczasowe wskazówki.
REKLAMA