Forum elektroda.pl

Regulamin  | Punkty  | Dodaj...  | Ostatnie  | Szukaj  | Rejestracja  | Zaloguj

Ta strona używa cookie. Dowiedz się więcej o celu ich używania i zmianie ustawień cookie w przeglądarce.
Korzystając ze strony wyrażasz zgodę na używanie cookie, zgodnie z aktualnymi ustawieniami przeglądarki.

Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


Napisz nowy temat  Temat zablokowany      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno
Autor
Wiadomość
krzys317t
Poziom 5
Poziom 5


Dołączył: 28 Maj 2007
Posty: 11
Miasto: Żychlin

Post#1 Post autora tematu 19 Sie 2013 11:11   

Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


Witam!
Dopiero zaczynam i nie mogę sobie poradzić z poprawnym zliczaniem w przerwaniu pochodzącym od Timera2 w trybie CTC. Chciałem wykorzystać programowe Timery, które są pomysłem Pana Kardasia (korzystam z jego książki) do tego aby jeden z nich tykał co 1sek. Zacząłem, więc tak: 16MHz/1024/125/125 daje teoretycznie "cyknięcie" co sekundę, a u mnie wychodzi w czasie między 2-3sek. Swoją Atmege 16A taktuję kwarcem 16MHz i fuse bity mam na pewno dobrze ustawione, bo gdy wykorzystuję przy inkrementacji zmiennej funkcję _delay_ms(1000) to zmiany w zmniennej następują idelnie po sekundzie. Gdzie robię błąd? Dodam, że na Timerze1 też miałem podobny problem mimo tego, że tyknięcie było realizowane tylko na 16bitowym rejestrze, a w kodzie przerwania była tylko inkrementacja zmiennej sek. Załączam kod [code]
Kod C - [rozwiń]
 
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> // plik nagłówkowy do obsł. przerwań
#include "LCD/lcd44780.h"
 
//obsługa klawiszy cdn w main
 
#define key1 (1<<PB1)
#define key2 (1<<PB2)
#define key3 (1<<PB3)
#define key0 (1<<PB0)
volatile uint16_t Timer1,Timer2,Timer3,Timer4;
int main(void)
{
// Obsługa klawiszy cd
DDRB &= ~(key1|key2|key3|key0); //kierunek pinów - wejsciowy
PORTB |= key1|key2|key3|key0; //podciagniecie pinów klawiszy do VCC
 
 
/* Timer2 inicjalizacja przerwania co 10ms */
TCCR2 = (1<<WGM21); // tryb pracy CTC
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); // preskaler = 1024
OCR2 = 125; // przerwanie porównania
TIMSK = (1<<OCIE2); // Odblokowanie przerwania CompareMatch
 
 
sei();
 
lcd_init();
 
while(1)
{
 
if(!Timer3){
Timer3=125;
++sek;
lcd_cls();
}
if(sek>59) sek=0;
 
lcd_locate(0,19);
lcd_int(sek);
}
}
 
ISR(TIMER2_COMP_vect)
{
uint16_t n;
n = Timer1; /* 100Hz Timer1 */
if (n) Timer1 = --n;
n = Timer2; /* 100Hz Timer2 */
if (n) Timer2 = --n;
n = Timer3; /* 100Hz Timer3 */
if (n) Timer3 = --n;
n = Timer4; /* 100Hz Timer4 */
if (n) Timer4 = --n;
 
}


Dodam, że wszelkie zmiany w rejestrze OCR2 nie zmieniają prędkości zliczania. Tu jest błąd, dlatego zlicza w tempie ponad 2 razy wolniejszym. Coś mogłem źle ustawić? Coś mogłem wcześniej przestawić, że nie uC czyta tych wartości w OCRx ?
Powrót do góry
   
Google


Google Adsense


Post# 19 Sie 2013 11:11   





Powrót do góry
   
mattsk
Poziom 9
Poziom 9


Dołączył: 18 Paź 2009
Posty: 40
Miasto: Mikołów

Post#2 19 Sie 2013 14:59   

Re: Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


'Tak na szybko to zwróciłbym uwage na to że Twoje zmienne Timer1,2,3,4 nie ma wartości początkowych...
Powrót do góry
   
Google


Google Adsense


Post# 19 Sie 2013 14:59   





Powrót do góry
   
krzys317t
Poziom 5
Poziom 5


Dołączył: 28 Maj 2007
Posty: 11
Miasto: Żychlin

Post#3 Post autora tematu 19 Sie 2013 16:59   

Re: Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


One właśnie mają wartość początkową. Gdy zmienne są deklarowane jako globalne na początku programu, to z automatu mają wartość równą 0. Sprawdzałem to w AVRstudio. Nawet jeśli coś by było z nimi nie tak, to do Timer3 ładuję wartość 125, więc ma program z czego odliczać. Także to nie to, bo zliczanie działa. Coś jest na 100% z rejestrem OCR, bo gdy ładuję mu wartość 255, czy 5 to przerwanie cały czas zlicza w tym samym tempie, czyli nieco ponad 2s. Czy można go bezwiednie zablokować? Czy może jestem ślepy i czegoś głupiego nie widzę w swoim programie?
Powrót do góry
   
Google


Google Adsense


Post# 19 Sie 2013 16:59   





Powrót do góry
   
zumek
Poziom 23
Poziom 23


Dołączył: 08 Paź 2003
Posty: 3301

Post#4 19 Sie 2013 18:50pomocny post - solucja   

Re: Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


krzys317t napisał:
... Czy może jestem ślepy i czegoś głupiego nie widzę w swoim programie?

Jesteś :D
A teraz patrz i myśl.
Kod C - [rozwiń]
TCCR2 = (1<<WGM21); // tryb pracy CTC
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); // preskaler = 1024
 

Powrót do góry
   
krzys317t
Poziom 5
Poziom 5


Dołączył: 28 Maj 2007
Posty: 11
Miasto: Żychlin

Post#5 Post autora tematu 19 Sie 2013 19:06   

Re: Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno


Dzięki zumek :D

To była ślepota, aż wstyd napisać ile czasu przez to straciłem.

Problem tkwił w tym, że nie dałem znaku | przed = . to samo trzeba było zrobić w rejestrze TIMSK.

Temat można zamkknąć
Powrót do góry
   
Napisz nowy temat  Temat zablokowany      Strona Główna -> Forum elektroda.pl -> Mikrokontrolery Ogólne -> Mikrokontrolery AVR -> Atmega16A - Atmega16A Tryb CTC na Timerze2 zlicza 2-3razy za wolno
Strona 1 z 1
Podobne tematy
atmega16a - Martwy atmega16a po zmianie JTAGEN (czyli ustawieniu na 1) (2)
ATmega16A - ATmega16A z końcówką A nie działa (28)
[C]Atmega16A,TWI i 24C512 (2)
atmega16a - przerwanie RX w USART (7)
Generator przestrajany ATMega16a Bascom (22)
ATTiny2313 i ATMega16a - połączenie SPI (11)
Atmega16A w Bascomie nie działa. (11)
Atmega16a - zmienny pobór prądu. (4)
Atmega16A/l293D - Modulacja PWM (11)
[Atmega16A-AU] Zbyt wolne taktowanie (12)


Administrator || Moderatorzy || Regulamin forum || Regulamin ogólny || Informacja o cookies || Reklama || Kontakt

Page generation time: 0.079 seconds

elektroda.pl temat RSS