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

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Jan 11, 2007 12:09 am Naslov sporočila: ATMega16 in c |
|
|
Pozdravljeni!
Spet sem naletel na težavo in sicer pri vpisu vhoda določenega pina v neko spremenljivko.
Rad bi napisal program ki bi prebral PORTA.0 in to kar prebere zapisal v neko spremenljivko ki sem jo definiral. To bi naredil 8x da se register zapolni in potem bi to naredil še za 8 zaporednih registrov tako da bi prebral 64bitov.
Torej hočem narediti kot nekakšen UART ampak brez start in stop bitov (torej brez frama).
Tukaj je program ki sem ga začel pisat ampak mi javlja napake.
Koda: |
void main(void)
{
unsigned int a,b;
unsigned int r[7] ;
inicializacija();
for (a=0; a<8; a++)
{
for (b=0; b<8; b++)
{
r[a].0=PINA.0;
#asm ("rol r[a]")
delay_ms(30);
};
};
}
|
Lp |
|
Nazaj na vrh |
|
 |
mitja Neznanec

Pridružen-a: Čet 11 Jan 2007 0:36 Prispevkov: 2 Aktiv.: 0.01
|
Objavljeno: Čet Jan 11, 2007 12:42 am Naslov sporočila: |
|
|
Živ!
Ne vem sicer, kakšne napake ti javlja, po hitrem pregledu, pa so me zmotila podpičja na koncu zavitih oklepajev v for zankah. Moj compiler jih namreč ne uporablja v takem primeru. Poskusi z izbrisom teh podpičij.
LP, Mitja |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Čet Jan 11, 2007 12:45 am Naslov sporočila: |
|
|
Najboljse da nam ne poves kaksno napako ti javi, da bomo cimdlje ugibali. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Jan 11, 2007 1:04 am Naslov sporočila: |
|
|
Se opravičujem za nepopolno vprašanje.
Uporabljam CVAVR. Napako pa mi javi v vrstici
r[a].0=PINA.0;
ker prevajalnik misli da z r[a].0 hočem zapisati v strukturo. Jaz bi pa rad samo zapisal prvi bit. Za podpičja pa se prevajalnik na zbuni tudi če so ali niso.
Lp |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.06 Kraj: Divača (Kačiče)
|
Objavljeno: Čet Jan 11, 2007 1:16 am Naslov sporočila: |
|
|
Ja in kako imaš definirano spremenljivko r ??
Za kaj takega bo potrebno določiti strukturo !
Spremenljivka tipa int ni že po defoltu definirana kot struktura bitov, tako kot je recimo port. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo.
Nazadnje urejal/a VolkD Čet Mar 01, 2007 11:45 pm; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
PeterC Član

Pridružen-a: Tor 14 Dec 2004 20:22 Prispevkov: 204 Aktiv.: 0.86
|
Objavljeno: Čet Jan 11, 2007 2:46 am Naslov sporočila: |
|
|
Definitivno r ni pravilno deklariran.
Ena izmed možnih rešitev - pišem tako na pamet:
Koda: |
void main(void)
{
unsigned int a,b;
char r[8];
inicializacija();
for (a=0; a<8; a++)
{
for (b=0; b<8; b++)
{
r[a]= r[a] << 1;
if(PINA.0==0)
{
r[a]=r[a] & 0xFE;
}
if(PINA.0==1)
{
r[a]=r[a] | 0x01;
}
delay_ms(30);
}
}
} |
|
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Jan 11, 2007 5:50 pm Naslov sporočila: |
|
|
Kako pa naj definiram strukturo bitov? Nekaj sem poizkušal z deklaracijo tipa bit ampak neznam ustvarit 8 spremenljivk ki bi bile kot en register. |
|
Nazaj na vrh |
|
 |
fogl Član


Pridružen-a: Sob 11 Sep 2004 22:37 Prispevkov: 80 Aktiv.: 0.34 Kraj: Radovljica
|
Objavljeno: Čet Jan 11, 2007 5:57 pm Naslov sporočila: |
|
|
V winavr (gcc) takole:
struct {
uint8_t bit1: 1;
uint8_t bit2: 1;
} bitfield; _________________ lp, klemen |
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Sob Feb 03, 2007 1:49 pm Naslov sporočila: |
|
|
Imam še eno vprašanje pa bom kar tu vprašal.
Definiral sem polje npr.:
Koda: |
unsigned char x[128]; |
zdaj pa me zanima kako bi lahko temu polju z for zanko prišteval vedno ena. Torej celemu polju in ne samo enemu "znaku" polja.
Lp |
|
Nazaj na vrh |
|
 |
Ch4N93 Član

Pridružen-a: Tor 21 Jun 2005 0:21 Prispevkov: 58 Aktiv.: 0.24 Kraj: Ptuj
|
Objavljeno: Sob Feb 03, 2007 6:25 pm Naslov sporočila: |
|
|
Koda: |
for (i=0; i<128; i++)
{
x[i]++;
} |
|
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Sob Feb 03, 2007 8:50 pm Naslov sporočila: |
|
|
Hja to ni ravno to kar jaz hočem. Bom poskušal razložit kaj bi pravzaprav rad.
Potrebujem število ki bi bilo dolgo 1024 bitov. Ampak ker v c-ju lahko definiraš največje število ki je dolgo 32 bitov (unsigned long int) sem pač uporabil polje ki je dolgo 128 znakov in ga definiral kot "unsigned char" kar je 8 bitov na znak (pač velikost registra v AVR in zaradi manjše kode ki bi jo drugač prevajalnik izkašljal če bi uporabil kakšno drugo deklaracijo) in dobim število v velikosti 1024b.
Sedaj pa bi rad temu številu (tem 1024 bitom) prišteval 1. Težava je edino v tem da če hočem prišteti 1 k spremenljivki x (ki sem jo prej definiral) da bi mogo tudi izbrat polje h kateremu bom prišteval. Jaz bi pa rad prišteval celemu polju.
Upam da vsaj malo veste kaj sem mislil.
Lp |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Sob Feb 03, 2007 9:04 pm Naslov sporočila: |
|
|
madzi je napisal/a: |
Sedaj pa bi rad temu številu (tem 1024 bitom) prišteval 1. Težava je edino v tem da če hočem prišteti 1 k spremenljivki x (ki sem jo prej definiral) da bi mogo tudi izbrat polje h kateremu bom prišteval. Jaz bi pa rad prišteval celemu polju. |
Kaj ?
I naj bo spremenljivka, velika 1024 bitov; ta del je napisan razumljivo. Kaj bi rad naredil z njo ? I = I + 1 ali kaj drugega ? _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Sob Feb 03, 2007 9:23 pm Naslov sporočila: |
|
|
Ja, nekaj takega.
V bolj poenostavljenem zapisu, ki seveda ne deluje.
Koda: |
unsigned char x[128];
void funkcija()
{
x++;
} |
Nekaj takega. Hočem samo da bi celotno polje povečeval za 1. |
|
Nazaj na vrh |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Sob Feb 03, 2007 9:35 pm Naslov sporočila: |
|
|
Opcija 1: rekurzija (tega ncoes na 8-bitnih mikrokontrolerjih)
Opcija 2: z "odrolano" rekurzijo
Primer za slednje:
Koda: |
for (i = 0; i < 128; i++)
{
x[i]++;
if (x[i] != 0) break;
}
|
(predpostavka: LSB 1024-bitnega stevila je shranjen v LSb x[0]; ce temu ni tako, obrni mejna pogoja zanke) _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Mar 01, 2007 11:30 pm Naslov sporočila: |
|
|
No moje prejšnje težave še vedno nisem rešil, ampak zdaj sem to malo pustil ob strani in imam drugo težavo. In sicer imam težavo pri tipkovnici.
Na nekem pinu tipam če je stanje 1 in ko je stanje 1 se izvede neka procedura. Težavo imam v tem da se to izvaja toliko časa dokler tipke ne izpustim, rad bi pa da se izvede samo enkrat. Najbolj primeren čas bi bil takrat ko tipko izpustim.
Primer kode ki jo zdaj uporabljam
Koda: |
if(on){
printf("hello :)\n\r");
} |
Prosim pomagajte mi.
Lp |
|
Nazaj na vrh |
|
 |
|