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

Jak umieścić napisy w pamięci flash na ATmega8/128 w C/Assemblerze?

helios 07 Wrz 2006 00:42 4522 5
REKLAMA
  • #1 2995114
    helios
    Poziom 12  
    Posty: 147
    Ocena: 16
    Jak w C albo Assemblerze [AVR Studio] zrobić, żeby we flashu znajdowaly się zmienne z zapisem np. napisów do LCD.
    Chodzi o to, że mam dużo napisów, informacji, ale potrzebuję też trochę RAM do obliczeń. Standardowe deklaracje umieszczają mi zmienne w pamięci SRAM, a chciałbym żeby "głupie" napisy znajdowały się we flash i stamtąd były pobierane w odpowiedniej chwili a SRAM służył jako pamięć do obliczej... to możliwe? jesli tak to jak? :P

    Procesor to ATmega8 lub ATmega 128
  • REKLAMA
  • Pomocny post
    #2 2995229
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    W asemblerze wstawiasz :
    
    etykieta:
    .db "Jakis napis",0x0a,0x0d,13,12,0
    .db "dalsza czesc tego samego napisu"
    itd.
    

    a wyciagasz z flasha:
    
    ldi zh,HIGH(etykieta<<1)
    ldi zl,LOW(etykieta<<1)
    lpm acc,z (lub z+)
    


    Ten napis w "" zostanie przekonwertowany na znaki ASCII. Jesli kody twoich liter nie sa zgodne z ascii to musisz zapodawac liczbami, tak jak pokazane. Liczba bajtow w kazdym ciagu znakow powinna byc parzysta.

    Dobrze sobie zakonczyc zerem taki lancuch, zeby wiedziec gdzie sie konczy.

    Pozdrawiam
    Boogie
  • REKLAMA
  • Pomocny post
    #3 2995384
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    lbugiera napisał:
    (...)
    .db "Jakis napis",0x0a,0x0d,13,12,0
    lpm acc,z (lub z+)

    A co to za potworki? Znak końca linii (i do tego windowsowy :/) też nie jest potrzebny, wystarczy samo zero, chyba że urządzenie komunikuje się z windowsowym terminalem tekstowym przez rs-232.
    I skąd się wziął akumulator w AVR?

    W C robisz tak (avr-gcc):

    #include <avr/pgmspace.h>
    #include <string.h>
    #include <stdio.h>
    


    I na przykład tak:
    puts_P(PSTR("Jakis tekst")); /* żeby używać funkcji z stdio trzeba najpierw zainicjować strumienie I/O i napisać odpowiednie funkcje */
    /* mozna tak: */
    static const PROGMEM unsigned char tablica[] = {
    	0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
    	0x10, 0x11, 0x12, 0x13, 0x14, 0x15
    	};
    wartość = pgm_read_byte_near(tablica + pozycja)
    

    Jeżeli chcesz odczytywać po jednym bajcie i wysyłać to na LCD za pomocą własnej procedury, to właśnie do tego jest funkcja pgm_read_byte_near() w procesie kompilacji zamieniana jest na pojedyncza instrukcję LPM.
    Zresztą przechowywanie danych (ze szczególnym akcentem na łańcuchy) w pamięci programu jest opisane w manualu do avr-libc.
  • REKLAMA
  • #4 2995854
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    shg napisał:
    lbugiera napisał:
    (...)
    .db "Jakis napis",0x0a,0x0d,13,12,0
    lpm acc,z (lub z+)

    A co to za potworki? Znak końca linii (i do tego windowsowy :/) też nie jest potrzebny, wystarczy samo zero, chyba że urządzenie komunikuje się z windowsowym terminalem tekstowym przez rs-232.
    I skąd się wziął akumulator w AVR?


    To byl przyklad jak mozna wstawic pojedyncze bajty o roznych wartosciach, a ze akurat 0x0d i 0x0a przyszlo mi na mysl ... co za roznica. Zaden znak nie jest konieczny, rownie dobrze mozemy sobie ustalic, ze znakiem konca lancucha bedzie 0xFF (przynajmniej w asemblerze)
    A akumulator ... to byl "skrót myślowy" :) ... ostatnio popularny.
    Brakuje czegos takiego



    Pozdrawiam
    Boogie
  • REKLAMA
  • #5 2996237
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    lbugiera napisał:
    (...) rownie dobrze mozemy sobie ustalic, ze znakiem konca lancucha bedzie 0xFF (przynajmniej w asemblerze)


    Ano. Przydaje się szczególnie przy LCD, gdy wykorzystuje się znaki definiowane przez użytkownika (kody od 0 do 7).
  • #6 3001228
    helios
    Poziom 12  
    Posty: 147
    Ocena: 16
    dzięki za pomoc :)
REKLAMA