|
|
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 01 21, 18:34. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » ATmega16 pertraukimai
|
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
|
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 14, 21:13 |
|
|
|
Mėginu išmokti panaudoti kontrolerio pertraukimus, bet kažko paprasto dar nesuprantu. Štai paprastos programos fragmentas su CodeVisionAVR:
#include <mega16.h>
#include <stdio.h>
#include <lcd.h>
unsigned int counter1, counter2;
char lcd_buffer[33];
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
counter1++;
}
void main(void)
{
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: 10.800 kHz
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x07; //daliklis iš 1024
TCNT2=0x00;
OCR2=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
while (1)
{
lcd_gotoxy(0,1);
sprintf(lcd_buffer, "Counter2=%d", counter2);
lcd_puts(lcd_buffer);
if (counter1==100){
counter2++;
counter1=0;
}
}
}
Pertraukimas sudirba tik vieną kartą, o toliau toks vaizdas, kad reikia nuresetinti skaitliuko persipildžiusį registrą, kad pradėtų skaičiuoti iš naujo, bet neįsikertu kurį. |
|
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 14, 22:11 |
|
|
|
is kur zinai kad viena karta?
siap tai tavo skaitliukas turetu suktis ratu
ir padarei nelabai gerai
geraiu daruk taip:
long counter=0;
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
counter++;
}
panaudoji tiesiog 32 bitu kintamaji ir nereikes vargti. arba taip:
// Timer 2 overflow interrupt service routine
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
counter1++;
if (counter1==100){
counter2++;
counter1=0;
} |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 15, 07:17 |
|
|
|
Ačiū už patarimą. Bet tada mano programos kita dalis kreivai parašyta, kuri išvedinėja "counter2" reikšmes, nes nuo 0 pasikeičia į 1, o daugiau ir nesikeičia. Tiesa pasakius, originali programa atlieka dar keletą nuoseklių funkcijų "main" dalyje, tai gal tiesiog ta 100 reikšmė prašokama? Gal sąlygos išraišką pakeisti į if (counter1>100)? |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 15, 13:18 |
|
|
|
taip, tavo programoje reikia if (counter1>100)?
bet tada skaiciavimas bus netikslus |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 15, 13:31 |
|
|
|
Supratau. Tikslumas čia buvo nesvarbu, tiesiog norėjau suprasti, kaip tai veikia. Dar kartą ačiū. |
|
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 30, 10:29 |
|
|
|
Grįžtu prie to pačio klausimo. Jaučiu, kad dar ne viską supratau arba čia yra dar kokių tai povandeninių srovių
Programos esmė yra matuoti temperatūrą (DS1820), nuskaityti laiką (DS1307) ir pakaitomis išvedinėti duomenis į LCD ekraną. Išvedinėjimas pakaitomis ir realizuotas su Timer interrupt. Viskas lyg ir veikia, bet be jokios sistemos programa, kažkurioje vietoje lūžta, ir tai gali atsitikti po 10 min ir po 2 val. Toks jausmas, kad kažkokiu specifiniu momentu po pertraukimo procesorius negrįžtą į darbinę būseną. Gal pertraukimas įvyksta kažkokiu netinkamu momentu, kai matuojama temperatūra ar nuskaitomas laikas?
Kvarcas naudojamas 11.0592MHz
Timerio Clock source parinktas 11.0592MHz/1024=10.8kHz
Tai kiekvienas pertraukimas turėtų įvykti kas 10800/255=42.35Hz arba 0.024s. Ar čia teisingai viską supratau?
Temperatūrai nuskaityti rašo, kad reikia apie 0.2s. Na ir laikrodis dar. Ar gali čia būti kokios problemos? |
|
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 30, 13:11 |
|
|
|
kiek pertraukimu naudoji?
gali buti kad kazkuriohe programos vistoje sunaudojama daug steko atminties ir pertraukimui nebeuztenka. |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 30, 13:35 |
|
|
|
Naudoju, tik tą vieną pertraukimą. Tiesa dar labai nesigilinau, kaip parašytos standartinės bibliotekos DS1820 ir DS1307 įrenginiams. Bet nemanau, kad ten kas nors blogai būtų.
Taimeriai išnaudoti visi OC0, OC1A ir OC1B generuoja PWM siganalą, o OC2 naudojamas pertraukimams.
Dar toks niuansas, kad kompiliatoriaus wizardas praneša apie klaidą, kad konfliktas tarp OC0 timerio ir LCD, kuris prijungtas prie PORTB. Nors būtent šio porto 3 bitas ir lieka laisvas nuo LCD. |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 30, 14:04 |
|
|
|
jei atminties netruksta pabandyk steka padidinti 2 kartus ir paziurek kaip veiks |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 05 30, 14:17 |
|
|
|
Nemoku įdėti paveiksliuko
Čia turbūt, kur Data Stack Size nusistato? |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 06 26, 10:41 |
|
|
|
sveiki as dar labai zalias ant C kalbos, gal galit parasyt proge
kad kas sekunde keistus portd=0 i portd=255? (su interruptais) |
|
|
|
|
|
ATmega16 pertraukimai |
Parašytas: 2007 06 26, 16:05 |
|
|
|
#include "delay.h"
main{
while (1)
{
PORTD=~PORTD;
delay(1);
}
}
va tau programa :) biblioteka delay.h neduosiu |
|
_________________ -----
That's what she said. |
|
|
|
|
|
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 |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|