www.elektronik.si
Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3, ... 27, 28, 29  Naslednja  :||:
www.elektronik.si -> Osnove programiranja AVR-jev

Avtor: silvo_vKraj: Domžale PrispevekObjavljeno: Č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

Avtor: upornikKraj: Celje PrispevekObjavljeno: Čet Feb 07, 2008 3:58 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Kako pa se drugače naredi zakasnitev?

Avtor: DomeniusKraj: Medvode PrispevekObjavljeno: Č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.

Avtor: upornikKraj: Celje PrispevekObjavljeno: Č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?

Avtor: silvo_vKraj: Domžale PrispevekObjavljeno: 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

Avtor: dragoonKraj: Trojane PrispevekObjavljeno: 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?

Avtor: upornikKraj: Celje PrispevekObjavljeno: Sre Feb 13, 2008 12:43 am    Naslov sporočila:  
----------------------------------------------------------------------------
Zdravo!

Mene pa zanima, zakaj mi WinAVR javi napako pri takšnem zapisu:
Koda:
PORTC.5=0;


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!

Avtor: VolkDKraj: Divača (Kačiče) PrispevekObjavljeno: 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.

Avtor: trotKraj: glej fogl PrispevekObjavljeno: 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;

Avtor: DomeniusKraj: Medvode PrispevekObjavljeno: 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:
PORTC.5=0;


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.

Avtor: upornikKraj: Celje PrispevekObjavljeno: 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!

Avtor: DomeniusKraj: Medvode PrispevekObjavljeno: 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.

Avtor: upornikKraj: Celje PrispevekObjavljeno: Č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 Confused
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?

Avtor: DomeniusKraj: Medvode PrispevekObjavljeno: Č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.

Avtor: upornikKraj: Celje PrispevekObjavljeno: Č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?

Stran 2 od 29

Powered by phpBB © 2001,2002 phpBB Group