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 

ATMega16 in c
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> AVR, LPC900, x51
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Čet Mar 01, 2007 11:38 pm    Naslov sporočila:   Odgovori s citatom

Po prvi izvršitvi kode nastavi zastavico na '1'.
Pred izvršitvijo kode preveri zastavico. Če je zastavica '0', jo izvedeš, sicer ne.
Ko tipko izpustiš, se po nekem "delay-u" zastavica pobriše in čaka naslednji pritisk na tipko.
LP,
Igor

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Pet Mar 02, 2007 12:37 am    Naslov sporočila:   Odgovori s citatom

Predvidevam, da je on spremenljivka. Ce je vhod recimo (izmisljeno ime; prilagodi za svojo situacijo) P0.1, potem naredi takole:

Koda:

on = 0; oz. pac stanje, ko tipka ni pritisnjena

while (zanka, v kateri tece tvoj program)
{
if ((on) && !(P0.1)) printf("hello :)\n\r");
on = P0.1;
}


Ce tipka ne poskakuje, se bo vrstica izpisala samo enkrat. Ce tipka poskakuje, potem uporabi SW ali HW debounce.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Ned Mar 04, 2007 3:13 am    Naslov sporočila:   Odgovori s citatom

Sem rešil problem z tipko. Objavljam kodo, mogoče komu pride prav. Če pa ima kdo kakšno optimizacijo pa bi se priporočal. Tukej je "on" definiran kot pin mikrokontrolerja.
Koda:
if(on){
        while (on)
                {
                #asm
                nop
                #endasm
                };
        delay_ms(50);
        printf("hello agin :)\n\r");       
        }

Imam pa še eno težavo oz. željo dodat v program. Pa bom kar sem napisal da ne odpiram nove teme. Zanima me kako deluje UART interrupt. Je že kdo kaj delal s tem? Torej rad bi samo da program skoči na neko funkcijo ko sprejme nek podatek. Meni nekak ne uspeva nič na tem. Delam z CVAVR in program generira neko kodo za ta interrupt ampak nevem kam bi naj jaz vstavil svojo kodo ki bi se izvedla ob prekinitvi. Dodajam prekinitveno funkcijo, ki jo generira program.
Koda:
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}
Prosim če mi kdo pove kako deluje ta prekinivev, ker imam občutek da ni niti malo podobna ostalim.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Ned Mar 04, 2007 3:33 am    Naslov sporočila:   Odgovori s citatom

Deluje povsem normalno - sprozi jo eksterni stimulus (zastavica, da je prejet nov znak) in ko pride do prekinitve, naredi tocno to, kar pise da naredi (spravi en znak v buffer, preveri ce pride do overflowa bufferja in postavi zastavico, ce je temu tako). Kaj bi pa rad da naredi ?
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Ned Mar 04, 2007 12:10 pm    Naslov sporočila:   Odgovori s citatom

To zdaj nekak razumem. Nevem pa kam naj postavim funkcijo oz od kod jo naj kličem, za katero bi rad da se izvede ob prekinitvi. Imam funkcijo za prepoznavo znakov (realizirano z case, switch) ki bi jih računalnik pošiljal do AVR-a in bi se naj ob določenem znaku klicala določena funkcija.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Pon Mar 26, 2007 11:43 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni!
Spet se jaz oglašam in imam eno vprašanje glede programiranja v c. Recimo imam nek 8b register ki bi mu rad določil stanja zadnjih treh bitov ne glede na ostala stanja. Ali pa 6,5 in 3 bita ter kako bi 2 dita postavil [slovenščina je zame španska vas] pa pobrisal. Kako naj to izvedem? Do sedaj sem to reševal na tak način da sem vsak bit posebej zapisal, zdaj pa bi rad da bi se zapisali vsi naenkrat.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.72
Kraj: glej fogl

PrispevekObjavljeno: Tor Mar 27, 2007 9:56 am    Naslov sporočila:   Odgovori s citatom

Za take zadeve uporabiš logično operaciji AND in OR. Z operacijo OR posrtavljaš določene bite na 1, z operacijo AND pa na 0.

Če hočeš npr. zadnja dva bita postavit na 1, tretjega pa na 0, ostale pa pustit takšni kot so, narediš to tako:

register=register|0b00000011;
register=register&0b11111011;
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
plutakis
Neznanec
Neznanec



Pridružen-a: Sre 14 Mar 2007 10:07
Prispevkov: 9
Aktiv.: 0.04
Kraj: LJ

PrispevekObjavljeno: Tor Mar 27, 2007 11:29 am    Naslov sporočila:   Odgovori s citatom

tocno tako kot je povedal trot.

Dodal bi samo, da se v Cju to ponavadi dela z makroji, zato da se biti maskirajo. dobra praksa programiranja je ta, da nekdo, ki bere kodo za tabo ve kaj si naredil. ali pa da sam veš kaj si naredil po letu dni....

torej, recimo da bi v registru rad vklopil zastavico za prekinitve (5 bit):

#define ENABLE_INTERUPT 0x10 /*00010000 binarno*/


register |= ENABLE_INTERUPT; /*nastavis 5 bit ostale pustis pri miru*/


lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Tor Mar 27, 2007 11:36 pm    Naslov sporočila:   Odgovori s citatom

Spet imam problem. Kaj je težava v tej kodi??

Koda:
#define timer_delilnik 0x03


interrupt [EXT_INT1] void ext_int1_isr(void)
{
busy=1;
sprejem();
busy=0;
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCCR1B&=!timer_delilnik;                        //ustavi uro timerja
led_rx=0;
}

void sprejem(){

while (read_adc(0)<128)                           //čakaj na signal
                {
                led_sprejem=PINB.0;           
                };
led_rx=1;
TCCR1B|=timer_delilnik;           //start timer1, delilnik /64
}


To je samo izsek kode in že tukaj so problemi ampak sploh nevem kaj je narobe. Tipko za sprejem imam vezano na interupt1. Ko jo stisnem zasveti led dioda "busy" ter čakam na signal in ko je dovolj močan (RSSI) se starta timer. Vklopljen je tudi interupt za timer1 overflow in ko pride do njega se ustavi timer1 in izklopi obe ledici. Ampak ko se ta procedura nekajkrat zaporedoma izvede (včasih že v prvem poskusu) vse skupaj zašteka in ne pride do timer1 overflow-a. Program v osnovi dela ampak ne vedno. V čem je problem? Prevajalnik ne javi ničesar in tudi jaz ne opazim nič takega kar bi lahko bilo narobe. Gre se pa za mega88 ampak mislim da sta z mega16 (in še z katerim AVR)zelo podobna.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Sre Mar 28, 2007 7:05 pm    Naslov sporočila:   Odgovori s citatom

Se opravičujem za ta "zmazek" Smile Sem ugotovil kaj je bilo narobe. Pozabil sem, da je na interruptu tudi treba paziti na debounce efekt. Sem bil nekak prepričan, da tega ne rabim. Pa tudi na začetno nastavitev timerja1 sem pozabil pa se je po vsem tem AVRu malo zmešalo Very Happy

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Čet Mar 29, 2007 11:39 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni!

Zanima me če ima c (cvavr) kakšne funkcije za zapis iz enega 16b na dva 8b ali pa obratno, oz. če jih nima kako bi to naredil na najhtrejši način.

Lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
trot
Član
Član



Pridružen-a: Čet 18 Jan 2007 20:25
Prispevkov: 1282
Aktiv.: 5.72
Kraj: glej fogl

PrispevekObjavljeno: Pet Mar 30, 2007 7:59 am    Naslov sporočila:   Odgovori s citatom

To ti naredi že prevajalnik, ko definiraš neko spremenljivko kot int16.

Drgače pa nekaj takega:

uint8_t HInt16(uint16_t a)
{
a>>=8;
return a;
}


uint8_t LInt16(uint16_t a)
{
return a;
}


uint16_t HLtoInt16(uint16_t H, uint16_t L)
{
H<<=8;
return H|L;
}
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
madzi
Član
Član



Pridružen-a: Sre 24 Sep 2003 10:46
Prispevkov: 315
Aktiv.: 1.33
Kraj: Pragersko, Dragonja vas, Maribor

PrispevekObjavljeno: Čet Avg 02, 2007 6:38 pm    Naslov sporočila:   Odgovori s citatom

Pozdravljeni!

Spet imam eno vprašanje. SIcer ni programersko ampak če en zamerite si bom sposodil to temo.
Načrtujem neko vezje z mega16 in me zanima če lahko obenem uporabljam timer0 kot PWM za regulacijo osvetlitve LCD-ja in timer1. Slednji bo uporabljen kot "zapisovalnik" dogodkov. Zanima me samo če lahko 2 timerja delujeta istočasno brez kakšnih motenj in prekinitev med njima da nebom naredil tiska in vse zlotal nanj pol pa nebo delovalo. Bo drugač treba uporabit kakšno drugo rešitev.

Lep pozdrav
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
igor_k
Član
Član



Pridružen-a: Pon 19 Jul 2004 11:44
Prispevkov: 1011
Aktiv.: 4.27
Kraj: Rače

PrispevekObjavljeno: Čet Avg 02, 2007 9:15 pm    Naslov sporočila: icon_note  Odgovori s citatom

Ne vem, zakaj ne. Meni delajo vsi trije hkrati, pa se nič ne pritožujejo drug čez drugega Rolling Eyes .
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dragoon
Član
Član



Pridružen-a: Čet 03 Maj 2007 21:51
Prispevkov: 452
Aktiv.: 2.05
Kraj: Trojane

PrispevekObjavljeno: Čet Avg 02, 2007 10:37 pm    Naslov sporočila:   Odgovori s citatom

Lahko uporabiš tudi samo en timer za oboje. Le da ti frekvenca ustreza.


LP, Mitja
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 -> AVR, LPC900, x51 Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3  Naslednja
Stran 2 od 3

 
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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group