|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.98 Kraj: Zagorje ob Savi
|
Objavljeno: Pon Dec 28, 2009 11:50 pm Naslov sporočila: |
|
|
Opozorilo ti javlja, ker je verjetno vhod v funkcijo definiran kot navaden - se pravi signed - char. V tem primeru nič hudega, će uporabljaš ti unsigned char.
A drugače ti pa za funkcijo znotraj funkcije ne javlja napake?
LP! |
|
Nazaj na vrh |
|
|
int47 Član
Pridružen-a: Pon 15 Dec 2003 0:10 Prispevkov: 2066 Aktiv.: 9.30 Kraj: Ljubljana
|
Objavljeno: Tor Dec 29, 2009 12:29 am Naslov sporočila: |
|
|
Kadar ti kaj ne deluje, poskusi simulirati delovanje programa.
1/10=0; 0++=1...
Zakaj je cela funkcija Izracun() v Main() ? Na ta način se ti Izracun() prvič izvrši, še preden program pride do while zanke. |
|
Nazaj na vrh |
|
|
osmica Član
Pridružen-a: Sob 22 Maj 2004 21:16 Prispevkov: 377 Aktiv.: 1.70 Kraj: savinjska
|
Objavljeno: Tor Dec 29, 2009 11:19 am Naslov sporočila: |
|
|
Napako zakaj šteje samo do 01 sem ze našel- problem je ker val se obdeluje v izračunu in na koncu izračuna je stanje val=0. Dodal sem novo spremenljivko katera se povečuje vsak pritisk na tipko oz 800mS, na začetku izračuna se stanje nove spremenljivke "prenese" v val. Sedaj dela. |
|
Nazaj na vrh |
|
|
osmica Član
Pridružen-a: Sob 22 Maj 2004 21:16 Prispevkov: 377 Aktiv.: 1.70 Kraj: savinjska
|
Objavljeno: Tor Dec 29, 2009 11:33 am Naslov sporočila: |
|
|
chaos je napisal/a: |
Opozorilo ti javlja, ker je verjetno vhod v funkcijo definiran kot navaden - se pravi signed - char. V tem primeru nič hudega, će uporabljaš ti unsigned char.
A drugače ti pa za funkcijo znotraj funkcije ne javlja napake?
LP! |
Javi mi samo opozorilo vedno, ko uporabim ukaz LCDstring, neglede kje je . |
|
Nazaj na vrh |
|
|
Igorr Neznanec
Pridružen-a: Sob 02 Jan 2010 22:15 Prispevkov: 2 Aktiv.: 0.01 Kraj: Ljubljana
|
Objavljeno: Sob Jan 02, 2010 11:14 pm Naslov sporočila: |
|
|
Napisati moram program za Atmel Tiny 2313 (v AVR Studiu), ki ob aktivnem vhodu D1 glede na stanje vhoda D0 pošlje eno izmed naprej določenih kod na izhod B1.
Bi bilo to pravilno: ?
Koda: |
#include <avr/io.h>
#include <avr/delay.h>
int main (void)
{
DDRB = 0x00; //B --> output
DDRD = 0xff; //D --> input
char i;
char x,y;
char koda_a[] = {1,0,1,0}; //koda A, ki se poslje ob neaktivnem D0
char koda_b[] = {1,0,0,1}; //koda B, ki se poslje ob aktivnem D0
while(1)
{
x = PIND & 1; // x = vrata D, pin 1
if (x)
{
y = PIND & 0; // y = vrata D, pin 0
if(y) //ce je D0 aktiven
{
for (i=0;i<4;i++)
{
PORTB = koda_a[i]; //izhod B_1 glede na kodo A (ostali niso pomembni in se lahko povozijo)
}
}
else // ce D0 ni aktiven
{
for (i=0;i<4;i++)
{
PORTB = koda_b[i]; //izhod B_1 glede na kodo B
}
}
}
}
return 1;
}
|
Kako napisati kodo za sprejemnik, ki bi neprekinjeno poslušala izbrano nožico (recimo B_1) in bi ob pravi kodi aktivirala izhod (recimo D_1)? Pravilni podatki bi prišli na vhod zelo redko (cca. 1x na 10 sekund) in vmes bi lahko prišel kakšen naključen signal (motnja).
Hvala. |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Pon Jan 04, 2010 7:45 am Naslov sporočila: |
|
|
Jaz v AVR Studio za preverjanje stanja bita na nekem portu (ali pa tudi v spremenljivki) uporabljam:
Koda: |
if (bit_is_set (PORTB, 5));
if (bit_is_clear (PORTB, 5));
|
Namesto PORTB lahko daš tudi kako spremenljivko- zastavico, ali katerega od statusnih registrov.
Mi je tako lažje razumljivo kot z maskiranjem.
Glede tistega LCDString: uporabljaš verjetno isto LCD knjižnico kot jaz. To tudi meni vedno javi, ampak dela b.p. Če pa prevedeš dvakrat, ti v drugo ne javi več napake...
Zadnje vprašanje: Motenj se boš pa moral na nek način znebiti. Ker drugače ti bo tudi motnja sprožila tvoj del programa. Drugače pa lahko procesor na pravi signal brez problema čaka tudi 5 let. Tako da 10s ni težava. |
|
Nazaj na vrh |
|
|
gregoral Član
Pridružen-a: Pet 24 Nov 2006 9:42 Prispevkov: 688 Aktiv.: 3.26 Kraj: Ljubljana
|
Objavljeno: Pon Jan 04, 2010 2:34 pm Naslov sporočila: |
|
|
lojzek je napisal/a: |
Če pa prevedeš dvakrat, ti v drugo ne javi več napake... |
Mislim da je tukaj potreben komentar.
Pri prevajanju programske kode se večinoma uporablja optimizacija. Tako prevajalnik prevaja samo tiste datoteke ki so se spremenile od zanjega prevajanja. (Upošteva se modified date time).
Torej če prevedeš dvakrat to še ne pomeni da je napaka čudežno izginila. To je samo znak da prevjalnik ni ponovno prevajal datoteke.
LP, Gregor |
|
Nazaj na vrh |
|
|
Samo87 Član
Pridružen-a: Pet 25 Jan 2008 2:14 Prispevkov: 462 Aktiv.: 2.35 Kraj: Kamnik
|
Objavljeno: Sre Jan 06, 2010 10:10 am Naslov sporočila: |
|
|
Pozdravljeni!
Uporabljam AVR Studio 4 in WinAVR. Imam probleme s timerji. V tej temi je na 2. strani podan primer kode "utripanja" PORTB-ja:
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;
}
}
}
|
Kodo mi pravilno prevede, ko pa zapečem na Atmega16, LEDice na PORTB ne utripajo. Preizkusil sem že nekaj primerov kod z uporabo timerjev, pa je vedno ista pesem. Mi lahko kaj svetujete? |
|
Nazaj na vrh |
|
|
silvo_v Član
Pridružen-a: Pon 11 Jul 2005 22:00 Prispevkov: 146 Aktiv.: 0.66 Kraj: Domžale
|
Objavljeno: Sre Jan 06, 2010 11:06 am Naslov sporočila: |
|
|
Se mi je zdel nekam znan primer programa.
Ta primer sem prenesel iz Attiny2313, kjer je prikinitev Timerja0 omogočena z bitom 1, pri Atmega16 pa je z bitom 0, zato poskusi takole:
TIMSK = 0x01; // enable TCNT0 overflow
Pri AVR-jih so specialni biti v registrih med seboj pomešani glede na tip mikrokrmilnika, zato je potrebno biti na to pozoren.
Lp, Silvo |
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Sre Jan 06, 2010 11:47 am Naslov sporočila: |
|
|
Če smem še dodati k Silvotovem odgovoru:
Čeprav so si Atmelovi krmilniki med seboj podobni, se lahko med njimi razlikujejo tudi imena registrov in imena ter lokacije zastavic v registrih.
Z izkušnjami sem ugotovil, da je mogoče lažji "prenos" programov iz enega v drug krmilnik z uporabo imen registrov in zastavic. Za tvoj primer bi to izgledalo nekako takole:
Koda: |
TIMSK |= (1<< TOIE0); // enable TCNT0 overflow |
Tako hitreje in lažje veš, s katerim registrom/zastavico delaš, pa če program prevajaš za drug krmilnik, ki mogoče nima enakih imen, bo prevajalnik takoj zacvilil. Če pa ima zastavica enako ime samo drugo lokacijo (tvoj primer), bo prevajalnik to že sam uredil.
Enako bi lahko postavljal bite v registru TCCR0... in v vseh ostalih registrih.
PS: TOIE0 je ime dotične zastavice pri megi8...
EDIT: vsa imena zastavic so napisana v datasheetu ob razlagi posameznega registra...
Branko |
|
Nazaj na vrh |
|
|
Samo87 Član
Pridružen-a: Pet 25 Jan 2008 2:14 Prispevkov: 462 Aktiv.: 2.35 Kraj: Kamnik
|
Objavljeno: Sre Jan 06, 2010 2:04 pm Naslov sporočila: |
|
|
Najprej hvala obema za odgovor!
Ojej...ja to sem se pa res zmotil, oz. nisem pregledal, če je treba kaj spremeniti.
Sem sedaj popravil TIMSK register, ampak še vedno ni nič na PORTB.
Je še kak drug možen "hakelc"? |
|
Nazaj na vrh |
|
|
silvo_v Član
Pridružen-a: Pon 11 Jul 2005 22:00 Prispevkov: 146 Aktiv.: 0.66 Kraj: Domžale
|
Objavljeno: Sre Jan 06, 2010 10:04 pm Naslov sporočila: |
|
|
Branko,
zelo lepo si me dopolnil, tudi jaz ponavadi uporabljam način, kot si ga opisal, za primer pa se mi je zdelo bolj pregledno tako kot sem zapisal.
Samo,
primer programa preverjeno dela na Atmega8515, ATmega16 pa nimam pri roki, a sem ga preizkusil v simulatorju, kjer dela.
Ali imaš v Project Options izbran ATmega16?
Lp, Silvo |
|
Nazaj na vrh |
|
|
Samo87 Član
Pridružen-a: Pet 25 Jan 2008 2:14 Prispevkov: 462 Aktiv.: 2.35 Kraj: Kamnik
|
Objavljeno: Sre Jan 06, 2010 10:22 pm Naslov sporočila: |
|
|
Silvo prav si imel. Sem šel še enkrat preverit in sem imel res nastavljeno na Atmega128 namesto Atmega16. Najbrš sem ponesreči prestavil, ko sem z miško kaj "scrollal" in je bilo ponesreči to okno označeno. To se mi večkrat naredi Važno, da sedaj deluje!
Hvala za pomoč! |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.44 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jan 08, 2010 1:27 am Naslov sporočila: |
|
|
Imam težavo z prenosom kode iz WIN-AVR na ICC AVR.
koda na strani:
http://winavr.scienceprog.com/example-avr-projects/avr-lcd-menu-routine.html
se sicer prevede, težava nastopi v vrstici
FPtr=(FuncPtr)pgm_read_word(&FuncPtrTable[MFIndex(MN.menuNo, MN.subMenuNo)]);
natančneje je problem v: pgm_read_word
kot sem gledal(WIN-AVR) gre za makro, ki prebere iz naslova flash-a 1Word - naslov..
Kako to definiram v ICC-AVR C prevajalniku? |
|
Nazaj na vrh |
|
|
sortaj Član
Pridružen-a: Sre 23 Jul 2008 21:51 Prispevkov: 812 Aktiv.: 4.25 Kraj: Med Vipavo in Štanjelom
|
Objavljeno: Ned Feb 21, 2010 9:57 am Naslov sporočila: |
|
|
Evo, sem se še jaz malo lotil teh AVR-jev in napisal prvi program, ki "pomika" LED levo in desno na PORT. Potem sem stvar še malo zakompliciral in sem dodal dve tipki (dodal dva pogojna stavka-ostala koda je ostala ista).
V primeru, da je pritisnjena tipka na PORTB.1 naj LED potuje v levo, če je pritisnjena PORTB.2 naj LED potuje v desno, če ne, pa naj vse LED gorijo.
Koda: |
int pb = PINB;
while(1)
{
int pb = PINB;
if (pb==0xFD)
{
for(int i = 1; i <= 128; i = i*2)
{
PORTD = i;
_delay_loop_2(30000);
}
}
else if (pb==0xFB)
{
for(int i = 128; i >1; i -= i/2)
{
PORTD = i;
_delay_loop_2(30000);
}
}
else
{
PORTD = 0xFF;
}
}
return 1;
}
|
Problem je, ker ko je pritisnjena PORTB.2 se LED pomikajo v desno, vendar le do predzadnje. Zadnja se ne prižge. Prej se je prižgala (brez tipk).
Sem še začetnik, zato morda ne vidim očitne napake...
Vidi kdo, kaj je narobe?
lp, Jernej _________________ Svet je bil analogen, dokler ni Planck vsega zafrknil... |
|
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
|