Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

const char i višedimenzionalno polje

[es] :: C/C++ programiranje :: const char i višedimenzionalno polje

[ Pregleda: 4046 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon const char i višedimenzionalno polje29.12.2004. u 18:13 - pre 185 meseci
Pisem software za mikrokontroler pic 16f876 i koristim htpic c 7.84 compiler(to mozda i nije toliko bitno.
zanima me kako da znakovni niz sa const predznakom pridruzim znakovnom polju.

sljedeca kombinacija radi:

char time[] = " TIME ";
char setup[] = "SETUP";
char pr[] = "P";
char pon[] = "Mo";
char utorak[] = "Tu";
char srijeda[] = "We";
char *text[10];
char shift_time;
void ispis_na_lcd(char *[]);

void main()
{
text[0]=time;
text[1]=setup;
text[2]=pon;
text[3]=utorak;
ispis_na_lcd(text);
}
void ispis_na_lcd(char *text[])
{
for(shift_time=0; shift_time<8; shift_time++)
{
if(shift_time==0)
{lcd_goto_red1();}
if(shift_time==5)
{lcd_goto_red2();}
while(*text[shift_time])
{
LCD_RS = 1;
PORTC = *text[shift_time]++;
LCD_STROBE;
DelayUs(40);
}
}
}

ALI AKO VARIJABLE DEKLARIRAM OVAKO:
const char time[] = " TIME ";
const char setup[] = "SETUP";
const char pr[] = "P";
const char pon[] = "Mo";
const char utorak[] = "Tu";
const char srijeda[] = "We";
const char *text[10];
NE RADI NI ZA ZIVU GLAVU.

Unaprijed zahvaljujem.

[Ovu poruku je menjao damir0205 dana 29.12.2004. u 20:47 GMT+1]
 
Odgovor na temu

Dejan Lozanovic
Dejan Lozanovic
Beograd

Član broj: 691
Poruke: 2325
*.verat.net.

Jabber: null@elitesecurity.org
Sajt: speedy-order.com


+75 Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 18:22 - pre 185 meseci
pa kada su mikrokontorleri u pitanju jako je pipava situacija, i tu kompajleri dosta odskacu od Ansi C standarda. Nisam koristio HTPIC u realnom rezimu, pogledaj u koji segment meorije smesta promenljive u jednom a u koji segment u drugom slucaju.
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 18:47 - pre 185 meseci
kompajler odgovara ANSI C standardu. ako stavim const onda se niz sprema u flash memoriju i trebao bi se prilikom pozivanja ucitati u RAM, a ako stavim samo char onda su mi svi nizovi cijelo vrijeme u RAM-u, problem je u tome sto nemam dovoljno RAM-a za sve tekstove koje zelim definirati pa ih moram spremiti u flash memoriju, a to se postize const predznakom
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
*.teol.net.



Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 19:01 - pre 185 meseci
Ja već duže vrijeme hoću da napravim program u c-u za pic 16f84, ali nemam vremena,
u tvom kodu u main() funkciji, za ispis_na_lcd(); nedostaje ulazni argument.
Za main bi trebao biti int a ne void, koliko sam upućen,
zanima me još nešto, koristio si char *text[10]; zašto koristis 10 kad ti treba 3,
da li se može koristiti
char *text;
text=(char)malloc((sizeof(char))*4);
. . .
free(text);

da li taj kompajler podržava funkciju malloc( )?
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 19:41 - pre 185 meseci
ne znam da li podrzava malloc. program bi trebao biti sat realnog vremena sa 16 programa i osam izlaza, te inteligentnim lcd-om PCF1602H. ono sto sam dosad napravio ima preko tisucu redova koda tako da nisam sve slao. ovo je bio samo primjer. sef me gnjavi s prikazom na displeju pa mora biti barem deset textova
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 19:46 - pre 185 meseci
@slavkot
ispis_na_lcd(text);

ali tu nije greska, to sam samo krivo prepisao.
zasto mora biti int main() i void main() radi sasvim pristojno
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje29.12.2004. u 19:53 - pre 185 meseci
nazalost ne podrzava funciju malloc(). upravo provjereno
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
*.teol.net.



Profil

icon Re: const char i višedimenzionalno polje30.12.2004. u 21:48 - pre 185 meseci
Probaj definisati na sledeći način:

const char *text[]={ " TIME ", "SETUP","P","MO","TU"};

i odmah ti je text[0]="TIME", text[1]="SETUP"...

A što se tiče int ili void za funkciju main( ), po novijim standardima mora biti int main( ), dok stariji kompajleri podržavaju i void main( ), što je slučaj sa tvojim, znači može proći i void main( )
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje30.12.2004. u 21:53 - pre 185 meseci
radi ako definiram const char *text[8];
onda mogu text u mainu zadavati ovako:
text[0]="setup";
text[1]="time";
text[2]="bilo sto";

sad ne znam kako da *text[8] prenesem u funkciju ispis_na_lcd(????????) ?
 
Odgovor na temu

slavkot

Član broj: 18657
Poruke: 166
*.teol.net.



Profil

icon Re: const char i višedimenzionalno polje30.12.2004. u 22:55 - pre 185 meseci
moraš i funkciju definisati kao void ispis_na_lcd(const char *[]);
a ne void ispis_na_lcd(char *[]);
pozivaš je kao što si gore činio, ispis_na_lcd(text);
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje31.12.2004. u 01:14 - pre 185 meseci
a kako treba izgledati ispis_na_lcd funkcija, ako ju napisem ovako ne radi:

void ispis_na_lcd(const char *text[])
{
for(shift_time=0; shift_time<8; shift_time++)
{
if(shift_time==0)
{lcd_goto_red1();}
if(shift_time==5)
{lcd_goto_red2();}
while(*text[shift_time])
{
LCD_RS = 1;
PORTC = *text[shift_time]++;
LCD_STROBE;
DelayUs(40);
}
}
}
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje31.12.2004. u 15:49 - pre 185 meseci

@slavkot zahvaljujem na pomoci
dosao sam do rjesenja iako mi jos uvijek nije jasno zasto ne mogu napisati
PORTC=*text[shift_time]++; u while petlji kao sto se moze kad se ne kotisti const prefiks

void ispis_na_lcd(const char *text[])
{
for(shift_time=0; shift_time<10; shift_time++)
{
if(shift_time==0)
{lcd_goto_red1();}
if(shift_time==5)
{lcd_goto_red2();}
duljina_texta=strlen(text[shift_time]);
for(shift_char=0; shift_char<duljina_texta; shift_char++)
{
LCD_RS = 1;
PORTC = text[shift_time][shift_char];
LCD_STROBE;
DelayUs(40);
}
ispis_lcd_cifre();
}
}

da li netko zna kako provjeriti bitove u unsigned char varijabli
npr.

unsigned char bitovi=0x2F; //ili bilo koja druga vrijednost

kako napisati funkciju koja daje vrijednost bitiova 0-7(jedinicu ili nulu)?

 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.verat.net.



Profil

icon Re: const char i višedimenzionalno polje11.01.2005. u 07:47 - pre 185 meseci
Moja preporuka je da sve sto imas da pitas pitas na forumima koji su namenjeni za te stvari (Mikroelektronika.co.yu, YUMCU) jer kad je u pitanju mikrokontroler mnoge stvari iako je kompajler po ANSI C-u moze da bude problema. Sto se tice tvog pitanja u vezi smestanja konstanti u rom (flash) memoriju ti si napisao pravu sintaksu ali je mozda problem sto mozda nemas dovoljno rom memorije da te stringove tamo smestis (koliko se secam rakao si da si vec napisao hiljade redova koda). Taj kontroler ima 8Kb flasha. Ako se ispostavi da je to u pitanju mozes bez problema uzeti neki pin kompatibilni iz 18F serije ali sa recimo 12Kb ili 16Kb flasha. Sem toga imaju i duplo vise ram memorije.
Jos nesto, za potrebe korisnika gore pomenutih foruma na YU_EMBEDDED briefcase na yahoo-u imas da skines noviji verziju HT-pic c kompajlera 8.02pl kao i isto tako dobar CCS C kompjaler koji ja koristim kao i PIC BASIC PRO 2.44 i jos ponesto.
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje14.01.2005. u 21:54 - pre 185 meseci
imam najnoviji htpicov kompajler i presao sam na 18f252. sto se mikroelektronike.co.yu tice nema bas nesto, sve je vezano za basic i paskal, nista o c-u. trenutno me muci i2c komunikacija sa pcf8583, ima li netko neko rjesenje jer moje ne radi??? kad pozovem funkciju void _8583_read_clock(void) procesor mi se zablesavi, bez nje zinog pozivanja stvar radi ok. vjerojatno sam nesto krivo podesio u registrima za MSSPI, ako netko moze pomoci bio bih mu neizmjerno zahvalan, no dug je put do vjecnosti, vec tri dana se ne micem od toga.

#include <ctype.h>
#include <float.h>
#include <delay.h>
#include <delay.c>
#include <pic18.h>
#include <stdio.h>
#include <string.h>
#include <lcd.c>
#include <lcd.h>


#define POSITIVE 0
#define NEGATIVE 1
#define SSPIF_MASK 0x08
#define R_W_MASK 0x04
#define PORTBIT(adr, bi) ((unsigned)(&adr)*8+(bi))
#define LCD_STROBE ((LCD_EN = 1),(LCD_EN=0))
//#define SHIFT_STROBE() SHIFT_EN = 1; asm("nop"); asm("nop"); SHIFT_EN=0;
static bit TE @ PORTBIT(PORTB, 4); //tipka RELEJ SETUP
static bit TG @ PORTBIT(PORTC, 0); //tipka GORE
static bit TS @ PORTBIT(PORTC, 1); //tipka PROGRAM SETUP
static bit TD @ PORTBIT(PORTC, 2); //tipka DOLJE
static bit TR @ PORTBIT(PORTC, 5); //tipka TIME SETUP
static bit TF @ PORTBIT(PORTB, 5); //tipka SHIFT
static bit SHIFT_DATA @ PORTBIT(PORTA, 3);
static bit SHIFT_LATCH @ PORTBIT(PORTB, 6);
static bit SHIFT_EN @ PORTBIT(PORTA, 5);
static bit LIGHT @ PORTBIT(PORTA, 2);
static bit SCL @ PORTBIT(PORTC, 3); //Clock
static bit SDA @ PORTBIT(PORTC, 4);

void ConfigureI2C(void);
void I2CSend( char );
char I2CReceive(void);
void I2CAck(void);
void I2CNak(void);
void I2CStart(void);
void I2CStop(void);
void I2CWait(void);
void _8583_configure_control_register(char control_reg);
void _8583_read_clock(void);
char to_natural_binary(char BCD);
void write_clock_byte(char address, char data);
char read_clock_byte(char address);



void main()
{
ADCON1 = 0X07;
TRISC = 0X27; /* PORT C definiran je izlazni port i sluzi za slanje podataka na LCD*/
/* RCO-RC7 = D0-D7*/
TRISA = 0X0;
TRISB = 0X30;
/* for(prog=0; prog<16; prog++)
{
prog_on_off[prog]=eeprom_read(14*prog+2);
start_sati[prog]=eeprom_read(14*prog+3);
start_minute[prog]=eeprom_read(14*prog+4);
stop_sati[prog]=eeprom_read(14*prog+5);
stop_minute[prog]=eeprom_read(14*prog+6);
start_dan[prog]=eeprom_read(14*prog+7)
stop_dan[prog]=eeprom_read(14*prog+8);
bitovi_releja[prog]=eeprom_read(14*prog+10);
}*/
TMR1ON=0;
PR2=78; /*interrupt svakih 5ms*/
T2CON=0xF9; /*timer2 konfiguriran i ugašen (postskaler=16, preskaler=4) */
PEIE=1;
TMR2IE=1;
GIE=1;
lcd_init(); /* inicijalizacija LCD-a*/
shift_time=0;
blink_time=0;
meni_pozicija=0;
prog=1;
TMR2ON=1; /*timer2 ukljucen*/
TMR2IF=0;
dan_utj=1;
i=0;
PORTA=0x0;
PORTB=0x0;
PORTC=0x0;
relej1=0;
relej2=1;
relej3=0;
relej4=1;
relej5=0;
relej6=1;
relej7=0;
relej8=1;
tg=0;
ts=0;
td=0;
tf=0;
tr=0;
te=0;
light=0;
lcd_clear();
SSPCON1=0x08;
SSPEN=1;
SSPADD=0x0F;
ConfigureI2C();
while(1) /* beskonacna petlja za izvrsavanje programa*/
{
asm("clrwdt");
8583_read_clock();
Ispitaj_tipke();
background_light();
meni();
ispis_na_lcd(text);
} /* } od while*/
}
/* } od main*/
void ConfigureI2C(void)
{
SSPEN=1; // Enable I2C mode

SSPM3=1; // Setup I2C
SSPM2=0;
SSPM1=0;
SSPM0=0;
SSPCON2 = 0;
SMP=0;
CKE=0; // Set I2C Levels
// Set I2C Speed
SSPADD = 10; // 100k at 4Mhz clock
}

/***********************/
/* Send a char via I2C */
/***********************/
void I2CSend( char ch )
{
SSPBUF = ch; // Load DATA to send
I2CWait(); // Wait for completion
}
/**************************/
/* Receive a char via I2C */
/**************************/
char I2CReceive(void)
{
while ( SSPSTAT & R_W_MASK ); // Wait for Transmit to end
RCEN=1; // Enable I2C receiver
I2CWait(); // Wait for data to arrive.

return SSPBUF; // Return the data
}
/**************************/
/* Send an I2C ACK */
/**************************/
void I2CAck(void)
{
ACKDT=0; // Setup for ACK
ACKEN=1; // Send ACK
I2CWait(); // Wait for completion
}
/**************************/
/* Send an I2C ACK */
/**************************/
void I2CNak(void)
{
ACKDT=1; // Setup for NAK
ACKEN=1; // Send NAK
I2CWait(); // Wait for completion
}
/**************************/
/* Generate an I2C START */
/**************************/
void I2CStart(void)
{
SEN=1; // Initiate START condition
I2CWait(); // Wait for completion
}
/***************************/
/* Generate an I2C RESTART */
/***************************/
void I2CRestart(void)
{
RSEN=1; // Initiate START condition
I2CWait(); // Wait for completion
}
/**************************/
/* Generate an I2C STOP */
/**************************/
void I2CStop(void)
{
PEN=1; // Generate STOP condition
I2CWait(); // Wait for completion
}

/**************************************/
/* Waits for I2C process to complete */
/**************************************/
void I2CWait(void)
{
while ( !( PIR1 & SSPIF_MASK ) ); // Wait for Interrupt

SSPIF=0; // Clear Interrupt flag
}

void _8583_configure_control_register(char control_reg)
{
I2CStart();
I2CSend(0xa0);
I2CNak();
I2CSend(0x00); /* control register address */
I2CNak();
I2CSend(control_reg);
I2CNak();
I2CStop();
}

void _8583_read_clock(void)
{
I2CStart();
I2CSend(0xa0);
I2CNak();
I2CSend(0x02); /* begin with seconds */
I2CNak();

I2CStart();
I2CSend(0xa1);
I2CNak();
v = I2CReceive() & 0x7f;
sekunde = to_natural_binary(v);
I2CAck();
v = I2CReceive();
minute = to_natural_binary(v);
I2CAck();
v = I2CReceive() & 0x3f;
sati = to_natural_binary(v);
I2CAck();

v = I2CReceive();
godina = v >> 6; /* year is in two most sig bits */
v = v & 0x3f; /* day in lower six bits */
dan_umj = to_natural_binary(v);
I2CAck();

v =I2CReceive();
dan_utj = v >> 5;
v = v & 0x1f;
mjesec = to_natural_binary(v);
I2CNak();
I2CStop();
}

char to_natural_binary(char BCD)
{
return( ((BCD >> 4) * 10) + (BCD & 0x0f) );
}
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje15.01.2005. u 12:53 - pre 185 meseci
ne znam kako bih trebao protumaciti ovu praznu poruku
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
217.26.66.*



Profil

icon Re: const char i višedimenzionalno polje18.01.2005. u 13:06 - pre 184 meseci
Pokusao sam da ti posaljem poruku na e-mail ali sam greskom odgovorio preko ovog foruma, zbog toga je prazna poruka.

Evo odgovora:

Ja radim u CCS Pic C i za to koristim vec predvidjene funkcije, mada nisam
nesto bas puno radio sa I2C komunikacijom.
Kod ovog kompajlera se da direktiva #use i2c i kompajler automatski postavi
parametre za komunikaciju. Vidim da ti
rucno podesavas MSSPI periferiju. Koliko sam ja pogledao tebi je funkcija za
citanje _8583_read_clock(void) ali na
jednom mestu je pozivas sa 8583_read_clock(viod) bez "_ " ispred. Kako ti
zablesavi, jel se resetuje?

Za Mikroelektroniku sam ti pogresno objasnio, nisam mislio na njihov forum
sa sajta nego na njihov forum na yahoo.com.
Idi na yahoo.com i u forum sekciji pretrazi grupu mikroelektronika pa se
prijavi i mocices da pa ucestvujes u njemu zajedno sa
nekih 700-nak nas. Takodje forum YUMCU i PIC4YU mogu biti od koristi.

Na http://briefcase.yahoo.com
login : yu_embedded
passwrd: mikroelektronika

imas nesto od korisnog software-a za dosta toga nekih 19Mb.

Takodje poseti sajt www.microchipc.com posvecen C-u (uglavnom HT-PICC)

Pozdrav.

Aleksandar.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.verat.net.



Profil

icon Re: const char i višedimenzionalno polje18.01.2005. u 13:16 - pre 184 meseci
E da, zaboravio sam:

Kolega Nebojsa Pejcic (www.epraktikum.co.yu) mi nedavno rece da je bolja varijanta za umesto PC8583 koristis DS1307.
 
Odgovor na temu

damir0205

Član broj: 22726
Poruke: 107
*.cmu.carnet.hr.



Profil

icon Re: const char i višedimenzionalno polje18.01.2005. u 19:04 - pre 184 meseci
@sander
hvala na korisnim informacijama. da pretpostavljam da mi program resetira wdt reset kad pozivam navedenu funkciju. izgleda da sam negdje neplanirano napravio beskonacnu petlju.

Pozdrav
 
Odgovor na temu

[es] :: C/C++ programiranje :: const char i višedimenzionalno polje

[ Pregleda: 4046 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.