kommandolista?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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.
Användarvisningsbild
Breikus
Inlägg: 54
Blev medlem: 13 juli 2008, 09:24:20
Ort: Linköping

Inlägg 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.. :shock:
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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...
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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.
H.O
Inlägg: 5919
Blev medlem: 19 mars 2007, 10:11:27
Ort: Ronneby

Inlägg 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".
Skriv svar