|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
silvo_v Član
Pridružen-a: Pon 11 Jul 2005 22:00 Prispevkov: 146 Aktiv.: 0.65 Kraj: Domžale
|
Objavljeno: Čet Feb 07, 2008 3:34 pm Naslov sporočila: |
|
|
Seveda je potrebno za delay funkcijo povedati prevajalniku s kakšno frekvenco dela mikrokrmilnik, zato le popravi vrednost frekvence na 4M.
Sicer pa se je zakasnitev z uporabo delay funkcije dobro izogibati.
Lp |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Čet Feb 07, 2008 3:58 pm Naslov sporočila: |
|
|
Kako pa se drugače naredi zakasnitev? |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.31 Kraj: Medvode
|
Objavljeno: Čet Feb 07, 2008 4:19 pm Naslov sporočila: |
|
|
Z uporabo timerja, samo pri takšnih preprostoh primerih se to skoraj ne splača. Delay funkcija je napisana tako, da sama preračuna zakasnitev glede na nastavljeno vrednost kristala - preberi si malo komentarje v delay.h pa boš laže našel napako. _________________ It's electric! |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Čet Feb 07, 2008 9:27 pm Naslov sporočila: |
|
|
Sem gledal v datasheetu, pa nisem našel...kako pri ATMega8515 izračunamo koliko časa se poraba npr. pri enem povečanju zanke za vrednost 1? Je to mogoče kar t=1/Fosc, ali kako drugače? Pa še to, a ima kdo mogoče napisano kakšno zakasnitev s timerjem? |
|
Nazaj na vrh |
|
|
silvo_v Član
Pridružen-a: Pon 11 Jul 2005 22:00 Prispevkov: 146 Aktiv.: 0.65 Kraj: Domžale
|
Objavljeno: Pet Feb 08, 2008 1:55 pm Naslov sporočila: |
|
|
Domenius je napisal/a: |
Z uporabo timerja, samo pri takšnih preprostoh primerih se to skoraj ne splača. Delay funkcija je napisana tako, da sama preračuna zakasnitev glede na nastavljeno vrednost kristala - preberi si malo komentarje v delay.h pa boš laže našel napako. |
Strinjam se, da je v preprostih programih za zakasnitve najenostavneje uporabiti delay funkcijo. Če pa so zahteve programa, da lovi kakšne hitre spremembe na portih, je potrebno zakasnitve izvajati s pomočjo časovnikov.
Jaz to izvajam na takle način:
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;
}
}
}
|
Lp |
|
Nazaj na vrh |
|
|
dragoon Član
Pridružen-a: Čet 03 Maj 2007 21:51 Prispevkov: 452 Aktiv.: 2.18 Kraj: Trojane
|
Objavljeno: Pet Feb 08, 2008 2:36 pm Naslov sporočila: |
|
|
Codevision ima v wizardu možnost nastaviti I2C in pa 2Wire(I2C). Preedvideva, da sta protokola enaka oz zelo podobna in pa da je prvi (I2C) softerski. Imam prav? Pri tem, da ima 2Wire tudi možnost generiranja prekinitev. Kdaj se te prekinitve prožijo? Ko je bit poslan, prejet, ko pride start sekvenca?
I2C ima za pošiljanje napisane funkcije.
Če hočem poslat byte (integer?)preko 2Wire, ga vpišem v register (kater?), ko pa byte prileti po busu se avtomatsko shrani v register(kter?) in se proži interrupt? _________________ LP, Mitja |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Sre Feb 13, 2008 12:43 am Naslov sporočila: |
|
|
Zdravo!
Mene pa zanima, zakaj mi WinAVR javi napako pri takšnem zapisu:
Koda: |
../7segmentni.c:12: error: expected ';' before numeric constant |
Enako mi javi če uporabim naprimer PIND.x=y; Za probo sem omenjene zapise prevedel z CVAVR in so se prevedli brez problema...
Mogoče ve kdo, v čem je problem?
Hvala za odgovor! |
|
Nazaj na vrh |
|
|
VolkD Član
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 63.64 Kraj: Divača (Kačiče)
|
Objavljeno: Sre Feb 13, 2008 1:15 am Naslov sporočila: |
|
|
CodeVisionAVR govori drugačen dialekt jezika C. Obvlada bitne spremenljivke. WINAVR to ne zna. Sicer pa standarden C tega tudi nima.
CodeVisionAVR ima še cel kup drugih bombončkov, ki so dobri a z druge strani lahko slabi. Če se jih namreč naučiš uporabljati si na drugem prevajalniku hitro mrzel. _________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.02 Kraj: glej fogl
|
Objavljeno: Sre Feb 13, 2008 9:06 am Naslov sporočila: |
|
|
VolkD je napisal/a: |
CodeVisionAVR govori drugačen dialekt jezika C. Obvlada bitne spremenljivke. WINAVR to ne zna. |
V winavr gre to takole:
Koda: |
struct {
uint8_t bit1: 1;
uint8_t bit2: 1;
} bitfield;
|
|
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.31 Kraj: Medvode
|
Objavljeno: Sre Feb 13, 2008 3:31 pm Naslov sporočila: |
|
|
upornik je napisal/a: |
Zdravo!
Mene pa zanima, zakaj mi WinAVR javi napako pri takšnem zapisu:
Koda: |
../7segmentni.c:12: error: expected ';' before numeric constant |
Enako mi javi če uporabim naprimer PIND.x=y; Za probo sem omenjene zapise prevedel z CVAVR in so se prevedli brez problema...
Mogoče ve kdo, v čem je problem?
Hvala za odgovor! |
Naredi tako kot je v mojem primeru na prejšnji strani - z maskami. _________________ It's electric! |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Sre Feb 13, 2008 4:30 pm Naslov sporočila: |
|
|
Domenious, mi lahko prosim malo bolj razložiš kaj se dogaja pri maski?
Koda: |
// z masko postavi PC5 na 1
PORTC |= 0x20;
// z masko postavi PC5 na 0
PORTC &= ~0x20;
|
Hvala za odgovor! |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.31 Kraj: Medvode
|
Objavljeno: Sre Feb 13, 2008 5:57 pm Naslov sporočila: |
|
|
Khm, Domenius, ne Domenious.
Če hočeš spremeniti stanje celega porta pošlješ nanj nek bajt oz. 8 bitov. Tukaj ni nič problemov z maskami. MSB bit spremeni PORTX.7, LSB bit poslanega bajta pa PORTX.0. Če pa hočeš spremeniti stanje samo enega pina brez da bi vplival na ostale moraš uporabit maske.
PORTC |= 0x20; v bistvu pomeni PORTC = PORTC | 0x20;, samo da je krajše napisano. Ta operacija postavi nek bit (0x20 je peti bit, ker je 0x20 enako 32 - 2 na 5 potenco je tudi 32, od tod torej peti bit) na 1. Tista črta pomeni logično operacijo OR. In ker je 0 OR X = X in 1 OR X = 1 se postavi bit samo tam kjer je enica, ostali pini pa ostanejo v takšnem stanju kot so.
Enako je pri PORTC &= ~0x20; - to pomeni PORTC = PORTC & ~0x20;. Ta operacija postavi pin na 0. Znak & pomeni logično AND operacijo, znak ~ pa negacijo. Namesto ~0x20 bi lahko napisal tudi 0xDF, je čisto enako, samo takšen način z negacijo se meni zdi bolj pregleden. Ker je 0 AND X = 0 in 1 AND X = X se pin postavi na nič samo tam kjer je ničla v poslanem bajtu, kjer so pa enice se pa stanje ohrani (X). Za boljše razumevanje tega napiši par programčkov z maskami in brez in jih testiraj v simulatorju AVR Studia pa boš videl razliko.
Napačno krmiljenje porta: če boš na port poslal 00000010 brez maske se bo drugi pin postavil na 1, ostali pa na 0 - če boš pa na npr. četrtem pinu spremljal stanje pina (vhodni pin) in bo pred pošiljanjem bajta na port stanje vhodnega pina 1 se bo pojavila napaka - ne programska ampak pri odčitavanju vrednosti. _________________ It's electric! |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Čet Feb 14, 2008 3:29 pm Naslov sporočila: |
|
|
Se opravičujem za napačno napisano ime, sem dvakrat preveril, pa sem narobe napisal
Aha, malo sem poskusil tele maske v programčkih, približno zastopim...
Kako pa npr. testiramo en vhodni pin, če je npr. nanj priključena tipka.
V Cvavr, ki podpira bitne spremenljivke testiraš tako:
Koda: |
if(PIND.5==0)
{................} |
Kako pa potem takšno testiranje zgleda v Winavr? |
|
Nazaj na vrh |
|
|
Domenius Član
Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.31 Kraj: Medvode
|
Objavljeno: Čet Feb 14, 2008 4:45 pm Naslov sporočila: |
|
|
Lahko tako da prebereš bajt s porta in ga z ustreznimi maskami obdelaš tako, da se gleda samo določen bit - ostali so vedno 0 ali 1, odvisno od mask. Lahko pa tudi na lažji način.
Koda: |
if (bit_is_clear(PINB,1))
{
naredi nekaj;
}
|
Uporabiš lahko tudi bit_is_set(PINX, x), odvisno kako vežeš tipko. _________________ It's electric! |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.17 Kraj: Celje
|
Objavljeno: Čet Feb 14, 2008 5:43 pm Naslov sporočila: |
|
|
Predvidevam, da je ta "bit_is_clear(x,y)" neka že zapisana funkcija. Je zanjo v Winavr-ju potrebno vključiti katero dodatno knjižnico? |
|
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: 93 dni
Powered by phpBB © 2001, 2005 phpBB Group
|