|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
VolkD Član
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 64.07 Kraj: Divača (Kačiče)
|
Objavljeno: Čet Maj 29, 2008 9:44 am Naslov sporočila: |
|
|
strobos je napisal/a: |
Da ne bom odpiral nove teme: je kdo že mogoče testiral za koliko % manjšo kodo naredi Codevision proti Bascom AVR za isti program? |
Zelo odvisno od tega kakšen program prevajaš.
Večinoma se da z boljšim algoritmom mnogo efikasnije zmanjšat kodo, kot pa z menjavo prevajalnika. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pet Maj 30, 2008 11:29 am Naslov sporočila: |
|
|
Zopet sem se zaplezal. Ugotovil sem, da winavr nima knjižnice za LCD.
Zato sem po internetu poiskal tole: http://winavr.scienceprog.com/download/AVR-LCD4b.zip.
In seveda mi nič ne gre skupaj. Kot prvo, mislim da bi tejle knjižnici oziroma kompilerju nekako moral povedati, kje sploh je priključen LCD in kakšen je. Če ima kdo čas in voljo, ali lahko pogleda malce knjižnico v linku in pove, kako in kaj. Sam na tejle strani nisem zasledil nobenih konkretnih navodil.
Oziroma še bolje, če ima kdo uporabno knjižnico za LCD, namenjeno za winavr.
Po možnosti z nekim seznamom ukazov
|
|
Nazaj na vrh |
|
|
dragoon Član
Pridružen-a: Čet 03 Maj 2007 21:51 Prispevkov: 452 Aktiv.: 2.20 Kraj: Trojane
|
Objavljeno: Pet Maj 30, 2008 2:03 pm Naslov sporočila: |
|
|
Sem probal v CV tol0e kodo. Skompajla se v 634 besed.
Koda: |
char buffer[16], test;
test=33;
sprintf(buffer,"var test=%c",PORTB);
lcd_puts(buffer);
|
V tisti knjižnjic za winavr pa spremeni številke pinov v LCD.h.
tukaj:
Koda: |
#define LCD_RS 0 //define MCU pin connected to LCD RS
#define LCD_RW 1 //define MCU pin connected to LCD R/W
#define LCD_E 2 //define MCU pin connected to LCD E
#define LCD_D4 4 //define MCU pin connected to LCD D3
#define LCD_D5 5 //define MCU pin connected to LCD D4
#define LCD_D6 6 //define MCU pin connected to LCD D5
#define LCD_D7 7 //define MCU pin connected to LCD D6
#define LDP PORTD //define MCU port connected to LCD data pins
#define LCP PORTD //define MCU port connected to LCD control pins
#define LDDR DDRD //define MCU direction register for port connected to LCD data pins
#define LCDR DDRD //define MCU direction register for port connected to LCD control pins
|
najave funkcij imaš pod tem tekstom, so lepo pokomentirane.
primer pisanja stringa na lcd:
Koda: |
//Copies string from flash memory to LCD at x y position
const uint8_t welcomeln1[] PROGMEM="AVR LCD DEMO\0";
CopyStringtoLCD(welcomeln1, 3, 1);
|
Ampak če hočeš pisat vrednost variable na lcd, moraš spet uporabit sprintf. Oz katerokoli funkcijo ki naredi ascii kode iz vrednosti. _________________ LP, Mitja |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Sob Maj 31, 2008 12:11 pm Naslov sporočila: |
|
|
@dragoon: hvala, bom v ponedeljek spet malce potelovadil. Sicer sem že nekaj poizkušal s spreminjanjem tistega portd > portb, ampak se mi ni skompiliralo ok, oziroma mi je javljal napake. A tebi je delovalo?
Pa še nekaj, kaj pomeni zraven tisti file lcd.c?
PPS: kaj pa naredi tista koda, ki si jo dodal?
Pa še to ugotavljam, da se bom moral začeti igrati z mego, ker so skoraj vse zadeve, ki se tičejo LCDja prevelike za tinyja |
|
Nazaj na vrh |
|
|
dragoon Član
Pridružen-a: Čet 03 Maj 2007 21:51 Prispevkov: 452 Aktiv.: 2.20 Kraj: Trojane
|
Objavljeno: Ned Jun 01, 2008 8:27 pm Naslov sporočila: |
|
|
Jaz uporabljam CV, tega nisem probaval, vendar mora načeloma delovat, če spremeniš porte in številke bitov pri define-ih. Kake napake pa ti je javljalo?
.h - header file, tam nastaviš define, najave funkcij, načeloma stvari, ki jih uporabnik knjižnice spreminja.
.c - sama "knjižnica", tam so vse funkcije knjižnice, tam zaenkrat ničesar ne spreminjaj. Na začetku je vključen (include) .h file.
ti moraš v svoj projakt vključit lcdlib.c file. Namen headerja je red. da imaš ločene zadeve. Načeloma bi bilo lahko vse v eni datoteki.
tista koda izpiše vrednost spremenljivke na zaslon
Koda: |
char buffer[16], test; //narediš varialbe, buffer - polje dolgo 16bajtov, test dolg en bajt
test=33; // prirdiš vrednost
sprintf(buffer,"var test=%c",test); //v buffer zapiše tole: var test=33
lcd_puts(buffer); //izpišeš buffer
|
zgoraj je v spintf PORTB, kar samo zapiše vrednost ki je na portb, po čemer si prej spraševal. _________________ LP, Mitja |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Jun 02, 2008 8:33 am Naslov sporočila: |
|
|
Sedajle sem ponovno poizkusil z uporabo LCDja.
Prevajalnik WINAVR mi javlja sledečo napako:
Koda: |
c:/program files/atmel/winavr/lib/gcc/../../avr/include/util\lcd_lib.c: In function 'LCDcursorLeft':
c:/program files/atmel/winavr/lib/gcc/../../avr/include/util\lcd_lib.c:194: error: 'for' loop initial declaration used outside C99 mode
|
Če pogledam, kam to kaže- kaže v naslednjo for zanko, očitno je tu nekaj narobe:
Koda: |
void LCDcursorLeft(uint8_t n) //Moves cursor by n poisitions left
{
for (uint8_t i=0;i<n;i++)
{
LCDsendCommand(0x10);
}
} |
Mi pa javlja 4 popolnoma enake napake in sicer v funkcijah LCDshiftLeft, LCDshiftRight, LCDcursorLeft, LCDcursorRight.
Kaj bi moral spremeniti, da bi kompiliranje steklo naprej?
EDIT: Tole sem po taktiki MUP (mnoštvo uzaludnih pokušaja) in s pomočjo interneta razrešil. V nastavitvah projekta je bilo potrebno dodati eno stikalo -std=gnu99. Šlo pa se je za napako glede vrst C jezika. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Čet Jun 05, 2008 1:15 pm Naslov sporočila: |
|
|
Seveda se mi je zalomilo že v naslednjem koraku. Sicer znam izpisati eno črko na neko pozicijo LCDja, ne znam pa izpisati besede. Uporabljam winavr.
V prejšnjih postih omenjeni knjižnici sicer obstaja funkcija za izpis stringa, ampak mi nekako stvar ne uspe oživeti.
Tukaj imam izsek kode, ki naj bi izpisala string (besedo) na ekran (nahaja se v lcd_lib.c - imam jo vključeno v headerju #include):
Koda: |
void LCDstring(uint8_t* data, uint8_t nBytes) //Outputs string to LCD
{
register uint8_t i;
// check to make sure we have a good pointer
if (!data) return;
// print data
for(i=0; i<nBytes; i++)
{
LCDsendChar(data[i]); // ta funkcija izpiše posamezni znak in deluje
}
} |
Omenjena je tudi v datoteki lcd_lib.h in sicer takole:
Koda: |
void LCDstring(uint8_t*, uint8_t); //Outputs string to LCD |
Pri kompiliranju mi vedno javi napako pri klicu te funkcije. Domnevam da zato, ker pri klicu ne vstavim pravilnih podatkov. Sem že poizkušal z besedo v narekovajih ", v opuščajih ' , z raznimi medsebojnimi kombinacijami.....
Primer, kako jo v programu kličem:
Koda: |
LCDstring('test',4); |
Javlja mi pa opozorilo: passing argument 1 of 'LCDstring' makes pointer from integer without a cast
Kako lahko pravilno napišem besedo na LCD? Se pravi, kakšen bi bil pravilen klic funkcije in ali je potrebno katero od spremenljivk še posebej definirati pred klicem (kako?).
PS drugače pa ugotavljam, da Winavr včasih eno in isto stvar uspešno prevede, včasih pa z napakami. |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Čet Jun 05, 2008 3:42 pm Naslov sporočila: |
|
|
Koda: |
char niz[10];
strcpy(niz, "test");
LCDstring(&niz[0],4); |
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pet Jun 06, 2008 7:20 am Naslov sporočila: |
|
|
@int47:
Deluje . Tega nebi sam nikoli ugotovil. Sem pa moral vključiti tudi funkcijo string.h
Bi pa še vprašal malce o pomenu podatkov v tvoji kodi, če ti ni pretežko odgovoriti:
1- Char niz[10] - ta definira besedni string z imenom niz in maksimalne dolžine 10 znakov? (ali je zaključna 0 na koncu stringa všteta)
2 - strcpy(niz, "test") - tega sem ugotovil- besednemu stringu niz da vrednost "test"
3- LCDstring(&niz[0],4) - tega pa najmanj zastopim. Zakaj je pred stringom znak in (&), zakaj je v oglatem oklepaju vrednost [0], in zakaj je za vejico 4?
Sicer sem pa zaradi tvoje kode prišel do zanimive strani z osnovami c-ja, ki jo prav priporočam takim začetnikom, kot sem jaz. Je sicer namenjena linuxu, ampak očitno uporabna tudi pri avrjih
http://www.macdonald.egate.net/CompSci/index.html |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Sob Jun 07, 2008 12:00 am Naslov sporočila: |
|
|
Citiram: |
1- Char niz[10] - ta definira besedni string z imenom niz in maksimalne dolžine 10 znakov? (ali je zaključna 0 na koncu stringa všteta) |
10 znakov je skupaj z zaključno 0.
1. znak se nahaja v niz[0], zadnji pa v niz[9]
Citiram: |
3- LCDstring(&niz[0],4) - tega pa najmanj zastopim. Zakaj je pred stringom znak in (&), zakaj je v oglatem oklepaju vrednost [0], in zakaj je za vejico 4? |
Če pogledaš funkcijo
Citiram: |
void LCDstring(uint8_t* data, uint8_t nBytes) //Outputs string to LCD |
1. parameter je kazalec na podatke tipa uint8_t
Kazalec je spremenljivka, katere vrednost kaže na lokacijo(naslov), ki vsebuje željen podatek.
& vrne naslov, na katerem se nahaja spremenljivka
&niz[0] je torej naslov 1. znaka v nizu.
Pri delu z nizi in kazalci je potrebno paziti, da se ne uporablja več znakov(lokacij), kot je rezerviranih.
2. parameter je tipa uint8_t
Če pogledaš funkcijo, vidiš, da ta parameter določa koliko znakov naj funkcija izpiše. Beseda test ima 4 črke.
Če ne želiš šteti znakov, lahko uporabiš funkcijo strlen, ki namesto tebe prešteje število znakov v nizu (brez zaključne 0).
P.S.
Enak učinek bi se dalo dobiti tudi z:
Koda: |
char niz[10]={"test}; // niz je dolzine 10 znakov
LCDstring(niz,4); |
Ali bolj univerzalno brez štetja znakov:
Koda: |
char niz[]={"test}; // niz je dolzine 5 znakov (4+1)
LCDstring(niz,strlen(niz)); |
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Jun 09, 2008 1:43 pm Naslov sporočila: |
|
|
Hvala lepa za razlago, sedaj mi je jasneje kako in kaj.
Trenutno pa telovadim z lastnimi funkcijami in njihovim klicanjem. |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.18 Kraj: Celje
|
Objavljeno: Čet Jun 26, 2008 11:04 pm Naslov sporočila: |
|
|
S kakšnim ukazom bi lahko 2 byta združil v en podatek (16-bitni). Po SPI-ju prejmem
MSB in LSB byte, potrebujem pa samo en 16 bitni podatek, npr. tipa long.
Hvala za odgovor! |
|
Nazaj na vrh |
|
|
Sokrat Član
Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 25.14
|
Objavljeno: Pet Jun 27, 2008 9:03 am Naslov sporočila: |
|
|
podatek_long = (MSB << 8-) | LSB; _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.18 Kraj: Celje
|
Objavljeno: Pet Jun 27, 2008 3:17 pm Naslov sporočila: |
|
|
Točno to sem rabil, hvala |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Tor Jul 08, 2008 7:15 am Naslov sporočila: |
|
|
[quote="silvo_v"]
Domenius je napisal/a: |
Koda: |
#include <avr/io.h>
#include <avr/interrupt.h>
volatile unsigned char delay;
/********************** prekinitev timerja 0 **********************/
SIGNAL(SIG_OVERFLOW0) // signal handler for tcnt0 overflow interrupt
{
TCNT0 = 61; // 50 ms @ 4M
++delay;
}
int main(void)
{
DDRB = 0xff;
TIMSK = 0x02; // enable TCNT0 overflow
TCNT0 = 61; // 50 ms @ 4M
TCCR0 = 0x05; // count with cpu clock/1024
sei(); // enable interrupts
while (1)
{
if (delay==20) // 1 sek
{
delay=0;
PORTB ^= 0xff;
}
}
}
|
Lp |
Tukajle sem ugotovil, da je v vrstici TCCR0 = 0x05 manjša napaka. Ki začetniku, kot sem jaz, z lahkoto požre nekaj ur, pa še rezultata na koncu ni.
Namesto TCCR0 je potrebno napisati TCCR0B. Vsaj pri meni je bilo tako. Ugotovil pa sem pri simulaciji v winavr, ko sem opazil imena registrov TCCR0A in TCCR0B. Zakaj pa sta dva registra, pa še nisem ugotovil.
Trenutno telovadim s Tinnyjem.[/b] |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 48 dni
Powered by phpBB © 2001, 2005 phpBB Group
|