Skocz do zawartości

[C] Problem z Timerem1 - Atmega8


polarczn

Pomocna odpowiedź

Uczę się programować na przykładzie Atmegi8. Jestem na etapie Timerów. Dioda Led podłączona jest do portu PB1. Przyciski PD5 i PD6 mają zwiększać lub zmniejszać wartość OCR1A. Niestety utknąłem na etapie drgania przycisków. Otrzymałem pomoc na jednym z forów, jednak nie rozumiem co oznacza kod w ISR. Wciskanie PD5 i PD6 nie powoduje żadnych zmian. Dodatkowo na wyświetlaczu HD44780 nie ma wyświetlania napisu. Jest to wina kodu, gdyż wcześniej wyświetlacz działał. Mogę prosić o pomoc?

Stan wciśnięcia przycisku sprawdzam w przerwaniach Timera0. PWM jest przy pomocy Timer1.

#include <stdlib.h> 
#include <avr/io.h>
#include <util/delay.h>
# include <math.h>
#include <avr/interrupt.h>
#include "HD44780.h"

int a=50;
# define keypin PIND
# define keyddr DDRD
# define keyport PORTD
# define keypd6 _BV(PD5)
# define keypd7 _BV(PD6)
volatile _Bool keypin_pressed = 0; // flaga wciśniętego przycisku
static uint8_t przechowuje=0; // przechowuje 4 ostatnie wciśnięcia
static uint8_t ostatnia=0;        // ostatnie wciśnięcie przycisku


ISR(TIMER0_OVF_vect)   
{
if((keypin & (1<<PD6)==0))
{ 
ostatnia = 1;
}
else 
{
ostatnia =0;
}

	if ((przechowuje = ((przechowuje << 1) & (1<<PD6) | ostatnia) == 1))
	{
		keypin_pressed = 1;
	}
if((keypin & (1<<PD5)==0))
{ 
ostatnia = 1;
}
else 
{
ostatnia =0;
}

	if ((przechowuje = ((przechowuje<< 1) & (1<<PD5) | ostatnia) == 1))
	{
		keypin_pressed = 1;
	}
}

int main(void)
{

sei();
TCCR1A |= (1<<COM1A1)|(1<<WGM11)|(1<<WGM10);// PWM Phase Correct 10 bit, 
TCCR1B |=(1<<CS12);// preskaler 64
TCNT1=0;//początkowa wartość timera
TIMSK |= (1<<TOIE1); // przepełnienie timera
OCR1A=600; // wartość wypełnienia 600/1024


TCCR0 |= (1<<CS02); // preskaler 256
TIMSK |= (1<<TOIE0);
TIFR |= (1<<TOV0);
TCNT0 = 250; // 8 Mhz/ (250*256), czyli 125 Hz, 1 przerwanie co 1/125 Hz.

DDRB|=(1<<PB1); // dioda PB1 jako wyjście
keyddr|=(0<<PD5)|(0<<PD6);// przyciski podłączone do PD5 i PD6 jako wejście
keyport|=(1<<PD5)|(1<<PD6);// podciągnięcie ich do VCC
a=OCR1A;
PORTB|=(1<<PB1); // podciągnięcie do VCC

while(1){
if(!(keypin &(1<<PD5))){ // jeżeli wcisnę PD5 wartość a maleje, a jeżeli PD6 rośnie
OCR1A=OCR1A-a;


if(!(keypin &(1<<PD6)))
{
OCR1A=OCR1A+a;
}
}}
if(OCR1A<0)
{
OCR1A=0;
}
if (OCR1A<1024)
{
OCR1A=1024;
}





  LCD_Initalize();
LCD_Clear();
LCD_Home();
LCD_WriteText("HD44780");
LCD_GoTo(2,2);


}


Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.