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 ... 18, 19, 20 ... 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
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sre Apr 27, 2011 8:09 pm    Naslov sporočila:   Odgovori s citatom

Ravnokar presedlal iz bascoma na C. LEDica že utripa, pojavi pa se problem, ko hočem v program vključiti for zanko. Ob gradnji (build) mi javi, da je program velik 3726 bytov, veliko preveč za attiny13. Kaj delam narobe?

Koda:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
   DDRB = 0b00001000;
   int i;

      for(i=0;i<255;i++)
      {
       _delay_ms(i);
      PORTB = 0b00001000;
      _delay_ms(i);
      PORTB = 0b00000000;
      }

return 0;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
žrepko
Član
Član



Pridružen-a: Tor 23 Mar 2010 20:12
Prispevkov: 700
Aktiv.: 4.10
Kraj: Ptuj-Maribor

PrispevekObjavljeno: Sre Apr 27, 2011 8:33 pm    Naslov sporočila:   Odgovori s citatom

Spremeni iz
Koda:
 int i
na
Koda:
char i;

Mogoče bo pomagalo.

EDIT:

Šele sedaj sem videl, da uporabljaš delay funkcijo.
Raje uporabljaj timerje. Primeri so na www.avrfreaks.com zelo lepo prikazani.
Program se ti najbrž ne bo izvajal po želji, ker vedno znova povečuješ zakasnitev.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
teey
Član
Član



Pridružen-a: Pon 15 Sep 2008 20:51
Prispevkov: 21
Aktiv.: 0.11
Kraj: Maribor

PrispevekObjavljeno: Čet Apr 28, 2011 12:08 am    Naslov sporočila:   Odgovori s citatom

TECHNIC je napisal/a:
Ob gradnji (build) mi javi, da je program velik 3726 bytov, veliko preveč za attiny13. Kaj delam narobe?


Nič, čist dober si. Tisti int bi res lahko bil unsigned char, ampak to nima tolikšne veze z tvojo napihnjenostjo. Absolutno pa vklopi "Release Build" oziroma optimizacije (gcc -O2). Sploh _delay_xx funkcije iz avr-libc so vezane na njih, saj če pogledaš so postavljene celo z floating-pointi (double), ampak jih optimizacija potem demolira v samo par ukazov brez plavajoče vejice, kar pa Debug Build ne naredi.

Jaz sem v takih primerih, če je res bil potreben Debug Build, zadevo rešil z funkcijo, ki je glede na konfiguracijo (Release ali Debug) uporabila _delay_xx funkcijo ali pa kar navadno zanko z nop(). S tem sem se rešil tudi omejitve največje zakasnitve funkcije.

Na hitro,

Koda:

void delay(unsigned int ms)
{
#if(defined(_DEBUG) || defined(DEBUG))

   unsigned int ms_ticks = (1000 / F_CPU);
   
   while(ms-- > 0)
   {
      for(unsigned int t = 0; t < ms_ticks; t++)
      {
         asm volatile("nop"::);
      }
   }

#else

   _delay_ms(ms);

#endif
}


Lahko da mrgoli kakšna napakica noter, nisem sprobal, moralo bi pa delati.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
davide
Član
Član



Pridružen-a: Pet 10 Sep 2010 16:45
Prispevkov: 149
Aktiv.: 0.90
Kraj: Savinjska

PrispevekObjavljeno: Čet Apr 28, 2011 4:32 pm    Naslov sporočila:   Odgovori s citatom

kaj res nihče še ni delal s tipko v codevision-u?
res bi prosil za to pomoč, nekako mi ne dela tako kot j treba...hm
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 Apr 29, 2011 6:10 am    Naslov sporočila:   Odgovori s citatom

@technic: Pred prevajanjem moraš v nastavitvah AVR studia vklopiti optimizacijo glede na velikost programa. Wink

Project - Configuration options, potem pa pri "optimization" izberi možnost "-Os"
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sob Apr 30, 2011 8:24 pm    Naslov sporočila:   Odgovori s citatom

Hvala vsem za odgovore!

Sem že uspel nagruntati timerje, tokrat ledica utripa s točno 1Hz Smile
Na forumu našel še par uporabnih zadev, kot so |=, ^=, &= ... pa tudi 1<<x. Tako da hvala za povezavo!

Imam pa vprašanje, ali vedno uporabljate timerje? Tudi za kakšne preproste zakasnitve (recimo nekaj us zaradi prevajanja med FETi v H-mostu)?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
logist
Član
Član



Pridružen-a: Pon 25 Jan 2010 1:12
Prispevkov: 126
Aktiv.: 0.73
Kraj: dom(o)vina

PrispevekObjavljeno: Pet Maj 06, 2011 10:31 pm    Naslov sporočila:   Odgovori s citatom

Mene pa zanima zakaj mi program noče globalne spremenljivki dodelit vrednost 0?
_________________
Mihael
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
RGorazd
Član
Član



Pridružen-a: Čet 20 Maj 2004 15:57
Prispevkov: 1712
Aktiv.: 7.71
Kraj: Ig

PrispevekObjavljeno: Pet Maj 06, 2011 11:13 pm    Naslov sporočila:   Odgovori s citatom

TECHNIC je napisal/a:
Hvala vsem za odgovore!

Sem že uspel nagruntati timerje, tokrat ledica utripa s točno 1Hz Smile
Na forumu našel še par uporabnih zadev, kot so |=, ^=, &= ... pa tudi 1<<x. Tako da hvala za povezavo!

Imam pa vprašanje, ali vedno uporabljate timerje? Tudi za kakšne preproste zakasnitve (recimo nekaj us zaradi prevajanja med FETi v H-mostu)?


Najenostavneje je za kratko pavzo napisati tako:

unsigned int pavza = 255;
While(pavza--){}

ali pa
for(pavza=0; pavza ==255;pavza++);

to sta samo dva primera, kako napraviti krajši delay.

Lahko uporabiš tudi nop ukaz ali pa nop();

LP G

_________________
.
._. _ _ ._. _.__. _|
[ (_](_)[ (_] /_(_]
._|
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
alen666
Član
Član



Pridružen-a: Ned 09 Maj 2010 20:00
Prispevkov: 16
Aktiv.: 0.09
Kraj: okolica Podčetrka

PrispevekObjavljeno: Sob Maj 28, 2011 6:39 pm    Naslov sporočila:  atmega8 Odgovori s citatom

Pozdravljeni!
Da ne odpiram nove teme, imam atmego8 in lpt programator-samo 5 žic.
Včeraj mi je zadevo uspelo usposobit, da sem programiral v bascomu na stk200 programator in zadeva je delovala.
Danes čip spozna, le sprogramirat ga noče- verifikacija ne uspe.
Kaj bi lahko bilo narobe?
hvala
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
RUros
Član
Član



Pridružen-a: Čet 09 Mar 2006 22:26
Prispevkov: 1030
Aktiv.: 4.69

PrispevekObjavljeno: Sob Maj 28, 2011 7:32 pm    Naslov sporočila:   Odgovori s citatom

Preveri še enkrat povezave s programatorjem, če so še vse v redu. Hkrati pa poglej kako je kaj s frekvenco oz. kristalom pri atmegi, da nisi kaj zaprogramiral in se zato s programatorjem ne moreta zmenit.

Drugače pa imam tudi sam en banalen problem, ki nevem kako naj ga čim bolj enostavno rešim.
Iz GPS modula dobivam string iz katerega izluščim uro po UTC času, se pravi moram čas prestaviti za 2 uri naprej da bo po naše. Kako naj to na najbolj enostaven način naredim da bo delovalo za vseh 24ur dneva ? Kako ste to rešili tisti, ki ste naleteli na takšen problem ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sob Jun 11, 2011 4:00 pm    Naslov sporočila:   Odgovori s citatom

Pozdrav!

Tale koda:
Koda:
k=1000;
while(k--){}

Mi v programu proti pričakovanju ne naredi povsem nič. Zdi se mi, da je prevajalnik od AvrStudia preveč pameten in pri vklopljeni optimizaciji Os enostavno zbriše to zanko. (zakaj?) Če pa optimizacijo izklopim(O0), mi iz 222b programa nastane 624b.
Za zakasnitev lahko še vedno uporabim notranji timer, vendar gre ta le do 255 (in ga hkrati v neki drugi funkciji potrebujem, da teče hitro, zato ne morem uporabit prescalerja). Pravzaprav me samo zanima, zakaj (in če se da spremenit) mi izbriše/ignorira while zanko (ki po njegovem mnenju ne naredi ničesar)?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
David2204
Član
Član



Pridružen-a: Pon 03 Nov 2008 0:01
Prispevkov: 997
Aktiv.: 5.32
Kraj: Ljubljana - Nova Gorica

PrispevekObjavljeno: Sob Jun 11, 2011 6:47 pm    Naslov sporočila:   Odgovori s citatom

Poskusi napisati:

int k = 1000;
while(k>0) k--;
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
chaos
Član
Član



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

PrispevekObjavljeno: Ned Jun 12, 2011 10:15 am    Naslov sporočila:   Odgovori s citatom

TECHNIC je napisal/a:
Pravzaprav me samo zanima, zakaj (in če se da spremenit) mi izbriše/ignorira while zanko (ki po njegovem mnenju ne naredi ničesar)?


Od prevajalnika si zahteval optimizacije, zakaj se čudiš, da je optimiziral tvojo kodo? Smile

Prevajalnik nima nobenega koncepta časa oz. trajanja. Poenostavljeno povedano, če vidi prirejanje vrednosti neki spremenljivki, ki se nikjer ne uporablja, ta del kode odstrani, skupaj s klici funkcij ipd.

Najbolj preprosto se da ta problem rešit tako, da spremenljivko deklariraš kot volatile (volatile int i). V tem primeru prevajalnik ne bo odstranil te kode.

volatile namreč prevajalniku pove, da a) spremenljivka lahko vpliva na stvari zunaj tega programa, in b) stvari zunaj tega programa lahko vplivajo na to spremenljivko. Kar v tem primeru sploh ni pomembno, važno je, da prevajalnik ne predpostavlja več, da je vrednost spremenljivke nepomembna, čeprav se njena vrednost v programu nikjer ne upošteva.

Mimogrede, v knjižnici (util/delay.h) imaš že napisane rutine za zakasnitve, zakaj jih ne uporabljaš?


LP!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Ned Jun 12, 2011 11:16 am    Naslov sporočila:   Odgovori s citatom

Ker so mi zgoraj svetovali uporabo timerjev, ampak za take "navadne" zakasnitve (kjer program res nič ne rabi delati) je verjetno najbolje klicati delay. Hvala!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
TECHNIC
Član
Član



Pridružen-a: Tor 31 Okt 2006 11:18
Prispevkov: 582
Aktiv.: 2.75
Kraj: Senovo

PrispevekObjavljeno: Sre Jun 22, 2011 2:42 pm    Naslov sporočila:   Odgovori s citatom

Tokrat se mi je zataknilo pri zbujanju iz spanja. Želim, da mi uC zbudi sprememba stanja na PORTB.2, zato najprej naredim tole:

Koda:
SREG |= (1<<7); //global interrupt enable
PCMSK |= (1<<PCINT2); //pin change PORTB.2
GIMSK |= (1<<PCIE); // pin change interrupt enable
MCUCR |= (1<<SM1); //sleep mode power-down


Potem pa v program dodam tole, kjer hočem, da gre uC v power-down.
Koda:
MCUCR |= (1<<SE); //sleep enable
sleep_cpu();
MCUCR &= ~(1<<SE); //sleep disable


V program imam seveda dodano knjižnico "avr/sleep.h"
Problem pa je, ker se program obnaša zelo čudno, uC nikoli ne izklopi motorja (PORTB.1), čeprav je ta ukaz malo nižje. Ali se pri vsaki spremembi PORTB.2 (trigger), program nekam usmeri in nikoli ne pride preko tega?

Tule je pa cel program:
Koda:
int main(void)
{
DDRB = 0b00000011;
PORTB |= 0b00001100;
TCCR0B |= ((1<<CS00) | (1<<CS02));

SREG |= (1<<7);
PCMSK |= (1<<PCINT2);
GIMSK |= (1<<PCIE);
MCUCR |= (1<<SM1);

int i;

while(1)
   {
   TCNT0 = 0;
   i = 0;

   while((PINB & (1<<Trigger))==0x04) //dokler je stikalo izklopljeno
      {
      if(TCNT0>250) {i++; TCNT0=0;}
      if(i>3)
         {
         PORTB &= ~(1<<Stop); //izklopi zavoro motorja
         MCUCR |= (1<<SE);
         sleep_cpu();
         MCUCR &= ~(1<<SE);
         }
      }
   PORTB &= ~(1<<Stop); //izklopi zavoro motorja

   _delay_ms(1);

   PWM_start(); //funkcija ki vklopi motor
   PORTB |= (1<<Start); //vklopi motor
   while((PINB & (1<<Trigger))==0){} //dokler je stikalo vklopljeno
   PORTB &= ~(1<<Start); //izklopi motor

   _delay_ms(1);

   PWM_brake(); //funkcija ki zavre motor
   PORTB |= (1<<Stop); //zavri motor

   _delay_ms(5);
   }
return 0;
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
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 ... 18, 19, 20 ... 27, 28, 29  Naslednja
Stran 19 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