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 

Začetniški problem v C-ju pri AVR-ju
Pojdi na stran Prejšnja  1, 2, 3, ... 27, 28, 29  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
silvo_v
Član
Član



Pridružen-a: Pon 11 Jul 2005 22:00
Prispevkov: 146
Aktiv.: 0.66
Kraj: Domžale

PrispevekObjavljeno: Čet Feb 07, 2008 3:34 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Čet Feb 07, 2008 3:58 pm    Naslov sporočila:   Odgovori s citatom

Kako pa se drugače naredi zakasnitev?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.35
Kraj: Medvode

PrispevekObjavljeno: Čet Feb 07, 2008 4:19 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Čet Feb 07, 2008 9:27 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
silvo_v
Član
Član



Pridružen-a: Pon 11 Jul 2005 22:00
Prispevkov: 146
Aktiv.: 0.66
Kraj: Domžale

PrispevekObjavljeno: Pet Feb 08, 2008 1:55 pm    Naslov sporočila:   Odgovori s citatom

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
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.20
Kraj: Trojane

PrispevekObjavljeno: Pet Feb 08, 2008 2:36 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Sre Feb 13, 2008 12:43 am    Naslov sporočila:   Odgovori s citatom

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!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
VolkD
Član
Član



Pridružen-a: Pet 24 Sep 2004 21:58
Prispevkov: 14228
Aktiv.: 64.08
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Sre Feb 13, 2008 1:15 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
trot
Član
Član



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

PrispevekObjavljeno: Sre Feb 13, 2008 9:06 am    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.35
Kraj: Medvode

PrispevekObjavljeno: Sre Feb 13, 2008 3:31 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
It's electric!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Sre Feb 13, 2008 4:30 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.35
Kraj: Medvode

PrispevekObjavljeno: Sre Feb 13, 2008 5:57 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Čet Feb 14, 2008 3:29 pm    Naslov sporočila:   Odgovori s citatom

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?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Domenius
Član
Član



Pridružen-a: Sre 30 Nov 2005 14:15
Prispevkov: 1188
Aktiv.: 5.35
Kraj: Medvode

PrispevekObjavljeno: Čet Feb 14, 2008 4:45 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
upornik
Član
Član



Pridružen-a: Ned 09 Jan 2005 22:35
Prispevkov: 261
Aktiv.: 1.18
Kraj: Celje

PrispevekObjavljeno: Čet Feb 14, 2008 5:43 pm    Naslov sporočila:   Odgovori s citatom

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
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3, ... 27, 28, 29  Naslednja
Stran 2 od 29

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


Powered by phpBB © 2001, 2005 phpBB Group