www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3 ... 5, 6, 7 ... 27, 28, 29  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 64.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Čet Maj 29, 2008 9:44 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Maj 30, 2008 11:29 am    Naslov sporočila:   Odgovori s citatom

Zopet sem se zaplezal. Ugotovil sem, da winavr nima knjižnice za LCD. Confused

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
Rolling Eyes
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dragoon
Član
Član



Pridružen-a: Čet 03 Maj 2007 21:51
Prispevkov: 452
Aktiv.: 2.20
Kraj: Trojane

PrispevekObjavljeno: Pet Maj 30, 2008 2:03 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Sob Maj 31, 2008 12:11 pm    Naslov sporočila:   Odgovori s citatom

@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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dragoon
Član
Član



Pridružen-a: Čet 03 Maj 2007 21:51
Prispevkov: 452
Aktiv.: 2.20
Kraj: Trojane

PrispevekObjavljeno: Ned Jun 01, 2008 8:27 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pon Jun 02, 2008 8:33 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Jun 05, 2008 1:15 pm    Naslov sporočila:   Odgovori s citatom

Smile 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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jun 05, 2008 3:42 pm    Naslov sporočila:   Odgovori s citatom

Koda:

char niz[10];
strcpy(niz, "test");
LCDstring(&niz[0],4);
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Jun 06, 2008 7:20 am    Naslov sporočila:   Odgovori s citatom

@int47:

Deluje Very Happy . 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 Smile

http://www.macdonald.egate.net/CompSci/index.html
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
int47
Član
Član



Pridružen-a: Pon 15 Dec 2003 0:10
Prispevkov: 2066
Aktiv.: 9.30
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jun 07, 2008 12:00 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pon Jun 09, 2008 1:43 pm    Naslov sporočila:   Odgovori s citatom

Hvala lepa za razlago, sedaj mi je jasneje kako in kaj.

Trenutno pa telovadim z lastnimi funkcijami in njihovim klicanjem.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Čet Jun 26, 2008 11:04 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 25.14

PrispevekObjavljeno: Pet Jun 27, 2008 9:03 am    Naslov sporočila:   Odgovori s citatom

podatek_long = (MSB << 8-) | LSB;
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Pet Jun 27, 2008 3:17 pm    Naslov sporočila:   Odgovori s citatom

Točno to sem rabil, hvala Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Jul 08, 2008 7:15 am    Naslov sporočila:   Odgovori s citatom

[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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3 ... 5, 6, 7 ... 27, 28, 29  Naslednja
Stran 6 od 29

 
Pojdi na:  
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