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 ... 6, 7, 8 ... 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: Tor Jul 08, 2008 8:33 am    Naslov sporočila:   Odgovori s citatom

Ta koda je bila napisana za ATmega8515, ki ima samo en TCCR0 register. Novejši AVR mikrokrmilniki imajo po dva TCCR0 registra. Sicer pa na napačno ime registra opozori že prevajalnik pri prevajanju programa.

Pri prenašanju rutin in programov med različnimi mikrokrmilniki družine AVR je potrebno biti pozoren tudi na to, da so lahko med seboj pomešane tudi lokacije posameznih bitov v registrih.

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



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

PrispevekObjavljeno: Tor Jul 08, 2008 11:17 am    Naslov sporočila:   Odgovori s citatom

lojzek je napisal/a:
Zakaj pa sta dva registra, pa še nisem ugotovil.

Poglej v datasheet od tega mikrokontrolerja, pa boš videl koliko registrov ima in za kaj je kateri.

_________________
lp, Klemen
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Tor Jul 08, 2008 1:33 pm    Naslov sporočila:   Odgovori s citatom

Z vašo pomočjo, in s pomočjo primerov v tej temi,predvsem pa z idejo izpisovanja številk od silvo_v, sem izdelal prvi dokaj uporaben programček: URA Smile

S silvotovim algoritmom je dovolj majhen, da pride v tinnyja (ni potrebe po sprintf funkciji, ki je preobširna za tinyja).

Koda:
/* ŠTOPARICA - ura
   TIPKA - priklop na pinD1 - proti masi
   LED - priklop na pinA0 - proti masi ali +
   LCD - na portB - kot v nadaljevanju (spremeniš lahko v lcd_lib.h)
      LCD_RS   0    //define MCU pin connected to LCD RS
      LCD_RW   1    //define MCU pin connected to LCD R/W
      LCD_E   2   //define MCU pin connected to LCD E
      LCD_D4   4   //define MCU pin connected to LCD D3
      LCD_D5   5   //define MCU pin connected to LCD D4
      LCD_D6   6   //define MCU pin connected to LCD D5
      LCD_D7   7   //define MCU pin connected to LCD D6
      LDP PORTB   //define MCU port connected to LCD data pins
      LCP PORTB   //define MCU port connected to LCD control pins
      LDDR DDRB   //define MCU direction register for port connected to LCD data pins
      LCDR DDRB   //define MCU direction register for port connected to LCD control pins

PROGRAM KAŽE URO
*/

#include <avr\io.h>
#include <util\lcd_lib.c>
#include <avr/interrupt.h>

//DEKLARACIJA SPREMENLJIVK
volatile unsigned char ure;
volatile unsigned char minute; //short za >255, char za <255
volatile unsigned char sekunde;
volatile unsigned char takt;
volatile unsigned char izpis;
volatile unsigned char val, e, d;


int main (void)
{
// NASTAVITEV TIMERJA 0
TIMSK = 0x02;    //maska
TCNT0 = 13;      //začetno stanje števca (ko prekorači 255- prekinitev)
TCCR0B = 0x05;   // deljenje z 1024


//definicija vhodov in izhodov
 DDRA = 0x03; //pinA0 in A1 je izhod
 DDRD = 0x00;  //PortD so vhodi
 PORTD = 0x03; //pina d0 in D1 imata vklopljen pullup upor
 DDRB = 0xFF; //PortB je izhod (na njem je LCD- ali je potrebno?)

//inicializacija LCD
LCDinit ();
LCDclr ();
LCDcursorOFF();

sei();    // omogočanje prekinitev

while (1)
{
   
   if (takt == 4)   // če je pretekla ~1s,
      {         //potem:
      takt = 0;   //takt postavi nazaj na 0
      ++sekunde;   // povečaj števec sekund
      izpis = 1;   //omogoči izpis na ekran
      
      if (sekunde == 60)
         {
         sekunde = 0;
         ++minute;
         }
      if (minute == 60)
         {
         minute = 0;
         ++ure;
         }
      if (ure == 24)
         ure = 0;
      }
   if (izpis == 1)   // če je omogočen izpis
   {            //potem:
   cli();         //onemogoči prekinitve
   izpis = 0;      //zbriši zastavico za omogočanje izpisa
   LCDGotoXY(4,0);   //postavi se na pozicijo
   
   //IZRAČUN IN IZPIS UR
   val = ure;      //
   izracun ();
   LCDsendChar (d+48); //d- desetice : 48 predstavlja ASCII znak 0
   LCDsendChar (e+48);   //e- enice
   LCDstring (":", 1);   //dvopičje
   
   //IZRAČUN IN IZPIS MINUT
   val = minute;
   izracun ();
   LCDsendChar (d+48);
   LCDsendChar (e+48);
   LCDstring (":", 1);
   
   //IZRAČUN IN IZPIS SEKUND
   val = sekunde;
   izracun();
   LCDsendChar (d+48);
   LCDsendChar (e+48);
   sei();            //ponovno omogoči prekinitve
   }
}
}
//FUNKCIJA IZRAČUNAVANJA CIFER
void izracun()
   {
   e=val/10;   //enice
   e=e*10;
   e=val-e;

   val=val/10;   //desetice
   d=val/10;
   d=d*10;
   d=val-d;
   }



// FUNKCIJA OB PREKINITVI
SIGNAL(SIG_OVERFLOW0)

   {
   TCNT0 = 13;         //osnovno stanje števca
   ++takt;            //takt povečaj
   if (takt == 2 || takt == 4)   // če je 0.5s ali 1s naokoli-
      PORTA ^= 0x01;   // Hartbeat LED na PORTA.0 se obdela z XOR (ali pa negacijo)
   }


Za izpis na LCD uporabljam knjižnico, ki sem jo našel na netu (nekje v tej temi sem že povedal, kje se jo da dobiti)
Točnost ure sicer ni 100% - bistvo je bilo v postopku
program je tudi namenoma bolj obširen- tako da je lažje razumljiv. Zasede pa cca 1100bytov.

Naslednji korak je optimizacija- manjšanje programa

Uporabljen Attiny in Winavr. Tiny deluje z osnovno interno frekvenco

edit: šele sedaj vidim, da je programčič kar dolg Shocked
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: Tor Jul 08, 2008 3:46 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Naslednji korak je optimizacija- manjšanje programa


Še korak dalje bi lahko bila funkcija, s katero nastaviš čas, ki je nepogrešljiva pri uri za vsakdanjo uporabo.

Veselo programiranje Very Happy
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Sre Jul 09, 2008 6:55 am    Naslov sporočila:   Odgovori s citatom

Very Happy tudi to bom poizkusil narediti.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
PC_Master
Član
Član



Pridružen-a: Pon 17 Mar 2008 20:10
Prispevkov: 319
Aktiv.: 1.63
Kraj: Domžale , Blizu Ljubljane , Poštna 1230

PrispevekObjavljeno: Sre Jul 09, 2008 9:12 pm    Naslov sporočila:   Odgovori s citatom

Pomoje lahko pri compilerju nastaviš velikost optimizacije. Samo baje če preveč optimiziraš program naj nebi deloval pravilno. Mislim optimizirat preko komande , ne ročno Wink
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Čet Jul 10, 2008 1:43 pm    Naslov sporočila:   Odgovori s citatom

PC_Master, to vem! Itak sem imel vključeno optimizacijo glede na velikost prevedene kode.
Mislil sem na optimizacijo programa- krajšanje. Tako sem zmanjšal program iz 1098bytov in 14 spremenljivk na 938 bytov in (mislim da) 5 spremenljivk. Ob popolnoma enaki končni funkciji programa.

Trenutno - ko imam čas - program nadgrajujem z nastavitvijo ure preko ene tipke. Ni tako lahko, kot sem mislil.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
majkel
Član
Član



Pridružen-a: Sre 22 Avg 2007 15:45
Prispevkov: 84
Aktiv.: 0.42
Kraj: Maribor

PrispevekObjavljeno: Ned Jul 13, 2008 3:32 pm    Naslov sporočila:   Odgovori s citatom

Imam problem z prevajalnikom codevison.In sicer mi vrže napako ker ne najde knjižnice interrupt.h.V programu jo imam definirano tako :
#include "interrupt.h" ali pa če dam tako #include <avr/interrupt.h> mi napiše da ne more odpret tega fajla ki ga imam vključenega .prosim eč mi da lahko kdo nasvet.

LP
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tadej.ko2
Član
Član



Pridružen-a: Sre 17 Okt 2007 18:26
Prispevkov: 76
Aktiv.: 0.38
Kraj: sveta trojica

PrispevekObjavljeno: Pet Avg 22, 2008 10:07 pm    Naslov sporočila:  vklop lučke Odgovori s citatom

moja zgodba pa je taka:
spisal sem program, ki bi vsakih 24 ali 48 ur vključil led (mogoče bo to 11kw motor).
program je že skoraj real-time aplikacija. hardware: attiny 26, 2tipki (tp in tm), 2x7seg led, led kot motor (M), quarc 4MHz, 2 tranzistorja za 2x7seg ledice
deluje tako: na ledicah je izpisano število ur do naslednjega vklopa M, številka pa utripa, dokler ne pritisneš katere tipke. če tp("tipka plus") držiš več kot 1s, se vključi/izkluči M;če samo pritisneš tp/tm("tipka minus"), se ura, izpisana na 7seg ledicah, poveča/pomanša za 1.
imam še meni: če držiš tm, začnejo ledice utirpati, izpiše se interval vklopa(24/48 ). nastaviš ga s pritiskanjem na tp. naslednji pritisk na tm izpiše dolžino vklopljenega izhoda M (v minutah, recimo 4.2 - prižge se še pikica); ta čas nastavimo s pritiskanjem na tp/tm. nato sledi še 1s pritisk na tm in pridemo iz "menija", izpiše se število ur do naslednjega vklopa M.

koda: //prestavil sem jo v datoteko, ker je dolga 3 kilometre

sedaj pa problem: spremenljivka mcasc, ki hrani dolžino prišganega izhoda (M) se mi sama spreminja. Confused ko grem v mani, da bi jo nastavil, je velikokrat kar 0.0, kar se ob prtisku katere koli tipke takoj spremeni na 0.1, ker imam pogoje: if(mcasc < 1) mcasc =1; in if(mcasc>99) mcasc =99;
bi lahko kdo našel, kaj zavraga mi spreminja to spremenljivko? so mogoče vrstice kode predolge za ta mali čipek? koda zasede: Program size: 878 words (85,7% of FLASH)

hvala vsem!
lp



program_attini26.txt
 Opis:
to je celoten post

Download
 Ime datoteke:  program_attini26.txt
 Velikost datoteke:  8.17 KB
 Downloadano:  39 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
tejko
Član
Član



Pridružen-a: Pet 11 Feb 2005 12:57
Prispevkov: 108
Aktiv.: 0.49
Kraj: Pragersko

PrispevekObjavljeno: Sob Avg 23, 2008 2:19 pm    Naslov sporočila:   Odgovori s citatom

Mogoče ti stack povozi spremenljivke, glede na to, da imaš 86% zasedenost flasha.
_________________
Vseh čarov čar, ELEKTRIČAR!!
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tadej.ko2
Član
Član



Pridružen-a: Sre 17 Okt 2007 18:26
Prispevkov: 76
Aktiv.: 0.38
Kraj: sveta trojica

PrispevekObjavljeno: Sob Avg 23, 2008 4:14 pm    Naslov sporočila:   Odgovori s citatom

mislim da je težave povzročal overflow spremenljivke mcasc. tip sem mu spremenil na short in zadeva deluje perfektno.
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: Ned Avg 24, 2008 12:56 pm    Naslov sporočila:   Odgovori s citatom

A ma kdo mogoče napisano kakšno funkcijo, ki iz 16-bitnega podatka naredi dva 8-bitna(MSB,LSB)? Potreboval bi jo zato, ker lahko oddajnik naenkrat pošlje samo 1byte, podatki ki jih pošiljam so pa 2bytni.

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.07
Kraj: Divača (Kačiče)

PrispevekObjavljeno: Ned Avg 24, 2008 1:41 pm    Naslov sporočila:   Odgovori s citatom

/ 256
%256

_________________
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
upornik
Član
Član



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

PrispevekObjavljeno: Ned Avg 24, 2008 1:53 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
/ 256
%256


Se pravi, takole? MSB=podatek/256;
LSB=podatek%256;

Hvala, sploh nisem pomislil da se tako naredi Very Happy
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
lojzek
Član
Član



Pridružen-a: Pet 25 Jan 2008 8:00
Prispevkov: 3352
Aktiv.: 17.02

PrispevekObjavljeno: Pet Avg 29, 2008 11:29 am    Naslov sporočila:   Odgovori s citatom

Very Happy Po dopoustu in obilici dela doma in v službi sem se zopet lotil mojega testnega programčka URA. Dodal sem možnost nastavljanja časa. Vse se dela z eno tipko.
Napisano v WINAVR za Tinyja 2313. Velikost 1356 bytov in 31bytov spremenljivk.
Veliko možnosti optimizacije kode, še posebno na področju uporabe spremenljivk.


Še eno stvar pa bi rad poizkusil. Najlaže kar v tem programu. Kako lahko eno od spremenljivk (kalibracija) shranim v EEPROM? Ob vklopu napravice bi jo potem prebral in uporabil v programu ter ob morebitni ponastavitvi zopet zapisal v EEPROM?

Ko bom še to poizkusil, bom pa v testno ploščo vtaknil Mego. Ker se bom lotil resnega izdelka, kjer bom potreboval AD pretvornike.

V prilogi txt verzija programa



Ura.txt
 Opis:
Program

Download
 Ime datoteke:  Ura.txt
 Velikost datoteke:  5.09 KB
 Downloadano:  29 krat

Nazaj na vrh
Odsoten 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 ... 6, 7, 8 ... 27, 28, 29  Naslednja
Stran 7 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: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group