 |

|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 08 06, 09:32. Visos datos yra GMT + 2 valandos.
|
|
|
 |
Forumas » Mikrovaldikliai » kodel isikraipo ciklai?
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
 |
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 04, 20:38 |
|
|
|
Tai va parasiau proge TSOP'ui kad generuotu 36kHz signala. Tipo 600mikros signalas 36kHz yra kitas 600mikros signalo nera.
Programa sukasi kaip reikiant imetus i ATtiny2313, o va antra programa iskraipo ciklus, nebera pastovaus 600mikros intervalo, o jis metosi kaip sau nori nuo 100 iki 600 mikros. I antra programa papildomai interupta imeciau su ICP, kad jei ICP didesnis uz tam tikra intervala uzdek PORTB.
Bet vos tik ICP prirasiau ir zopa gavos intervalas plaukioja kaip saunori.
Gal kas galit padet susigaudyt kas ne taip?
pirma programa:
#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <avr/interrupt.h>
unsigned int i;
void sensoriai_desinys(void){
TCCR0A = (1<<COM0A0)|(1<<WGM01);
for (i=0; i<255; i++) // intervalas 600mikros, veikia gerai
{} }
void sensoriai_nieko(void){
TCCR0A = 0;
for (i=0; i<255; i++) //intervalas 600mikros, veikia gerai
{} }
int main()
{
DDRB=0b11111111;
DDRD=0b1111111;
TCCR0B=(1<<CS00);
OCR0A=110;
while(1) {
sensoriai_desinys();
sensoriai_nieko();
}}
Antra programa:
#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <avr/interrupt.h>
unsigned int i, rising;
ISR(TIMER1_CAPT_vect){
if (PIND==0)
{ TCNT1=0;
TCCR1B=(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
}
else
{
rising=TCNT1;
TCCR1B=(1<<CS10)|(1<<ICNC1);
if (rising>0xFF2)
{PORTB=0b11111111;
PORTB=0;}
}
}
void sensoriai_desinys(void){
TCCR0A = (1<<COM0A0)|(1<<WGM01);
for (i=0; i<255; i++) // iskraipomas 600mikros intervalas
{} }
void sensoriai_nieko(void){
TCCR0A = 0;
for (i=0; i<255; i++) iskraipomas 600mikros intervalas
{} }
int main()
{
DDRB=0b11111111;
DDRD=0b1111111;
TCCR0B=(1<<CS00);
TCCR1B=(1<<CS10)|(1<<ICNC1);
OCR0A=110;
TIMSK=(1<<ICIE1)|(1<<TOIE1);
sei();
while(1) {
sensoriai_desinys();
sensoriai_nieko();
}} |
|
|
|
|
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 04, 22:03 |
|
|
|
pastebejau kazka panasau kai daznomati dariau, pertraukimai netinka kai reikia generuoti ipac precizini laika.
bet tavo atveju matau kad panaudojai for cikla kaiko uzdelsimui o ne taimeri, todel nera ko stebetis kad pertraukimai mazina tiksluma. |
|
|
|
|
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 04, 23:54 |
|
|
|
Matai man nerupi jei ir periodas nuklys per 50 ciklu, bet tik ne per 500 aisku. Su timeriu pabandziau tas pats velnias, nuklysta. O siaip tie ciklai su pirma programa kuo puikiausiai veikia. Antroji programa kazko nepatinka, nors ten vykdoma yra tik pirmosios programos dalis. Ir kame cia saknis as niekaip nepagaunu. Pertauktys specialiai darau kad neateitu, kai as ja bandau. |
|
|
|
|
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 05, 00:40 |
|
|
|
Pimoji programa tau veikia gerai tik todėl, kad ten daugiau nieko ir nedaroma, tik generuojamas dažnis. Antroje jau yra pertraukimas. Jis neišvengiamai iškraipys norimo dažnio generavimą. Jei pertraukimas nesuveikinės - turi veikti taip pat, kaip ir pirmoji programa.
Bet darai čia negerai. Dažnį formuot reikia tik su taimeriu. Tada jis veiks tiksliai, nepriklausomai nuo to, kad vyksta pagrindinėje programoje. Problemos atsiras, tik jei norėsi panaudot dar vieną pertraukimą. Tada vėl prasidės iškraipymai. Tai yra logiška, juk mikrokontroleris turės aptarnaut ir kitą pertraukimą, todėl generuojamas dažnis šokinės. |
|
|
|
|
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 05, 19:22 |
|
|
|
Blogiausia todel ir yra, kad as debuginimo metu pertraukimu nedarau. As tik paziuriu ar kai nera pertraukciu yra generuojamas geras daznis ir 600 mikros intervalas. O del kazkokiu neaiskiu priezasciu gaunu didele spyga ir nesuprantu kodel. Pirmu atveju viskas normaliai, antru issikraipo ir nerandu niekaip kodel. Suprasciau jei suveiktu pertrauktis, tada taip viskas normaliai intervalas butu iskraipomas, bet esme kad as pertraukciu neduodu. Ir programa sukasi tik toje vietoje kaip ir pirma. Niekur i sona nenuklysta. |
|
|
|
|
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 05, 19:53 |
|
|
|
ISR(TIMER1_CAPT_vect){
if (PIND==0)
{ TCNT1=0;
TCCR1B=(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
}
else
{
rising=TCNT1;
TCCR1B=(1<<CS10)|(1<<ICNC1);
if (rising>0xFF2)
{PORTB=0b11111111;
PORTB=0;}
}
}
o ka sitas tada veikia jei pertraukimu nedarai?
ir iskur zinai kad pertraukimu nera? |
|
|
|
|
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 05, 20:30 |
|
|
|
Cia ICP, sita pertrauktis atsiranda, kai ant PD6 yra krentantis, o veliau kylantis frontas. Matuoja signalo trukme ir palygina. Siuo atveju ji atsiranda kai PD6 keitalioji. Ant debugerio keiciant jo reiksme matosi kada jis suveikia. Bet as gi sakau as nieko nelieciu ant debugerio ir matau kuri programos dalis sukasi ir sukasi tik ciklo generavimo dalis.
Siaip padariau su timeriu 600mikros intervalus dabar. Sukasi lyg gerai tiek ant debugerio tiek realiai. Bet velgi man truksta dar vieno timerio dabar, nes dabar nzn kaip ICP matuot. Mat as kai darau intervalus resetinu timeri1. Plius kai soka i ICP pertraukti, keiciasi ir timerio1 konfiguracija, va cia man ir gaunasi akligatvis.
#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <avr/iotn2313.h>
unsigned char i;
unsigned int rising;
ISR(TIMER1_CAPT_vect){
if ((PIND & (1 << PD6)) == 0)
{ TCNT1=0;
TCCR1B=(1<<CS10)|(1<<ICNC1)|(1<<ICES1);
}
else
{
rising=TCNT1;
TCCR1B=(1<<CS10)|(1<<ICNC1);
if (rising>0xFF2)
{PORTB=0b11111111;
PORTB=0;}
}
}
void sensoriai_desinys(void){
TCCR0A = (1<<COM0A0)|(1<<WGM01);
TCNT1=0;
while (TCNT1<0x11FF)
{} }
void sensoriai_nieko(void){
TCCR0A = 0;
TCNT1=0;
while (TCNT1<0x11FF)
{} }
void sensoriai_kairys(void){
TCCR0A = (1<<COM0B0)|(1<<WGM01);
TCNT1=0;
while (TCNT1<0x11FF)
{} }
int main()
{
DDRB=0b11111111;
DDRD=0b1111111;
TCCR0B=(1<<CS00);
TCCR1A=0;
TCCR1B=(1<<CS10)|(1<<ICNC1);
OCR0A=110;
TIMSK=(1<<ICIE1)|(1<<TOIE1);
sei();
while(1) {
sensoriai_desinys();
sensoriai_nieko();
}} |
|
|
|
|
 |
 |
kodel isikraipo ciklai? |
Parašytas: 2007 02 05, 22:02 |
|
|
|
Reikia dar vieno taimerio. Jei tiny jo neturi, teks imti kokį nors mega.
Tik dar kartą noriu pastebėt, kad suveikus ICP pertraukimui, tavo signalas vis tiek išsikraipys. Kiek išsikraipys, priklausys nuo to, ką darysi tame pertraukime. |
|
|
|
|
|
 |
Google paieška forume |
|
 |
Naujos temos forume |
|
 |
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
 |
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
 |
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
 |
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
 |
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
 |
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
 |
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
 |
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
 |
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
 |
Football Training Kit
Football Training Equipment,
Football Skills,
Football Training |
|

|
 |