Hjälp med rutiner/funktioner i mikroC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Hjälp med rutiner/funktioner i mikroC

Inlägg av Jeppsson »

Hej

Försöker få ihop en funktion i MikroC 6.2.1.0 men den vill inte som jag.

Jag vill göra en loop som genomförs 260 ggr (0x0104), jag hade tänkt använda mig av funtkionen for men hur än jag försöker så kan jag bara få den att fungera upp till 126 ggr (0x007E). Har jag högre än det så genomförs loopen men den hoppar aldrig ut från den och fortsätter programmet.

Har declarerat variablen erase2 med alla möjliga int, long, unsigned m.m. utan fram gång.

Här är delar av programmet.

Kod: Markera allt

int erase2;
...
void lcd_clearr()
 {
  lcd_putdata(SET_CUR_L_ADDR, 0x00);
  lcd_putdata(SET_CUR_H_ADDR, 0x00);
  for ( erase2 = 0; erase2 <= 0x007E; erase2++ ) lcd_putdata (LCD_WR_DATA, ' ');            // 0x0104
  }
Programmet skall användas till att skriva ut blanksteg för att tömma en display från övriga tecken.

Använder en PIC18F2320 och en LC7981 GLCD.

Finns det andra bättre lösningar på loopar i C?
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Tänkte en lösning så länge kan ju vara att skriva två for funktioner eller fler efter varandra. Men det fungera inte iheller... :?

Kod: Markera allt

void lcd_clearr()
 {
  lcd_putdata(SET_CUR_L_ADDR, 0x00);
  lcd_putdata(SET_CUR_H_ADDR, 0x00);
  for ( erase2 = 0; erase2 <= 0x0030; erase2++ ) lcd_putdata(LCD_WR_DATA, ' ');            // 0x0104
  for ( erase2 = 0; erase2 <= 0x0040; erase2++ ) lcd_putdata(LCD_WR_DATA, ' ');
  }
Är summan mer än 126 så fungerar det inte!? :shock:

Finns det något annat sätt att lösa mitt problem på?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jag brukar skicka "erase all" kommandot..... men jag använder inte heller dessa rutiner, jag skrivar egna.

Edit: kanske du ska definiera Erase2 till 'unsigned int'
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Stämmer nog. Är variabeln signed så blir den inte mer än vad du har fått.

En annan sak - är det inte snyggare att skriva Void (villkor) och sedan uppdatera villkoret i loopen? For loopar ser lite stökiga ut //END åsikt//
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Det är egen skrivet progam, lånar dock lite delar från ett som jag hittade på nätet... :)

Hjälpte inte med att köra unsigned int :?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Men en 'int' ska vara 16 bit i MikroC! Det skrivs iaf. i help-filen

Men deklarera 'earse2' som 'unsigned int' och spola direkt din jämförelse med hex-värden, det kan mycket väl vara det som får 'erase2' att vara en signed char!

Jämför med 260 och inget annat om du måste göra det så dumt.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg av bengt-re »

Kör assambler ;) tar längre tid att skriva, men blir oftast rätt och då är det bara ETT datablad att läsa. ICD eller simulering är annars bra sätt oaktat språk att testa och lista ut varför program inte fungerar.
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Bra namn Icecap, skall döpa om den till "erase_all" sen...

Det fungerade inte ihäller att skriva 260.
Den erasar så långt som jag skriver in men hoppar aldrig ut ur for rutinen...

Får nog komma på något annat sätt att göra loopen!
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kan det vara en stack-grej? Om den gör sin grej 260 gg men sedan inte hoppar ur är det inte själva 'for'-grejen som är problemet....
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

Testa din funktion med koden

Kod: Markera allt

int apa=0;
i for-loopen.
Hoppar den ur och programmet fortsätter riktigt kan det vara nåt fel i lcd_putdata()
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Tackar karlstedt Jag kastade in en vanlig Delay funktion istället och då fungerade for funktionen, allså är det i lcd_putdata() som är konstig...

Felsökningen fortsätter... :?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Det finns en anledning till att jag skrivar egna rutiner till sånt....
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Ny fråga!!!

Behöver hjälp med C kommando, som sagt tidigare i tråden så använder jag mig av mikroC.

Hur samman fogar jag två char till ett int samt hur splittar man upp dem igen?

byteHigh & byteLow >> INT ?

INT >> byteHigh & byteLow ?

Tacksam för hjälp
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

typedef union
  {
  unsigned int  Word;
  Unsigned char Byte[2];
  } T_BYTE_AND_WORD;

T_BYTE_AND_WORD My_Var;

My_Var.Word = 0x1234; // Access as unsigned int
My_Var.Byte[0] = 0x34; // Access as unsigned char, lower byte
My_Var.Byte[1] = 0x12; // Access as unsigned char, upper byte

Är det så att man bara ska göra det någon enstaka gång (läsa 2 register -> 1 st 16-bitars variabel) kan man göra:
unsigned int W;
unsigned char B0, B1;

*(char*)&W = B0; // För över LSB
*(char*)(&W +1) = B1; // För över MSB
Edit: Ändrade kommentar lite
Senast redigerad av Icecap 22 februari 2007, 11:05:37, redigerad totalt 1 gång.
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Tack så mycket Icecap :)
Skriv svar