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 ... 12, 13, 14 ... 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
chaos
Član
Član



Pridružen-a: Sob 16 Sep 2006 22:12
Prispevkov: 1063
Aktiv.: 4.98
Kraj: Zagorje ob Savi

PrispevekObjavljeno: Pon Dec 28, 2009 11:50 pm    Naslov sporočila:   Odgovori s citatom

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
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: Tor Dec 29, 2009 12:29 am    Naslov sporočila:   Odgovori s citatom

Kadar ti kaj ne deluje, poskusi simulirati delovanje programa.
Koda:
val=val/10;   
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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
osmica
Član
Član



Pridružen-a: Sob 22 Maj 2004 21:16
Prispevkov: 377
Aktiv.: 1.70
Kraj: savinjska

PrispevekObjavljeno: Tor Dec 29, 2009 11:19 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sob 22 Maj 2004 21:16
Prispevkov: 377
Aktiv.: 1.70
Kraj: savinjska

PrispevekObjavljeno: Tor Dec 29, 2009 11:33 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Igorr
Neznanec
Neznanec



Pridružen-a: Sob 02 Jan 2010 22:15
Prispevkov: 2
Aktiv.: 0.01
Kraj: Ljubljana

PrispevekObjavljeno: Sob Jan 02, 2010 11:14 pm    Naslov sporočila:   Odgovori s citatom

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. Smile
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 Jan 04, 2010 7:45 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 3.26
Kraj: Ljubljana

PrispevekObjavljeno: Pon Jan 04, 2010 2:34 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 2:14
Prispevkov: 462
Aktiv.: 2.35
Kraj: Kamnik

PrispevekObjavljeno: Sre Jan 06, 2010 10:10 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pon 11 Jul 2005 22:00
Prispevkov: 146
Aktiv.: 0.66
Kraj: Domžale

PrispevekObjavljeno: Sre Jan 06, 2010 11:06 am    Naslov sporočila:   Odgovori s citatom

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
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: Sre Jan 06, 2010 11:47 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 2:14
Prispevkov: 462
Aktiv.: 2.35
Kraj: Kamnik

PrispevekObjavljeno: Sre Jan 06, 2010 2:04 pm    Naslov sporočila:   Odgovori s citatom

Najprej hvala obema za odgovor!

Ojej...ja to sem se pa res zmotil, oz. nisem pregledal, če je treba kaj spremeniti. Brick wall
Sem sedaj popravil TIMSK register, ampak še vedno ni nič na PORTB.
Je še kak drug možen "hakelc"?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
silvo_v
Član
Član



Pridružen-a: Pon 11 Jul 2005 22:00
Prispevkov: 146
Aktiv.: 0.66
Kraj: Domžale

PrispevekObjavljeno: Sre Jan 06, 2010 10:04 pm    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Pet 25 Jan 2008 2:14
Prispevkov: 462
Aktiv.: 2.35
Kraj: Kamnik

PrispevekObjavljeno: Sre Jan 06, 2010 10:22 pm    Naslov sporočila:   Odgovori s citatom

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 Smile Važno, da sedaj deluje!
Hvala za pomoč!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
clownfish
Član
Član



Pridružen-a: Pet 05 Avg 2005 13:05
Prispevkov: 764
Aktiv.: 3.44
Kraj: Povir / Ljubljana

PrispevekObjavljeno: Pet Jan 08, 2010 1:27 am    Naslov sporočila:   Odgovori s citatom

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



Pridružen-a: Sre 23 Jul 2008 21:51
Prispevkov: 812
Aktiv.: 4.25
Kraj: Med Vipavo in Štanjelom

PrispevekObjavljeno: Ned Feb 21, 2010 9:57 am    Naslov sporočila:   Odgovori s citatom

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
Skrit 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 ... 12, 13, 14 ... 27, 28, 29  Naslednja
Stran 13 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