|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sre Apr 27, 2011 8:09 pm Naslov sporočila: |
|
|
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 |
|
|
žrepko Član
Pridružen-a: Tor 23 Mar 2010 20:12 Prispevkov: 700 Aktiv.: 4.08 Kraj: Ptuj-Maribor
|
Objavljeno: Sre Apr 27, 2011 8:33 pm Naslov sporočila: |
|
|
Spremeni iz
na
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 |
|
|
teey Član
Pridružen-a: Pon 15 Sep 2008 20:51 Prispevkov: 21 Aktiv.: 0.11 Kraj: Maribor
|
Objavljeno: Čet Apr 28, 2011 12:08 am Naslov sporočila: |
|
|
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 |
|
|
davide Član
Pridružen-a: Pet 10 Sep 2010 16:45 Prispevkov: 149 Aktiv.: 0.90 Kraj: Savinjska
|
Objavljeno: Čet Apr 28, 2011 4:32 pm Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3356 Aktiv.: 16.97
|
Objavljeno: Pet Apr 29, 2011 6:10 am Naslov sporočila: |
|
|
@technic: Pred prevajanjem moraš v nastavitvah AVR studia vklopiti optimizacijo glede na velikost programa.
Project - Configuration options, potem pa pri "optimization" izberi možnost "-Os" |
|
Nazaj na vrh |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sob Apr 30, 2011 8:24 pm Naslov sporočila: |
|
|
Hvala vsem za odgovore!
Sem že uspel nagruntati timerje, tokrat ledica utripa s točno 1Hz
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 |
|
|
logist Član
Pridružen-a: Pon 25 Jan 2010 1:12 Prispevkov: 126 Aktiv.: 0.73 Kraj: dom(o)vina
|
Objavljeno: Pet Maj 06, 2011 10:31 pm Naslov sporočila: |
|
|
Mene pa zanima zakaj mi program noče globalne spremenljivki dodelit vrednost 0? _________________ Mihael |
|
Nazaj na vrh |
|
|
RGorazd Član
Pridružen-a: Čet 20 Maj 2004 15:57 Prispevkov: 1713 Aktiv.: 7.68 Kraj: Ig
|
Objavljeno: Pet Maj 06, 2011 11:13 pm Naslov sporočila: |
|
|
TECHNIC je napisal/a: |
Hvala vsem za odgovore!
Sem že uspel nagruntati timerje, tokrat ledica utripa s točno 1Hz
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 |
|
|
alen666 Član
Pridružen-a: Ned 09 Maj 2010 20:00 Prispevkov: 16 Aktiv.: 0.09 Kraj: okolica Podčetrka
|
Objavljeno: Sob Maj 28, 2011 6:39 pm Naslov sporočila: atmega8 |
|
|
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 |
|
|
RUros Član
Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1030 Aktiv.: 4.67
|
Objavljeno: Sob Maj 28, 2011 7:32 pm Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sob Jun 11, 2011 4:00 pm Naslov sporočila: |
|
|
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 |
|
|
David2204 Član
Pridružen-a: Pon 03 Nov 2008 0:01 Prispevkov: 997 Aktiv.: 5.29 Kraj: Ljubljana - Nova Gorica
|
Objavljeno: Sob Jun 11, 2011 6:47 pm Naslov sporočila: |
|
|
Poskusi napisati:
int k = 1000;
while(k>0) k--; |
|
Nazaj na vrh |
|
|
chaos Član
Pridružen-a: Sob 16 Sep 2006 22:12 Prispevkov: 1063 Aktiv.: 4.96 Kraj: Zagorje ob Savi
|
Objavljeno: Ned Jun 12, 2011 10:15 am Naslov sporočila: |
|
|
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?
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Ned Jun 12, 2011 11:16 am Naslov sporočila: |
|
|
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 |
|
|
TECHNIC Član
Pridružen-a: Tor 31 Okt 2006 11:18 Prispevkov: 582 Aktiv.: 2.73 Kraj: Senovo
|
Objavljeno: Sre Jun 22, 2011 2:42 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|