 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Sob Jan 27, 2007 12:04 am Naslov sporočila: Timingi v c |
|
|
Spisal sem kratek program. Sicer program dela vredu ampak imam težavo da je izhodni podatek krajši od vhodnega. Zdaj pa me zanima kako bi to lahko popravil ker niti nevem kaj bi lahko storil.
Koda: |
/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.5 Standard
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project :
Version :
Date : 24.1.2007
Author : madzi
Company : none
Comments:
Chip type : ATmega88
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/
#include <mega88.h>
#include <avr035.h>
#include <delay.h>
#define delay_rtx 15
unsigned char data[500];
unsigned int a;
unsigned char b;
void inicializacija(void){
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x07;
// Port C initialization
// Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=0 State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x20;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
}
void oddajanje(){
for(a=0;a<500;a++){
for(b=0;b<8;b++){
delay_us(delay_rtx);
delay_us(2) ;
PORTC.5=bit_get(data[a],b); //pošlji na oddajnik
PORTB.0=bit_get(data[a],b); //pošlji na led
}
}
PORTC.5=0;
PORTB.0=0;
}
void sprejem(){
for(a=0;a<500;a++){
for(b=0;b<8;b++){
delay_us(delay_rtx);
if(PIND.3){
bit_set(data[a],b);
}
else{
bit_clear(data[a],b);
}
PORTB.2=PIND.3;
}
}
}
void main(void){
inicializacija();
PORTC.5=0;
PORTB.1=1;
do{
PORTB.2=PIND.3;
switch (PINC){
case 4:
sprejem();
break;
case 8:
oddajanje();
break;
}
}
while (1);
}
|
Prosim če bi kdo malo pogledal in mi kaj svetoval
Lp
|
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
Objavljeno: Ned Jan 28, 2007 6:22 pm Naslov sporočila: |
|
|
Res noben neve kako naj popravim funkciji oddajanje in sprejem da bosta za zapis in branje porabili enak čas?
Poskušal sem z delayi ampak mi nekak ne uspe.
LP
|
|
Nazaj na vrh |
|
 |
Domenius Član



Pridružen-a: Sre 30 Nov 2005 14:15 Prispevkov: 1188 Aktiv.: 5.01 Kraj: Medvode
|
Objavljeno: Ned Jan 28, 2007 6:27 pm Naslov sporočila: |
|
|
Če se da, v programu poglej koliko časa trajata obe zanki. Drugače pa poglej koliko ciklov traja vsaka - kar je v bistvu isto. Potem pa krajši dodaj toliko delay-a, da se bo izvajala enako dolgo kot daljša.
_________________ It's electric! |
|
Nazaj na vrh |
|
 |
VolkD Član


 
Pridružen-a: Pet 24 Sep 2004 21:58 Prispevkov: 14228 Aktiv.: 60.06 Kraj: Divača (Kačiče)
|
Objavljeno: Pon Jan 29, 2007 1:09 am Naslov sporočila: |
|
|
madzi, preglej listo prevajanja. Tam boš videl assemblersko kodo. Vse dele, ki so različni med seboj primerjaj glede na porabljeno število ciklov. Koliko ciklov porabi katera instrukcija boš našel v AVR Instruction manual. Ko ugotoviš razliko ciklov, dodaj v rutino, ki ima manj ciklov preprost assemblerski ukaz "nop" za vsak cikel.
To narediš z:
asm("nop");
Če je razlika v ciklih zelo velika si lahko pomagaš tudi z dodajanjem C kode kot je "i++" v to rutino. Le razliko dodane C kode ki še ostane popolniš z "nop".
Upam, da si razumel kaj sem ti hotel povedati.
_________________ 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: 1282 Aktiv.: 5.72 Kraj: glej fogl
|
Objavljeno: Pon Jan 29, 2007 9:08 am Naslov sporočila: |
|
|
Lahko pa zadevo simuliraš z AVR studio 4, kjer ti točno kaže koliko instrukcij je uC izvedel in koliko časa je za to porabil (in vse ostalo). Program je zaston in ga dobiš na atmelovi strani.
|
|
Nazaj na vrh |
|
 |
madzi Član

Pridružen-a: Sre 24 Sep 2003 10:46 Prispevkov: 315 Aktiv.: 1.33 Kraj: Pragersko, Dragonja vas, Maribor
|
|
Nazaj na vrh |
|
 |
cfrik Član


Pridružen-a: Sre 24 Jan 2007 16:15 Prispevkov: 39 Aktiv.: 0.17 Kraj: Trbovlje
|
Objavljeno: Sre Jan 31, 2007 12:20 am Naslov sporočila: |
|
|
Zdravo!
Preveri koliko časa porabiš za klic funkcije bit_get(data[a],b) , ker jo pri oddaji kličeš dvakrat pri sprejemu pa samo enkrat. Nekja časa pa procesor rabi za prireditev izhodov na določeno vrednost. Sam delam z ATTiny 2313 in sem imel probleme s timingom pri pisanju rutine za sprejem RC5 kode, problem je bil v nekaterih nepotrebnih ukazih, ki se izvajajo več cilov.
_________________ lepo je imeti poklic in hobi na istem področju vendar je časa premalo |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|