Sida 1 av 4
Microchip xc8, strängar
Postat: 15 oktober 2013, 16:46:45
av BJ
Jag använder Microchip xc8.
Jag har en sträng som ska göras om till ett tal
i en funktion. 8 bitar. Ett tecken för varje bit.
Jag har tittat i bruksanvisningen men inte hittat svaret.
Hur deklarerar jag strängen?
char *s = "00000000";
eller
char s[] = "00000000";
Strängen ska inte vara en konstant,
utan jag vill kunna ändra innehållet i den.
Det här klagar inte kompilatorn på i alla fall:
if (s[0] == '1') tal = tal + 128;
Hur gör jag för att lägga in en sträng med 8 tecken
i strängen s? Är det strcpy man måste använda?
Och hur fungerar det i xc8 i så fall?
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 17:03:28
av victor_passe
Båda två ska väl funka.
Det är inte c++ detta och det finns ingen direkt stränghantering så du kan inte senare i koden skriva:
str="olle";
eller
if(str=="kalle")
Du använder som du just skrev strcpy och liknande.
strcpy(str,"pelle");
Du ska även tänka på minnes användning, tex:
Kod: Markera allt
char str[]="kalle";
strcpy(str,"random long string");
Kan få stora konsekvenser då du skriver över det allokerade utrymmet för "strängen"
Då får du läsa på om malloc och free.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 19:22:25
av BJ
Ja, jag märkte att det inte gick att skriva bara =.
Tack. Det verkar fungera.
Kompilatorn klagar inte längre i alla fall.
Överskrivning hoppas jag slippa genom att det alltid
är 8 tecken i strängen.
Men vad betyder
Omniscient Code Generation not available in Free mode
Jag får det till allvetande? Vad menas med det?
Jag vet att det är en gratis version med mindre optimering.
Tillägg:
Nu när hela projektet fungerade så kom det mer text.
Det verkar vara optimeringen det gäller.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 19:43:11
av Icecap
För att deklarera platsen för strängen duger:
char The_String[8];
utmärkt.
Sedan att omvandla det:
Kod: Markera allt
int Ctr;
unsigned char Result;
for(Ctr = 0: Ctr < 8; Ctr++)
{
if(The_String[Ctr] > '0') Result |= 0x01;
Result <<= 1;
}
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 20:14:37
av BJ
Just det, så kan man göra.
Tack för tipsen.
Det blir ganska stora program utan optimering.
Men det är ju gratis.

Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 20:16:26
av TomasL
Tillägg:
Nu när hela projektet fungerade så kom det mer text.
Det verkar vara optimeringen det gäller.
Vad menar du?
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 20:19:19
av BJ
Jag menar att det verkar vara optimeringen som
"Omniscient code generation" gäller.
Med det påslaget kan man få program som är 60 % mindre
och 400 % snabbare än med gratis-versionen.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 20:48:56
av TomasL
Öh, det där skall du inte lita på, dessutom går det inte att debugga sådan kod.
Det är bara viss typ av kod som vinner på det, inte all.
Och som sagt, det går inte att debugga den.
Har du hastighetsproblem eller problem med minnesutrymme, har du valt fel processor.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 20:52:08
av BJ
Ok... Det kan vara värt att tänka på.
Det står något om att optimeringen inte ska påverka avlusning.
Jag har inte tittat mer på det.
Var hittar man någon include-fil med alla register-namn i?
xc.h, och p18f4550.h, som tydligen ska bytas till xc.h
enligt sidan 25 i bruksanvisningen, hänvisar till htc.h.
I htc.h finns ingen del för Microchip xc8, vad jag kan se.
Så var hittar man registren?
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 21:18:18
av TomasL
I htc.h finns ingen del för Microchip xc8, vad jag kan se.
Öh, vad menar du?
XC8==HTC, de har i princip bara bytt namn på kompilatorn.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 21:20:46
av BJ
Jaha. Det visste jag inte.
I filen htc.h inkluderas andra h-filer beroende på vad man
använder för kompilator, och jag hittar inte rätt där
så att jag kan komma vidare till en h-fil med register-namn i.
Vad jag kan se så är det htc.h som man ska inkludera.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 21:26:49
av TomasL
Registernamnen och dess bitar heter samma sak som i databladet.
Till exempel:
Det är lite småstökigt att hitta rätt fil annars, de tenderar att heta
processor.inc, i alla fall gjorde de det innan.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 21:50:46
av BJ
Okej.
Tack.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 23:39:26
av BJ
Frågor om klockan.
Här är en bild som visar klock-delen i 18 F 4550:
http://www.mikroe.com/forum/viewtopic.php?t=10646
I inlägg 3 här finns valen för klockan (inställnings-bitar):
http://www.edaboard.com/thread129167.html
Om jag vill köra klockan på den inbyggda 8 MHz-oscillatorn
och vill använda RA 6 som vanlig utgång, och inte använda usb,
kan jag välja vilken som helst då av
Kod: Markera allt
FOSC = INTOSCIO_EC Internal oscillator, port function on RA6, EC used by USB
FOSC = INTOSC_XT Internal oscillator, XT used by USB
FOSC = INTOSC_HS Internal oscillator, HS used by USB
Spelar det någon roll vad jag väljer?
Kommer usb-enheten att reagera på något sätt,
eller kommer den att vara avstängd och/eller sova?
Jag tänkte inte koppla någonting till OSC1.
Registren (OSCCON o.s.v.) tror jag att jag vet hur man använder.
Re: Microchip xc8, strängar
Postat: 15 oktober 2013, 23:50:29
av TomasL
Gissar att du använder MPLABX, där finns ett verktyg som genererar koden du skall klippa och klistra in i din egen kod.
Det är detta du skall använda, de övriga använder kristallen, dvs dina portar till USB
CONFIG FOSC = INTOSCIO_EC ; Internal oscillator, port function on RA6
Dock gäller koden ovan för MPASM,
INTE för XC8
Du skapar din konfiguration i verktyget, kopierar koden verktyget ger dig, och klistrar in det i din kod, till exempel main.h eller nått.