Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Sre Mar 26, 2008 5:23 pm Naslov sporočila: C koda in začetnik: |
|
|
Spoštovani forumaši
Moj začetki v C_ju so trenutno v slepi ulici. V yVision3 sem pretipkal določen del kode iz primera Šarm. Kljub temu, da sem kodo oklestil na minimum, mi kompajler vztrajno sporoča:
Build target 'Target 1'
assembling Startup.s...
compiling PROJ1.c...
PROJ1.c(11): warning: #223-D: function "LCD_cmd" declared implicitly
PROJ1.c(15): error: #159: declaration is incompatible with previous "LCD_cmd" (declared at line 11)
PROJ1.c(1 : warning: #223-D: function "LCD_port" declared implicitly
PROJ1.c(26): error: #159: declaration is incompatible with previous "LCD_port" (declared at line 1
Target not created
KODA:
//------------------------//
// proj1.C //
//------------------------//
#include <LPC21xx.h>
void LCD_init()
{
LCD_cmd(0x28-);
}
void LCD_cmd(int cmd)
{
LCD_port(cmd>>4); // high bits
LCD_port(cmd&0x0f); // LOW BYTE
}
void LCD_port(int port_value)
{
if(port_value > 0x0f )
port_value = 0;
}
int main(void)
{
LCD_init();
}
//
DOBRIM DUŠAM, KATERE MI BODO DALE NAMIG KJE GREŠIM IN KAKO IZ ZAGATE, SE V NAPREJ ZAHVALJUJEM.
Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
alessio Član

Pridružen-a: Pon 04 Dec 2006 8:39 Prispevkov: 363 Aktiv.: 1.60 Kraj: Ljubljana
|
Objavljeno: Sre Mar 26, 2008 5:58 pm Naslov sporočila: |
|
|
Problem je v tem, da v definiciji funkcije LCD_init() uporabljaš klic
funkcije LCD_cmd(), ki je nisi prej ne deklariral ne definiral.
Za začetek za
#include <LPC21xx.h>
dodaj deklaracije funkcij:
void LCD_init(void);
void LCD_cmd(int cmd);
void LCD_port(int port_value); |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.51 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sre Mar 26, 2008 6:17 pm Naslov sporočila: |
|
|
Ta tema bi meni tudi prav prišla.
Kako definirati port?
( Prosim celo kodo ne samo eno linijo ) |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Sre Mar 26, 2008 8:29 pm Naslov sporočila: |
|
|
Alessio:
Naredil sem tako in sedaj nimam več problemov z kompajlerjem.
Zaenkrat najleša hvala !!!
Se priporočam .
LP Rudi. |
|
Nazaj na vrh |
|
 |
Olaf Član

Pridružen-a: Tor 14 Nov 2006 20:09 Prispevkov: 127 Aktiv.: 0.56 Kraj: Ljubljana
|
Objavljeno: Čet Mar 27, 2008 1:01 pm Naslov sporočila: |
|
|
PC_Master je napisal/a: |
Ta tema bi meni tudi prav prišla.
Kako definirati port?
( Prosim celo kodo ne samo eno linijo ) |
Celo kodo imaš zapisano v tisti header datotekah (npr. LPC21xx.h ali pa LPC23xx.h itd.).
Drugače pa greš pogledat v datasheet na kateri lokaciji se nahaja željeni register (PIN Connect block). Če želiš definirat port 0, potem moraš definirat registre PINSEL0 (lokacija 0xE002C000), PINSEL1 (0xE002C004), PINMODE0 in PINMODE1 (0xE002C040 in 0xE002C044). Temu sledijo še definicje GPIO registrov: IOPIN0 (0xE0028000), IOSET0 (0xE0028004), IODIR0 (0xE0028008-) in IOCLR0 (0xE002800C).
Programsko pa to zapišeš tako kot je zapisano v headerju, torej z makroji:
Koda: |
#define PINSEL0 (*(volatile unsigned long *)(0xE002C000))
#define PINSEL1 (*(volatile unsigned long *)(0xE002C004))
#define PINMODE0 (*(volatile unsigned long *)(0xE002C040))
#define PINMODE1 (*(volatile unsigned long *)(0xE002C044))
#define IOPIN0 (*(volatile unsigned long *)(0xE0028000))
#define IOSET0 (*(volatile unsigned long *)(0xE0028004))
#define IODIR0 (*(volatile unsigned long *)(0xE0028008))
#define IOCLR0 (*(volatile unsigned long *)(0xE002800C)) |
Zdaj dostopaš do teh registrov kar preko njihovega imena, vrednosti pa se v bistvu zapisujejo na te določene lokacije. Na tak način lahko definiraš tudi vse ostale registre. Si to želel vedeti? _________________ To mi deli! |
|
Nazaj na vrh |
|
 |
PC_Master Član


Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.51 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Čet Mar 27, 2008 1:43 pm Naslov sporočila: |
|
|
No to je že malo preveč .
Zdele sem videl , da je to za ARM in ne AVR .
Se opravičujem . |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Čet Mar 27, 2008 6:56 pm Naslov sporočila: Še en biškotek (ARM + C) |
|
|
Ne znam razvozlati kako dela spodnja procedura !!!
Tudi deklaracije ni v primeru, A mi lahko kdo pomaga?
void LCD_var(var)
{
int a, i, set;
set = 0;
for(i = 9;i >= 0;i --)
{
a=0;
while (var >= desetX(i))
{
var -= desetX(i);
a++;
if (a !=0 )
{
set = 1;
}
if (a !=0 || set)
{
LCD_var (a);
}
if (a == 0 && i == 0 && set == 0)
{
LCD_var (a);
}
}
}
}
int desetX(x)
{
int i = 0;
int rez = 1;
while (i < x)
{
rez *= 10;
i++;
}
return rez;
}
Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Čet Mar 27, 2008 7:15 pm Naslov sporočila: |
|
|
da ne bo pomote , problem je v
while (var >= desetX(i)) _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
dragoon Član


Pridružen-a: Čet 03 Maj 2007 21:51 Prispevkov: 452 Aktiv.: 2.04 Kraj: Trojane
|
Objavljeno: Čet Mar 27, 2008 8:16 pm Naslov sporočila: |
|
|
Dokler je var večji ali enak desetX(i) delaj. <--to je direktni prevod tega. desetX(i) je funkcija, ki vrača vrednost rez.
Koda: |
Za pisanje kode imamo na forumu značko [ code ]
ne zbriše zamikov...
nihče ne bo štel zaklepajev za tabo... OK? |
_________________ LP, Mitja |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Čet Mar 27, 2008 10:43 pm Naslov sporočila: |
|
|
razumel sem kako dela, vendar sem imel problem z najavo.
Kot novinec v C-ju pa nisem vedel da je možna tudi taka deklaracija funkcije:
int desetX(int);
V primerih za Šarm, iz katerih se učim, je avtor izpustil deklaracije.
Upoštevam Vaše pripombe Dragoon hvala.
Koda: |
void LCD_var(int var)
{
int a, i, set;
set = 0;
for(i = 9;i >= 0;i --)
{
a=0;
while (var >= desetX(i))
{
var -= desetX(i);
a++;
if (a !=0 )
{
set = 1;
}
if (a !=0 || set)
{
LCD_var (a);
}
if (a == 0 && i == 0 && set == 0)
{
LCD_var (a);
}
}
}
}
int desetX(int x)
{
int i = 0;
int rez = 1;
while (i < x)
{
rez *= 10;
i++;
}
return rez;
}
|
_________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
dejko1 Član

Pridružen-a: Ned 16 Mar 2008 0:21 Prispevkov: 271 Aktiv.: 1.29 Kraj: Ljubljana
|
Objavljeno: Čet Mar 27, 2008 10:54 pm Naslov sporočila: |
|
|
Vsekakor ne bi rekel, da je taka delkaracija standardna (ne deluje na skoraj nobenem prevajalniku). |
|
Nazaj na vrh |
|
 |
chaos Član


Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.64 Kraj: Zagorje ob Savi
|
Objavljeno: Čet Mar 27, 2008 11:14 pm Naslov sporočila: |
|
|
int desetX(int);
Mogoče tole ni standarden c, v c++ pa lahko tako deklariraš funkcije ...
Ne da se mi zdajle preizkusit, samo bi rekel, da bi znal tole gcc prebavit samo z warningom ...
LP! |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Pet Mar 28, 2008 7:30 am Naslov sporočila: |
|
|
Avtor te deklaracije (ne drugih) ni napisal, sem sam poskusil več varjant pa je
yVision3 prebavil. Bom še praktično probal, če program dela na plati, in javil. _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
rudiP Član

Pridružen-a: Tor 07 Avg 2007 15:30 Prispevkov: 1235 Aktiv.: 5.66 Kraj: KOPER
|
Objavljeno: Pet Mar 28, 2008 7:19 pm Naslov sporočila: |
|
|
Moj prvi program v C-ju za ARM , katerega sem priredil iz delcev kode Šarma za LCD in Led in malo obrnil po lastni želji , sem uspešno zapekel v KEIL MCB2130. Program inicializira Lcd ter vozi LEDice.
Hvala vsem kateri ste mi pomagali !!!! _________________ Lep pozdrav iz Kopra Rudi |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Sob Mar 29, 2008 1:06 am Naslov sporočila: |
|
|
Ali si uporabil Buermenov LCD driver?
Ti ga je ratalo oklestit na <16kB (zaradi uVisiona)?
LPd |
|
Nazaj na vrh |
|
 |
|