 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Čet Mar 01, 2007 11:38 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Pet Mar 02, 2007 12:37 am Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Ned Mar 04, 2007 3:13 am Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.57
|
Objavljeno: Ned Mar 04, 2007 3:33 am Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Ned Mar 04, 2007 12:10 pm Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Pon Mar 26, 2007 11:43 pm Naslov sporočila: |
|
|
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 |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Tor Mar 27, 2007 9:56 am Naslov sporočila: |
|
|
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 |
|
 |
plutakis Neznanec

Pridružen-a: Sre 14 Mar 2007 10:07 Prispevkov: 9 Aktiv.: 0.04 Kraj: LJ
|
Objavljeno: Tor Mar 27, 2007 11:29 am Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Tor Mar 27, 2007 11:36 pm Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Sre Mar 28, 2007 7:05 pm Naslov sporočila: |
|
|
Se opravičujem za ta "zmazek" 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
Lp |
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Mar 29, 2007 11:39 pm Naslov sporočila: |
|
|
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 |
|
 |
trot Član


Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Pet Mar 30, 2007 7:59 am Naslov sporočila: |
|
|
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 |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Čet Avg 02, 2007 6:38 pm Naslov sporočila: |
|
|
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 |
|
 |
igor_k Član

Pridružen-a: Pon 19 Jul 2004 11:44 Prispevkov: 1011 Aktiv.: 4.27 Kraj: Rače
|
Objavljeno: Čet Avg 02, 2007 9:15 pm Naslov sporočila: |
|
|
Ne vem, zakaj ne. Meni delajo vsi trije hkrati, pa se nič ne pritožujejo drug čez drugega . |
|
Nazaj na vrh |
|
 |
dragoon Član


Pridružen-a: Čet 03 Maj 2007 21:51 Prispevkov: 452 Aktiv.: 2.05 Kraj: Trojane
|
Objavljeno: Čet Avg 02, 2007 10:37 pm Naslov sporočila: |
|
|
Lahko uporabiš tudi samo en timer za oboje. Le da ti frekvenca ustreza.
LP, Mitja |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|