Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brisanje segmenta kod MSP430

[es] :: Elektronika :: Mikrokontroleri :: Brisanje segmenta kod MSP430

[ Pregleda: 2277 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Boris Mandic
Osijek

Član broj: 173895
Poruke: 5
*.cmu.carnet.hr.



Profil

icon Brisanje segmenta kod MSP43024.02.2008. u 14:37 - pre 196 meseci
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
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
84.119.31.*



+9 Profil

icon Re: Brisanje segmenta kod MSP43024.02.2008. u 21:54 - pre 196 meseci
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š?
 
Odgovor na temu

Boris Mandic
Osijek

Član broj: 173895
Poruke: 5
*.cmu.carnet.hr.



Profil

icon Re: Brisanje segmenta kod MSP43024.02.2008. u 22:48 - pre 196 meseci
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);
  }
}
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.static-fiber.styrion.net.



+9 Profil

icon Re: Brisanje segmenta kod MSP43025.02.2008. u 08:47 - pre 196 meseci
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
 
Odgovor na temu

Boris Mandic
Osijek

Član broj: 173895
Poruke: 5
*.cmu.carnet.hr.



Profil

icon Re: Brisanje segmenta kod MSP43025.02.2008. u 11:27 - pre 196 meseci
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
...}
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.static-fiber.styrion.net.



+9 Profil

icon Re: Brisanje segmenta kod MSP43025.02.2008. u 14:08 - pre 196 meseci
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
 
Odgovor na temu

Boris Mandic
Osijek

Član broj: 173895
Poruke: 5
*.cmu.carnet.hr.



Profil

icon Re: Brisanje segmenta kod MSP43028.02.2008. u 21:19 - pre 196 meseci
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š.
 
Odgovor na temu

branko_g
Merna tehnika i elektronika

Član broj: 159227
Poruke: 756
*.static-fiber.styrion.net.



+9 Profil

icon Re: Brisanje segmenta kod MSP43029.02.2008. u 08:29 - pre 196 meseci
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?
 
Odgovor na temu

Boris Mandic
Osijek

Član broj: 173895
Poruke: 5
*.cmu.carnet.hr.



Profil

icon Re: Brisanje segmenta kod MSP43029.02.2008. u 08:59 - pre 196 meseci
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!
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Brisanje segmenta kod MSP430

[ Pregleda: 2277 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.