[ Boris Mandic @ 24.02.2008. 14:37 ] @
Kao što se vidi iz naslova prblem je u brisanju segmenta flash memorije kod MSP430F149, odnosno ja sam početnik u ovome a trebao bih staviti neki program na mikrokontroler te nakon toga omogućiti mjenjanje određenih varijabli ali samo mjenjanjem jednog segmenta. Možda je bitno jos i reći da koristim MSP-FET430P140 programer.
Ono što ja pokušavam napraviti je da napisem neki kod najjednostavniji u C-u ali da varijable koje želim kasnije mjenjati stavim u poseban segment(možda tako da ih spremim na adresu gdje počinje prazan segment ali to mi nikako ne uspjeva) tako da ga mogu kasnije mjenjati.

Bio bi vam zahvalan da mi pomognete bilo kakvim savjetom, jer nisam ni siguran dali se to moze napraviti na način na koji sam gore opisao. Hvala
[ branko_g @ 24.02.2008. 21:54 ] @
Za te stvari je kod MSP430F149 predviđen tzv. Informations Memory, deo Flash-a
koji počinje na adresi 0100h i zauzima 256 bajta, do 010FF.
Pogledaj uostalom u datasheet strana 15.
Kako se taj segment koristi pogledaj na www.ti.com, pod Appnote.
Koje programsko okruženje i koji programskom jezik koristiš?
[ Boris Mandic @ 24.02.2008. 22:48 ] @
Ma ja sam ti stvarno početnik oko tih stvari, a ovo sam dobio na fakultetu kao neki seminar i već nekoliko dana se mučim ali nisam uspio ništa napravit. Sve što sam našao na Texas Instruments stranici i dalje na netu sam pročitao ali nisam uspio ništa napravit.
Uspio sam pokrenuti programčić koji pali i gasi LED diodu npr. 5 puta, i sada sam ja mislio ako bih mogao izmjeniti na neki način samo vrijednost varijable koja kaže koliko puta će trepnuti dioda(to bi meni bilo dovoljno da pokažem na primjeru kako se može mjenjati samo segment koda).

Branko vidim da se ti kužiš u te stvari pa evo stavit ću primjer pa ako imaš neki prijedlog gdje spremiti varijablu "k" i na koji način da ju mogu kasnije zamjeniti, puno bi mi pomogao. Unaprijed zahvaljujem!

Code:
#include  <msp430x14x.h>

void main(void)
{
  int k=10;
           
  WDTCTL = WDTPW + WDTHOLD;    // Stop watchdog timer
  P1DIR |= 0x01;        // Set P1.0 to output direction

  for (int j=0; j<=k; j++)
  {
    volatile unsigned int i;
    P1OUT ^= 0x01;  // Toggle P1.0 using exclusive-OR
    i = 50000;     // Delay
    do (i--);
    while (i != 0);
  }
}
[ branko_g @ 25.02.2008. 08:47 ] @
U principu bi trebalo da jedna MAIN funkcija ovako izgleda:

Code:

void main(void)
 {
  inicijalizacija();  // samo ime kaže šta ova funkcija radi
   while(1) // ! Vrlo važno, beskonačna petlja
   {
    radi_nesto();
    radi_nesto_drugo();
    ....
   }kraj beskonačne petlje
} // !Main ne sme da se napusti !


Znači posle inicijalizacije dolazi ta beskonačna petlja.
To je tvoj najjednostavniji operativni sistem i drži program u jednom kontrolisanom stanju.
Bez nje program counter ide dalje napučta MAIN funkciju i pre ili kasnije dolazi do pada sistema
jed je dalje sve nedefinisano, nema programa.

Ako si to uradio ona možeš da tvoju funkciju za upravljanje LED diodama spakuješ u
na primer:
toggle_led() // funkcija "radi_nešto()"

a sa dva tastera spojena na neka druga dva pina možeš da tu
konstantu "k" povečavaš ili smanjuješ:
up_down()
{
if(P1IN | 0x02) k++; // Taster UP je na portu P1.1
if(P1IN | 0x04) k--; // Taster DOWN je na portu P1.2
}

Nezaboravi da između pinova za taster staviš PULL DOWN otpornike
od recimo 100k. U tom slučaju je taster spojen između pina i VCC.

Pozdrav Branko
[ Boris Mandic @ 25.02.2008. 11:27 ] @
Branko hvala puno! Isprobao sam na ovaj način kako si mi rekao i sad mi je sve puno jasnije, nisam još spoio tastere ali kužim sta si mislio.

Samo da te još pitam za slučaj ako želim upotrebiti brisanje i pisanje, koliko sam skužio to bi trebao staviti u jednu funkciju npr. "erase()" i to isto smjestiti u beskonačnu petlju i kad budem htjeo samo pozovem funkciju "erase()"
npr.
Code:

erase(){
Flash_ptrB = (char *) 0x1080; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrB = 0; //Dummy write to erase Flash segment B
FCTL3 = FWKEY + LOCK; // Reset LOCK bit
...}
[ branko_g @ 25.02.2008. 14:08 ] @
Ja do sada nisam imao potrebe da neke promenjlive na taj način osuguram,
i zbog toga ti ne mogu reći da li je to 100% tačno, ali u principu
se treba držati primera koje postoje u TI tehničkoj dokumentaciji:
http://focus.ti.com/lit/ug/slau049f/slau049f.pdf

Branko
[ Boris Mandic @ 28.02.2008. 21:19 ] @
Pozdrav, Branko puno si mi već pomogao i oprosti ako sam dosadan ali zapeo sam na jednoj gluposti i nemogu nigdje naći odgovor, pregledao sam svu moguću dokumentaciju i nemogu naći (možda krivo tražim) kako se definiraju pinovi.
Npr.( P1DIR |= 0x01; // Set P1.0 to output direction) , našao sam da je 1="output", pa predpostavljam da je zato iza x dolazi "01", dali to znači da kada bi htio da mi P1.1 bude ulaz da bi stavio (P1DIR |= 1x00)? Odnosno za P1.Y -> P1DIR |= Yx00.
To je pitanje vezano za definiranje smjera pina, ali nije mi ni jasno kako si došao do onog izraza što si mi poslao:
if(P1IN | 0x02) k++; // Taster UP je na portu P1.1
if(P1IN | 0x04) k--; // Taster DOWN je na portu P1.2

zašto 0x02 i 0x04??? Ako možeš molim te da mi objasnjš.
[ branko_g @ 29.02.2008. 08:29 ] @
Prvo moram da ti se izvinim, brzopleto sam otipkao.
Ispitivanje stanja pina mora ići kao:
Code:

if(P1IN & 0x02) k++;
if(P1IN & 0x04) k--;
...

Borise moraš se podhitno pozabaviti osnovama programiranja.
Nađi neku knjigu ili neštio na netu o programiranju na jeziku C.
To su osnove, kako se jedan broj piše u različitim notacijama.
Nas primer broj 33(decimalno) sa dodelivanjem nekoj promenjivoj:
Code:

unsigned char broj 
broj=33 ; // Decimalna notacija, broj ima 3 desetice i 1 jedinicu.
broj=0x21 ; // heksadecimalna notacija, ono 0x na početku označava da se radi o heksadecimalnom broju!
// Broj ima dve šesnajstice(zato hexa) i jednu jedinucu -> 33.
broj =0o41 ;// Oktalna notacija, broj ima 4 osmice(zato oktal) i jednu jedinicu.
broj=0b00100001; // Binarna notacija, broj ima jedan bit koji ima težinu 32 i jedan bit sa težinom 1.
//Ova poslednja notacija ne pripada C standardu, ali je neki kompajleri ipak podržavaju(npr AVRGCC).
// Koristi se u Assembleru.


Sad nešto o direkcionom registru.
Direkcioni registar je kod msp430 širok 8 bita.
Ako je njegova vrednost recimo P1DIR=0x00 onda su svi pinovi defini kao ulaz.
Ako je pak P1DIR=0xFF onda su svi pinovi definisani kao izlaz.
Ako se napiše P1DIR|=0x01 onda je to skraceni način pisanja ovoga: P1DIR=P1DIR | 0x01.
To je uobičajni način da se korišćenjem tzv maske i logičke operacije manipuliše
jedan jedini bit. Primeri:
Code:

P1DIR|=0x01; // Postavi bit 0 na 1, stanje ostalih pinova ostaje nepromenjeno jer su oni "maskirani"
//recimo
P1DIR,00101000 // Pre manipulacije
MASK,00000001 // Maska(0x01)
P1DIR,00101001 // Posle manipulacije sa ILI logičkom funkcijom
...
P1OUT&=~0x08; // Postavi bit 3(koji ima težinu 8) na "0" korišćenjem maske i logičke I funkcije.
P1OUT,01101110 // Pre manipulacije
MASKA,11110110 // Maska je operatorom"~" invertovana
P1OUT,01110110 // Posle manipulacije sa I logičkom funkcijom.
...
ispitivanje stanja jednog pina:
if(P1IN & 0x02) // vraća stanje različito od nule(znači true) ako je pin 1 na logičkom "1". 
P1IN,00010011 
MSK,00000010 // Maska 0x02
VAR,00000010 // Ako je pin1 na jedinici
ili
P1IN,00010001
MSK,00000010 // Maska 0x02
VAR,00000000 // Ako je pin1 na nuli


Malo jasnije?
[ Boris Mandic @ 29.02.2008. 08:59 ] @
Da, sad mi je puno jasnije.
A sto se tiče osnova to si u pravu, jer ja jesam nešto programirao do sada, dobro to je bilo u Javi ali nikad nisam koristio ove fore sa pisanjem broja u različitim notacijama, ali sad kad si mi jos objasnio da se radi o direkcioni registar koji je kod msp430 širok 8 bita, sad sve kužim.
Ja sam se malo zaletio, uzeo sam mikrokontroler u ruke i počeo programirati a nikad prije se nisam susretao sa programiranjem na tako niskoj razini.
Stvarno si me spasio, da si malo bliže častio bi te večerom ili slično... Ali ako budeš prolazio tu negdje pored Osijeka slobodno se javi. Havala care!