Sida 2 av 2
Postat: 24 september 2008, 14:40:33
av H.O
OK, det första exemplet med strängvariabler i en struct blir knivigt så här p rak arm, det erkänner jag... men om jag förstår det andra exemplet (vilkat jag antagligen INTE gjort...) så kanske det kan se ut nått sån här:
Kod: Markera allt
ErrorFlags VAR WORD 'Ett 16bitars ord
Ashscrape VAR ErrorFlags.0 'Bit0
Starter VAR ErrorFlags.1 'Bit1
External VAR ErrorFlags.2 'Bit2
Not_Cold VAR ErrorFlags.3 'Bit3
Overheat VAR ErrorFlags.4
F_Physical VAR ErrorFlags.5
Wrong_Stop VAR ErrorFlags.6
Thermostat VAR ErrorFlags.7
Safety VAR ErrorFlags.8
Sensor VAR ErrorFlags.9
Wrong_Stop = 1
If ErrorFlags <> 0 then
'Gör nått
EndIf
Som sagt, jag är dålig på C (också) så jag kanske missat poängen helt och hållet.
Postat: 24 september 2008, 15:01:32
av Icecap
Jovisst, det verkar vara ganska rätt om det betyder som jag tror. Men det är enbart bits, styrkan är just att det kan kvitta med storleken.
En annan sak som är bra att ha i C då: enum.
enum {First, Second, Fifteenth};
De får "konstantvärdet" First = 0, Second = 1, Fifteenth = 3.
Detta är enormt praktisk när man har sekvenser.
Saxat från ett PIC-projekt med C:
Kod: Markera allt
typedef union
{
WORD Word;
struct
{
BYTE Low;
BYTE High;
} Byte;
} T_BYTE_N_WORD;
Det ger tillgång till samma tal båda byte-mässigt och som 16-bit word.
Kod: Markera allt
struct
{
WORD Solenoid;
BYTE Measure;
} Config;
Skitpraktisk när man ska spara och hämta inställningar i EEPROM, värdet 'sizeof(Config)' anger hur många bytes det rör sig om, man kan sedan spara/hämta hela blocken.
Postat: 24 september 2008, 15:45:58
av H.O
Japp, om du vill ha bytes istället för bits så får det nog bli en Array itället typ:
Kod: Markera allt
ErrorWords VAR WORD [4] 'Fält med fyra 16bitars ord
FirstError VAR ErrorWords[0]
SecondError VAR ErrorWords[1]
ThirdError VAR ErrorWords[2]
ForthError VAR ErrorWords[3]
Nu är det såklart inte LIKA enkelt att kolla som innan, man får väl ta till en FOR-NEXT loop eller nått och indexera igenom fältet. Och det är ju inte lika enkelt att blanda olika storlekar som i en struct.
Det går också bra att accessa varje byte i ett 16 bitars ord genom t.ex
SecondError.Byte0 = 100 eller, för den delen, ForthError.HighByte = %10011010.
Om jag förstår ENUM rätt så skulle det kunna se ut så här i PBP, inte lika snyggt på en rad och så men i alla fall:
Kod: Markera allt
First CON 0 'First har nu det numeriska värdet 0...
Second CON 1 '...Second har nu det numeriska vardet 1
Fifteenth CON 3 'och Fifteenth har nu det numeriska värdet 3
sizeof(Config) får jag nog backa på däremot
Visst finns det kommandon och syntax i C som inte finns i Basic, (PBP i det här fallet) och tvärt om för den delen, men att säga att det bara är skit, inget att ha, bortkastad tid och pengar osv tycker jag är lite orättvist. Speciellt när man inte har någon erfarenhet av kompilatorn i fråga.
/Henrik.
Postat: 24 september 2008, 16:38:17
av Breikus
Tackar för all hjälp! (blir nog inte sista gången jag ber om det ;P )
ber om ursäkt att jag skriver som jag tänker att tankarna vandrar =P
men ska genast sätta mej ner o läsa länkarna om jag fått!
e visst svårare än jag trodde att ställa om sej från elteknik till programmering..

Postat: 24 september 2008, 16:48:01
av Icecap
H.O: Grejen med enum är just att man INTE ger dom nummer, de inkrementerar själv.
Vill man att de startar på t.ex. 10:
enum {First = 10, Second, Fifteenth};
De får "konstantvärdet" First = 10, Second = 11, Fifteenth = 13.
Saxat igen:
Kod: Markera allt
void Load_Configuration(void)
{
Read_EE_Buffer(0, (BYTE*)&Config, sizeof(Config));
if(Config.Language >= LANG_HIGHEST) Config.Language = LANG_ENGLISH_UK;
if(Config.Ashscrape.Trigger_Level > ASHTRIGGER_WEIGHT_MAX) Config.Ashscrape.Trigger_Level = ASHTRIGGER_WEIGHT_MAX;
}
void Save_Configuration(void)
{
Write_EE_Buffer(0, (BYTE*)&Config, sizeof(Config));
}
Då kan man lägga till eller ta bort värden i Config till man är nöjd och allt flyter med, 'Config' är bara en minnesblock sett från det synpunkt.
Ytterligare en fördel med C:
Jag har filer med kommunikationsdefinitioner, bl.a. en LÅNG snum-lista, den inkluderar jag i dels mitt µC-projekt och dels i Borland C Builder-projektet på PC'n som kommunicerar med µC'n via en COM-port. På det vis har de samma definition att utgå ifrån och kommunikationen fungerar direkt.
Ändrar jag något är det bara att kompilera om båda projekten och de är synkroniserade. Jag har t.o.m. källkodfiler som är gemensamma (räknar om metriska värden till jänkarvärden).
Gör det i PBP...
Postat: 24 september 2008, 16:53:11
av H.O
Det handlar mest om hur mycket vilja och motivation man har och vad målet egentligen är. Vill man lära sig hur PIC'en fungerar innan och utan så ÄR det assambler som gäller (det är ju dessutom gratis).
Vill man på ett enklare och snabbare sätt nå fram till en färdig "produkt" så anser jag att, t.ex PBP hjälper till med det. Oavsett vilken väg du väljer så börja smått, annars kommer du stånga dig blodig.
Kom på en sak som inte finns i PBP och det är lokala variabler, alla variabler är globala. Det gör att kreativiteten i bland får flöda en del....
Postat: 24 september 2008, 17:10:04
av sodjan
Breikus, du kan lungt hoppa över SPAM'et om BASIC vs. C
som har skräpat ner lite här...
Backa tillbaka till det du undrade över och kom igen med lite mer
konkreta frågor så tar vi det. Så kommer tråden tillbaka "på spåret" igen...
Kanske lika bra att starta en ny tråd om du har någon speciell
fråga, så slipper vi se allt det andra.
Postat: 24 september 2008, 17:20:39
av H.O
Då fattar jag inte ENUM alls, hur kan Fifteenth få värdet 13?
OK, så här då:
First CON 10
Second CON First + 1
Fifteenth CON First + 2
First, Second, Fifteenth är alltså inte variabler utan konstanter som får sina värden vid kompilering. Vill jag utgå från nått annat än 10 så ändrar jag på First och resten sköter sig själv. Det ser inte lika dant UT som ENUM och man kanske får skriva ett par tecken till men man uppnår exakt samma resultat om jag fattat det rätt.
Men det är klart, får jag för mig att ta bort Second så får ju fortfarande Fifteenth värdet 12 medans det med ENUM hade fått 11.....
Det går bra att inkludera filer i PBP också. Filerna kan innehålla PBP-kod eller ASM-kod. PBP är DIREKT riktat mot PIC, det vet både du, jag och förhoppningsvis alla som använder det så självklart kan jag inte köra PBP-kod på PC'n.
EDIT: Yep, Sodjan har rätt, jag ber om ursäkt för trådkapning och "spam".