|
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.66 Kraj: Domžale
|
Objavljeno: Tor Jul 08, 2008 8:33 am Naslov sporočila: |
|
|
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 |
|
|
trot Član
Pridružen-a: Čet 18 Jan 2007 20:25 Prispevkov: 1270 Aktiv.: 6.07 Kraj: glej fogl
|
Objavljeno: Tor Jul 08, 2008 11:17 am Naslov sporočila: |
|
|
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 |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Tor Jul 08, 2008 1:33 pm Naslov sporočila: |
|
|
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
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
|
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.18 Kraj: Celje
|
Objavljeno: Tor Jul 08, 2008 3:46 pm Naslov sporočila: |
|
|
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
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Sre Jul 09, 2008 6:55 am Naslov sporočila: |
|
|
tudi to bom poizkusil narediti.
|
|
Nazaj na vrh |
|
|
PC_Master Član
Pridružen-a: Pon 17 Mar 2008 20:10 Prispevkov: 319 Aktiv.: 1.63 Kraj: Domžale , Blizu Ljubljane , Poštna 1230
|
Objavljeno: Sre Jul 09, 2008 9:12 pm Naslov sporočila: |
|
|
Pomoje lahko pri compilerju nastaviš velikost optimizacije. Samo baje če preveč optimiziraš program naj nebi deloval pravilno. Mislim optimizirat preko komande , ne ročno
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
Objavljeno: Čet Jul 10, 2008 1:43 pm Naslov sporočila: |
|
|
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 |
|
|
majkel Član
Pridružen-a: Sre 22 Avg 2007 15:45 Prispevkov: 84 Aktiv.: 0.42 Kraj: Maribor
|
Objavljeno: Ned Jul 13, 2008 3:32 pm Naslov sporočila: |
|
|
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 |
|
|
tadej.ko2 Član
Pridružen-a: Sre 17 Okt 2007 18:26 Prispevkov: 76 Aktiv.: 0.38 Kraj: sveta trojica
|
Objavljeno: Pet Avg 22, 2008 10:07 pm Naslov sporočila: vklop lučke |
|
|
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. 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
Opis: |
|
Download |
Ime datoteke: |
program_attini26.txt |
Velikost datoteke: |
8.17 KB |
Downloadano: |
39 krat |
|
|
Nazaj na vrh |
|
|
tejko Član
Pridružen-a: Pet 11 Feb 2005 12:57 Prispevkov: 108 Aktiv.: 0.49 Kraj: Pragersko
|
Objavljeno: Sob Avg 23, 2008 2:19 pm Naslov sporočila: |
|
|
Mogoče ti stack povozi spremenljivke, glede na to, da imaš 86% zasedenost flasha.
_________________ Vseh čarov čar, ELEKTRIČAR!! |
|
Nazaj na vrh |
|
|
tadej.ko2 Član
Pridružen-a: Sre 17 Okt 2007 18:26 Prispevkov: 76 Aktiv.: 0.38 Kraj: sveta trojica
|
Objavljeno: Sob Avg 23, 2008 4:14 pm Naslov sporočila: |
|
|
mislim da je težave povzročal overflow spremenljivke mcasc. tip sem mu spremenil na short in zadeva deluje perfektno.
|
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.18 Kraj: Celje
|
Objavljeno: Ned Avg 24, 2008 12:56 pm Naslov sporočila: |
|
|
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 |
|
|
VolkD Član
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 64.07 Kraj: Divača (Kačiče)
|
Objavljeno: Ned Avg 24, 2008 1:41 pm Naslov sporočila: |
|
|
/ 256
%256
_________________ Dokler bodo ljudje mislili, da živali ne čutijo, bodo živali čutile, da ljudje ne mislijo. |
|
Nazaj na vrh |
|
|
upornik Član
Pridružen-a: Ned 09 Jan 2005 22:35 Prispevkov: 261 Aktiv.: 1.18 Kraj: Celje
|
Objavljeno: Ned Avg 24, 2008 1:53 pm Naslov sporočila: |
|
|
Se pravi, takole? MSB=podatek/256;
LSB=podatek%256;
Hvala, sploh nisem pomislil da se tako naredi
|
|
Nazaj na vrh |
|
|
lojzek Član
Pridružen-a: Pet 25 Jan 2008 8:00 Prispevkov: 3352 Aktiv.: 17.02
|
|
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: 48 dni
Powered by phpBB © 2001, 2005 phpBB Group
|