Elektronika.lt
 2024 m. lapkričio 19 d. Projektas | Reklama | Žinokite | Klausimai | Prisidėkite | Atsiliepimai | Kontaktai
Paieška portale
EN Facebook RSS

 Kas naujo  Katalogas  Parduotuvės  Forumas  Tinklaraščiai
 Pirmas puslapisSąrašas
 Forumas / + pokalbiai
 - Paieška forume
 - D.U.K. / Forumo taisyklės
 - Narių sąrašas
 - Registruotis
 - Prisijungti

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 2024 11 19, 18:51. Visos datos yra GMT + 2 valandos.
 Forumas » Mikrovaldikliai » timer0_ovf interrupt'as AVR
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
 
  
Puslapis 12
Pereiti prie 1, 2  Toliau
Pradėti naują temą  Atsakyti į pranešimą Rodyti ankstesnį pranešimą :: Rodyti kitą pranešimą 
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 10:28 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Sveiki, pradėjau aiškintis kaip veikia pertrauktys Atmegos'e.
Bandymam naudoju Atmega8. Kompiliatorius AVR-GCC,

Programoj specifinės esmės nėra, čia tik bandymai.

Ant PORTD pakabinti šviesos diodai.
while(1) cikle turi sumirksėt visi PORTD diodai 300ms intervalais, paskui įsijungt pertrauktis. Pertrauktyje sumirksėjus 5000ms intervalais vėl grįžt prie 300ms mirksėjimo. Bet grįžimas neįvyksta, visada pakimba pertraukty ir mirksi 5000ms intervalais.

Ką darau ne taip?

Kodas:
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <inttypes.h>

void main(void)
{
   
                                               
   while(1)
   {
   DDRD=0xFF;
   PORTD= 0x00;
   _delay_ms(300);
   PORTD= 0xFF;
   _delay_ms(300);
   PORTD= 0x00;
   _delay_ms(300);
    PORTD= 0xFF;
   _delay_ms(300);
   PORTD= 0x00;
   _delay_ms(300);   
    PORTD= 0xFF;
   _delay_ms(300);
   PORTD= 0x00;
   _delay_ms(300);   
    PORTD= 0xFF;
   _delay_ms(300);
   PORTD= 0x00;
   _delay_ms(300);
   TCCR0|=(1<<CS02)|(1<<CS00);     
   TIMSK|=(1<<TOIE0);                 
   TCNT0=0;
   sei();           
   }       
}

ISR(TIMER0_OVF_vect)
{
      PORTD=0xFF;
      _delay_ms(5000);
     PORTD=0x00;
     _delay_ms(5000);
}
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 11:34 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Ba1tuks
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą Apsilankyti vartotojo tinklapyje
Pažiūrėk kur uždarai visą sekciją Smile Uždarai po while visą main programą ir tas interuptas jau būna kaip atskiras reikalas, nebegrįš į pradžią Wink
Kalbu apie antrą fig. skliaustų porą. Perkelk po sei() pirmą ir antrą skliaustą( } ) į patį programos galą Wink
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 12:04 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
viskas gerai ten uzdaryta, tik per daznai inicializuojamas tas interuptas.

nereikia inicializacijos i cikla deti


kita problame, kad pertraukimo viduje deti 10 sek uzdelsima kazkaip absurdiska.
procesoriaus tiesiog pakibs
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 13:03 Pranešti apie taisyklių pažeidimą Atsakyti su citata
MarcaZ
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
viskas gerai ten uzdaryta, tik per daznai inicializuojamas tas interuptas.

nereikia inicializacijos i cikla deti


kita problame, kad pertraukimo viduje deti 10 sek uzdelsima kazkaip absurdiska.
procesoriaus tiesiog pakibs


Taip, galima panaudoti XOR arba paprasciausia porto registru tikrinima...
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 13:45 Pranešti apie taisyklių pažeidimą Atsakyti su citata
minex
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
klausimas į temą, tada kaip daryt pavyzdžiui signalizaciją, kai paveikiamas tarkim įėjimas, ir sirena turi rėkti kokia 10min, bet kiti įėjimai turi tiap pat būti stebimi, ir fiksuojami, jei bus paveikti? Tada stebėjimą dėti į interuptą, o uždelsimą programoj naudot?
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 13:55 Pranešti apie taisyklių pažeidimą Atsakyti su citata
MarcaZ
Užkietėjęs dalyvis
Užkietėjęs dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Gali pagrindiniam while stebeti, gali naudoti timerio interuptus ir pan. Priklauso nuo taavo fantazijos ir situacijos Wink Kuo daugiau skaitysi ir praktikuosi, tuo lengviau bus tokius sprendimus priimti Wink
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 16:55 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
minex rašo:
klausimas į temą, tada kaip daryt pavyzdžiui signalizaciją, kai paveikiamas tarkim įėjimas, ir sirena turi rėkti kokia 10min, bet kiti įėjimai turi tiap pat būti stebimi, ir fiksuojami, jei bus paveikti? Tada stebėjimą dėti į interuptą, o uždelsimą programoj naudot?


kadangi interupto kas 10min nepadarysi tai patogiausia darysi interrupta kas sekunde o paskui naugoti papildoma skaitliuka.

sakykim kievienas pertraukimas skaitliuka sumazina vienetu
ir jei skaitliuko reiksme didesne nei nulis sirena ijungiama jei lygi nuliui isjungiama.

tada is pagridines programos reikes uzduoti laika kiek sirena kauks ir jinai uztils automatiskai po nurodyto laiko
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 17:04 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
viskas gerai ten uzdaryta, tik per daznai inicializuojamas tas interuptas.

nereikia inicializacijos i cikla deti


kita problame, kad pertraukimo viduje deti 10 sek uzdelsima kazkaip absurdiska.
procesoriaus tiesiog pakibs


Bandysiu dėt ne į ciklą.
O patį sei() kišt į ciklą ar ne?

interrupte uždelsimai įdėti tam, kad būtų aiškesnis vaizdas bandymuose.

Ba1tuks rašo:
Pažiūrėk kur uždarai visą sekciją Smile Uždarai po while visą main programą ir tas interuptas jau būna kaip atskiras reikalas, nebegrįš į pradžią Wink
Kalbu apie antrą fig. skliaustų porą. Perkelk po sei() pirmą ir antrą skliaustą( } ) į patį programos galą Wink


Gerai,tarkim interrupto programą įmetu į ciklą. Bet ar tada pats interruptas nebus eilinė ciklo nuoseklaus vykdymo dalis ir tiesiog viskas vyks visada ratu?
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 17:06 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
minex rašo:
klausimas į temą, tada kaip daryt pavyzdžiui signalizaciją, kai paveikiamas tarkim įėjimas, ir sirena turi rėkti kokia 10min, bet kiti įėjimai turi tiap pat būti stebimi, ir fiksuojami, jei bus paveikti? Tada stebėjimą dėti į interuptą, o uždelsimą programoj naudot?


kadangi interupto kas 10min nepadarysi tai patogiausia darysi interrupta kas sekunde o paskui naugoti papildoma skaitliuka.

sakykim kievienas pertraukimas skaitliuka sumazina vienetu
ir jei skaitliuko reiksme didesne nei nulis sirena ijungiama jei lygi nuliui isjungiama.

tada is pagridines programos reikes uzduoti laika kiek sirena kauks ir jinai uztils automatiskai po nurodyto laiko


Va po tokių pamąstymų aš kažkodėl nebesuprantu interruptų pranašumo prie paprastas funkcijas...
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 18:24 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Perrašiau taip:

Kodas:
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <inttypes.h>

void main(void)
{
   TCCR0|=(1<<CS02)|(1<<CS00);     
   TIMSK|=(1<<TOIE0);                 
   TCNT0=0;
                                         
   while(1)
   {
   DDRD=0xFF;
   PORTD= 0x00;
   _delay_ms(3000);
   PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);
    PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);   
    sei();     
   }       
}

ISR(TIMER0_OVF_vect)
{
   
      PORTD=0xFF;
      PORTD=0x00;
}


Vistiek pakimba interrupte. Kaip padaryt, kad jame nepakibtų? Ir taip ir anaip, vistiek nesigauna.
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 19:15 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
interuuptai ir neturi turetu pranasumuu prie funkcijas ne jie ir yra funkcijos.

ju nauda yra tu funkciju paleidimo metodikoje.

sakykim paspaudus mygtuka reikia iykdyti kazkokia funkcija.

tai interruptas tiesiog hardwariskai tikrina ta mygtuka ir jam suveikus paleidzia tavo funkcija kuri atveju mygtuko tikrinimu reiketu rupintis paciam.


del tavo pogramos, sei() i cikla nedek
dek pries cikla.


bet kodel pakimba tai nelabai aisku.
paprastai problema buna kad interruptas vykdoms dazniau nei jo funkcija speja pasibaigti.
bet tavo atevju taip neturetu buti.


beje is kur zinai kad kazkas pakimba?

bes tavo atveju be sosilografo nelamai ka matysi
programa i porta D nuolatos irasines 0 it itk labai trumpam ten kartais atsras 0xff
LED net sumirgseti nespes
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 19:36 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
interuuptai ir neturi turetu pranasumuu prie funkcijas ne jie ir yra funkcijos.

ju nauda yra tu funkciju paleidimo metodikoje.

sakykim paspaudus mygtuka reikia iykdyti kazkokia funkcija.

tai interruptas tiesiog hardwariskai tikrina ta mygtuka ir jam suveikus paleidzia tavo funkcija kuri atveju mygtuko tikrinimu reiketu rupintis paciam.


del tavo pogramos, sei() i cikla nedek
dek pries cikla.


bet kodel pakimba tai nelabai aisku.
paprastai problema buna kad interruptas vykdoms dazniau nei jo funkcija speja pasibaigti.
bet tavo atevju taip neturetu buti.


beje is kur zinai kad kazkas pakimba?

bes tavo atveju be sosilografo nelamai ka matysi
programa i porta D nuolatos irasines 0 it itk labai trumpam ten kartais atsras 0xff
LED net sumirgseti nespes


Perrašiau taip:

Kodas:
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <inttypes.h>

unsigned int i;
void main(void)
{
   TCCR0|=(1<<CS02)|(1<<CS00);     
   TIMSK|=(1<<TOIE0);                 
   TCNT0=0;
   sei();                               
   while(1)
   {
   DDRD=0xFF;
   PORTD= 0x00;
   _delay_ms(3000);
   PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);
    PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);   
     
   }       
}

ISR(TIMER0_OVF_vect)
{
   
      PORTD=0xFF;
}


Dabar LED'ai pastoviai žiba ir tik retkarčiais mirkteli.

Kodas perrašytas taip, kad interruptas uždega LED'us, o ciklo pirmas žingsnis yra LED užgesinimas ir 3000ms uždelsimas. Tokiu būdu tiksliai matosi, kad LED'ai niekada neužgesinami todėl, kad po sei() patenkami tiesiai į interuptą ir ten pakimba.
Manau tas trumpas mirktelėjimas yra skaitliuko užsipildymas ir nusinulinimas. Bet aš nesuprantu kodėl tas skaitliukas sukasi tik pertraukty.

Pagal interruptų koncepciją, po interupte parašyto kodo įvykdymo turėtų vykti tolesnis kodas, bet nevyksta.
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 19:52 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Digix
VIP narys
VIP narys
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
pagal tavo programa jinai nuolat mirgsimas led kad 3 sek o pertraukimas ivyksta beveik atsitiktiniu momentu ir privesrtinai led uzgesina

ir jei led sumirgsi tai viskas veikia gerai

nepasakyciau kad tai labai geras netodas ka nors pamatyti


geriau padaryk kad pertraukimai ir pagrindinis ciklas mrgsintu atskirus led
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 20:08 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Square
Dažnas dalyvis
Dažnas dalyvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Digix rašo:
pagal tavo programa jinai nuolat mirgsimas led kad 3 sek o pertraukimas ivyksta beveik atsitiktiniu momentu ir privesrtinai led uzgesina

ir jei led sumirgsi tai viskas veikia gerai

nepasakyciau kad tai labai geras netodas ka nors pamatyti


geriau padaryk kad pertraukimai ir pagrindinis ciklas mrgsintu atskirus led


Gerai, taip ir padariau.

Kodas:
#define F_CPU 1000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/iom8.h>
#include <inttypes.h>

void main(void)
{
   DDRD=0xFF;
   DDRB=0xFF;
   TCCR0|=(1<<CS02)|(1<<CS00);     
   TIMSK|=(1<<TOIE0);                 
   TCNT0=0;
   sei();                               
   while(1)
   {
   PORTB=0x00;
   PORTD= 0x00;
   _delay_ms(3000);
   PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);
    PORTD= 0xFF;
   _delay_ms(3000);
   PORTD= 0x00;
   _delay_ms(3000);   
     
   }       
}

ISR(TIMER0_OVF_vect)
{
      PORTB=0xFF;
     _delay_ms(100);
     PORTB=0x00;
     _delay_ms(100);
}


Galbūt aš prieš tai nematydavau while(1) veiksmų, nes skaitliukas per greit užsipildydavimo ir iškart vėl šokdavo į pertrauktį?

Ar gali toks variantas būt?
 timer0_ovf interrupt'as AVR
PranešimasParašytas: 2011 05 24, 21:20 Pranešti apie taisyklių pažeidimą Atsakyti su citata
Edzma
Senbuvis
Senbuvis
Peržiūrėti vartotojo aprašymą Siųsti asmeninį pranešimą
Cia siaip....neismananciojo sapaliones...... ar nieks nepagalvojo, kiek trunka interuptas ir kitas ne interupte veiksmas) ?.....gal as ti sapalioju......cia juk svarbu laikas,.
Pradėti naują temą  Atsakyti į pranešimą Pereiti prie 1, 2  Toliau
 
Forumo sistema: phpBB
 „Google“ paieška forume
 Kas naujesnio?
 Naujos temos forume

Global electronic components distributor – Allicdata Electronics

Electronic component supply – „Eurodis Electronics“

LOKMITA – įvairi matavimo, testavimo, analizės ir litavimo produkcija

Full feature custom PCB prototype service

GENERAL FINANCING BANKAS

Mokslo festivalis „Erdvėlaivis Žemė

LTV.LT - lietuviškų tinklalapių vitrina

„Konstanta 42“

Technologijos.lt

Buitinė technika ir elektronika internetu žemos kainos – Zuza.lt

www.esaugumas.lt – apsaugok savo kompiuterį!

PriedaiMobiliems.lt – telefonų priedai ir aksesuarai

Draugiškas internetas

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
LEGO
Mänguköök, mudelautod, nukuvanker
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope
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
GTA 6 Weapons
GTA 6 Characters, GTA 6 Map, GTA 6 Vehicles
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps
Reklama
‡ 1999– © Elektronika.lt | Autoriaus teisės | Privatumo politika | Atsakomybės ribojimas | Turinys | Reklama | Kontaktai LTV.LT - lietuviškų tinklalapių vitrina
Script hook v, Openiv, Menyoo
gta5mod.net
FS25 Mods, FS25 Tractors, FS25 Maps
fs25mods.lt
Optical filters, UV optics, electro optical crystals
www.eksmaoptics.com
Reklamos paslaugos
SEO sprendimai

www.addad.lt
Elektroninių parduotuvių optimizavimas „Google“ paieškos sistemai
www.seospiders.lt
FS22 mods, Farming simulator 22 mods,
FS22 maps

fs22.com
Reklama


Reklama