Sida 1 av 2
Programeringsfråga!
Postat: 22 mars 2007, 12:38:28
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!!
Postat: 22 mars 2007, 12:47:12
av Icecap
Hur initierar du 'code_pointer_read'?
Vilken definition har 'OCR1A'?
Postat: 22 mars 2007, 12:49:10
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.
Postat: 22 mars 2007, 12:53:45
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?
Postat: 22 mars 2007, 12:59:22
av Draugur
jaha...
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.
Postat: 22 mars 2007, 13:12:06
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?
Postat: 22 mars 2007, 13:29:52
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
Postat: 22 mars 2007, 13:46:33
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".
Postat: 22 mars 2007, 13:47:33
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...
Postat: 22 mars 2007, 13:49:05
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.
Postat: 22 mars 2007, 13:50:21
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);
Postat: 22 mars 2007, 13:50:23
av Draugur
Det har jag redan provat, men det ska tydligen inte vara någon skillnad på de två skrivsätten!
Postat: 22 mars 2007, 13:52:42
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 '&'.
Postat: 22 mars 2007, 13:56:39
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...
Postat: 22 mars 2007, 14:02:09
av $tiff
Har du initierat värden i code_one? ANSI C nollställer inte elementen i arrayen åt dig...