|
|
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:56. 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 1 iš 2 Pereiti prie 1, 2 Toliau |
|
|
|
|
timer0_ovf interrupt'as AVR |
Parašytas: 2011 05 24, 10:28 |
|
|
|
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 |
Parašytas: 2011 05 24, 11:34 |
|
|
|
Pažiūrėk kur uždarai visą sekciją Uždarai po while visą main programą ir tas interuptas jau būna kaip atskiras reikalas, nebegrįš į pradžią
Kalbu apie antrą fig. skliaustų porą. Perkelk po sei() pirmą ir antrą skliaustą( } ) į patį programos galą |
|
|
|
|
|
timer0_ovf interrupt'as AVR |
Parašytas: 2011 05 24, 12:04 |
|
|
|
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 |
Parašytas: 2011 05 24, 13:03 |
|
|
|
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 |
Parašytas: 2011 05 24, 13:45 |
|
|
|
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 |
Parašytas: 2011 05 24, 13:55 |
|
|
|
Gali pagrindiniam while stebeti, gali naudoti timerio interuptus ir pan. Priklauso nuo taavo fantazijos ir situacijos Kuo daugiau skaitysi ir praktikuosi, tuo lengviau bus tokius sprendimus priimti |
|
|
|
|
|
|
timer0_ovf interrupt'as AVR |
Parašytas: 2011 05 24, 16:55 |
|
|
|
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 |
Parašytas: 2011 05 24, 17:04 |
|
|
|
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ą Uždarai po while visą main programą ir tas interuptas jau būna kaip atskiras reikalas, nebegrįš į pradžią
Kalbu apie antrą fig. skliaustų porą. Perkelk po sei() pirmą ir antrą skliaustą( } ) į patį programos galą |
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 |
Parašytas: 2011 05 24, 17:06 |
|
|
|
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 |
Parašytas: 2011 05 24, 18:24 |
|
|
|
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 |
Parašytas: 2011 05 24, 19:15 |
|
|
|
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 |
Parašytas: 2011 05 24, 19:36 |
|
|
|
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 |
Parašytas: 2011 05 24, 19:52 |
|
|
|
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 |
Parašytas: 2011 05 24, 20:08 |
|
|
|
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 |
Parašytas: 2011 05 24, 21:20 |
|
|
|
Cia siaip....neismananciojo sapaliones...... ar nieks nepagalvojo, kiek trunka interuptas ir kitas ne interupte veiksmas) ?.....gal as ti sapalioju......cia juk svarbu laikas,. |
|
|
|
|
|
|
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 |
|
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 |
|
|
|