Sida 1 av 1

S-Ram Atmel c kod problem

Postat: 23 maj 2007, 22:02:48
av Samot
Hej.

Törs påstå att jag kan assambler till avr ganska så bra. Men nu har jag bestämt mig till att gå över till C. Har sökt på nätet utan framgång vilket jag tycker är konstigt. Vad jag vill hitta är:

Skriv såhär för att läsa vad som finns på 0x60 i sramet och skriv såhär för att läsa vad som finns på 0x60.
Skamligt av google och inte ha det som första svar när man söker ;)

På svenska: Ange adress, läs till valfri variabel. Eller, ange address skriv till valfri variabel.

På C : ?????????

Postat: 23 maj 2007, 22:15:58
av sodjan
Utan att veta närmare vad du vill åstakomma, men varför
vill du läsa på en specifik adress ? Normalt så hanterar man ju allt
via just variabler, och då via *namnen*, inte deras adresser (OK,
kanske indirekt via pekare, men det är i alla fall symbolerna man
använder)...

Postat: 23 maj 2007, 22:19:03
av Mupp
Nja... Nu är jag nog inte helt med på vad du menar, men säg såhär:

Om det du vill komma åt är ett namngivet register så kan du använda registernamnet, tex:

Kod: Markera allt

TIMSK = 0x01;

if(TIMSK == 0x01)...
eller nåt annat lämpligt. Iaf med rätt include och med GCC, har inte testat andra C-kompilatorer men jag kan inte tänka mig annat än att det funkar.

Vill du istället ha en variabel, vilken som helst, men på en av dig angiven adress så är väl första tipset att låta bli. Det är kompilatorn som ska sköta det, det är sånt den gillar. Om du vill komma åt externa register på en avr med minnesbuss utåt så kan det ju vara enda chansen att göra så, men isf råder jag dig att titta hur det ser ut i IO-definitionerna i lämplig .h-fil, och skapa vettiga registernamn på samma sätt i en egen .h-fil, det blir under alla förhållanden snyggast.


Edit, så går det när man knappar sakta, det var alltså första inlägget jag syftade på i första meningen.

Postat: 23 maj 2007, 22:24:28
av Samot
Ok, tror just en pollet trillade ner. Kanske är en av fördelarna med c att man kan dekarera variablar på ett annat sätt än i asm.

Jag behöver inte spara på en specifik adress i sramet. Utan jag vill spara data på 10 efter varandra förljande positioner. Men då kanske det helt enkelt går att deklarera en array av ngt slag och sedan peka ut olika positioner i den och helt enkelt skita i var kompilatorn tycker att de ska sparas?

Postat: 23 maj 2007, 22:24:35
av henkebenke
Vill du läsa en specifik address behöver du en pekare.

Kod: Markera allt

data = *(0x60);

eller

pointer = 0x60;
data = *pointer;
Det borde funka.

Edit: Annars är lämpligt att använda en array. Absolut addressering har man egntligen bara nytta av om man har en extern addressbuss. Eller om man saknar registerdefinitioner.

Postat: 23 maj 2007, 22:52:40
av sodjan
Japp, i C (och precis som i *snygg* assemblerkod) är de faktiska
adresserna där kompilatorn (eller assemblern) väljer att lägga
"variabler" helt ointressanta...

Om man ändå är nyfiken brukar det finnas en MAP fil där
man kan se de fysiska adresserna...

Postat: 24 maj 2007, 07:49:24
av karlstedt
och

Kod: Markera allt

INT8 data = 23;
pointer = &data;
tilldelar adressen för data till en pekare. Vad den än må vara :)

Postat: 24 maj 2007, 09:08:30
av JJ
*((char*)0x60) = 42;

Postat: 25 maj 2007, 12:47:44
av Samot
Löst!

Gjorde en array helt enkelt, f*n C är ju fusk jämfört med assambler.

Tack för hjälpen

Postat: 25 maj 2007, 13:31:38
av JJ
Gott att du fixade det. C is the shit!

Och du, om elementen du vill ordna i din array egentligen har olika storlek så glöm inte att du har 'struct' också!

Har du boken "The C programming language" av Kernigham och Richie? (Oftast kallad K&R) Det är Veckans boktips!