Programeringsfråga!

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Programeringsfråga!

Inlägg av Draugur »

Hej! Sitter och programmerar i C och klurar på följande problem:

Jag har tre st olika vektorer i vilka jag sparar olika tider. Jag skapar en pekare som kan peka på dessa.

Kod: Markera allt

unsigned int code_one[200];
unsigned int code_two[200];
unsigned int code_three[200];
unsigned int *code_pointer_read;
Jag vill kunna lägga in värden (tider) i en vektor genom att lägga in värdet på den plats som pekaren pekar på. Nu skriver jag på följande sätt:

*(code_pointer_read + i) = time;

...för att lägga in värdet "time" på platsen i, men det verkar inte funka, för när jag försöker hämta värdet på följande sätt:

OCR1A=*(code_pointer_read +i);

...sätts inte OCR1A till någonting.


Mycket tacksam för svar!!
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Hur initierar du 'code_pointer_read'?
Vilken definition har 'OCR1A'?
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

code_pointer_read initierar jag som det står i början, dvs
unsigned int *code_pointer_read;

OCR1A är ett register som ska lagra tider, dvs siffror.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Du definierar(!) 'code_pointer_read' som en unsigned int pointer men det har INGET med initieringen att göra!

Initiering är t.ex. 'code_pointer_read = code_one;'

Och jag frågar igen: Vilken definition har 'OCR1A'? Om det är en häst, hund eller register är ganska likgiltigt, det är DEFINITIONEN som är viktig! int/char/short/long? signed/unsigned?
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

jaha... :roll:

Jag initierar den som:

code_pointer_read = code_one

OCR1A är ett readn befintligt register (sitter och programmerar i AVR Studio 4) så jag vet inte vilken definition den har... Den innehåller siffror från 0x00 upptill 0xFFFF.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Aha.... 2 bytes alltså, detta är oftast 'int' eller 'unsigned int'. Nra, då är det inte storleksproblemer. 'time' är såklart också en 'unsigned int' och det är Mega32 du programmerar kan jag tro.

Nåväl,har du koll på att 'i' inte skenar iväg? Är 'i' definierat som 'unsigned int'?

Sen bara ett syftningsfel: "sätts inte OCR1A till någonting". Jorå, NÅGOT sätts den till! Kanske inte rätt värde men NÅGOT är det.

Jag tror att felet ligger i '*(code_pointer_read + i) = time;'.
Jag hade gjort en dump efter att ha utförd detta kommando med kända värden och sedan sett att det blir rätt, omedelbart verkar det som om att 'i' eller 'code_pointer_read' har fel värde.

Kan du inte testa med "code_one" bara som en test?
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

det funkar inte ens när jag skriver OCR1A=code_one heller!?
Det jag menar med att OCR1A inte sätts till något är att registret förblir tomt, dvs 0x0000.

ATMega 16 är det jag sitter med...
i är definerat som unsigned int i
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Har du testat att sätta OCR1A till ett känd värde? "OCR1A = 1000;" t.ex.?
KAN man alls läsa ut värdet? En del register är"write-only".
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

ja det kan man göra! Det är nog inte det som är problemet. Det tycks som att jag inte lyckas läsa in i min vektor...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Ska det inte vara så här?

Kod: Markera allt

unsigned int code_one[200];
unsigned int *code_pointer_read = &code_one;
...eller behöver man inte köra adressoperator när det gäller en vektor?

Ett register (här dubbel-8bit-register OCR1A) kan inte vara tomt. Även om det bara håller värdet 0x0000 så är det också ett värde (initieringsvärdet för båda aktuella variablerna).

Edit: Jag rättar mig själv. För att få en pekare till första elementet, som vektordefinitionen är i sig själv kan man göra så här:

Kod: Markera allt

unsigned int code_one[200];
unsigned int *code_pointer_read = code_one;
(Precis som Icecap visade)
eller

Kod: Markera allt

unsigned int code_one[200];
unsigned int *code_pointer_read = &code_one[0];
Vilket är ekvivalent.
Senast redigerad av $tiff 22 mars 2007, 13:54:53, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Har du testat att köra:

Kod: Markera allt

code_pointer_read = code_one;
i = 0;
*(code_pointer_read + i) = 1000;
OCR1A = *(code_pointer_read + i);
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

Det har jag redan provat, men det ska tydligen inte vara någon skillnad på de två skrivsätten!
Användarvisningsbild
Icecap
Inlägg: 26648
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

$tiff: då code_one är en array är referensen en adress redan, hade det varit en icke-array ville & före vara rätt, man kan även ange '&code_one[0]'.

Men i tydlighetens namn bör man nog lägga till adress-tag'en '&'.
Draugur
Inlägg: 20
Blev medlem: 27 februari 2007, 17:05:20
Ort: Gbg

Inlägg av Draugur »

Har du testat att köra:


code:
--------------------------------------------------------------------------------

code_pointer_read = code_one;
i = 0;
*(code_pointer_read + i) = 1000;
OCR1A = *(code_pointer_read + i);
Det som händer då är att OCR1A får värdet 0x2828, dvs 10280 decimalt...
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Har du initierat värden i code_one? ANSI C nollställer inte elementen i arrayen åt dig...
Skriv svar