Witam kolegów,
sprawdzałem na różne sposoby, int0 ma mi dodac do pozycja++;
ale nie dodaje...
prosze o oswiecenie
sprawdzałem na różne sposoby, int0 ma mi dodac do pozycja++;
ale nie dodaje...
prosze o oswiecenie
/* układ ATmega 1MHz */
/* servo by dex */
#define F_CPU 1000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int roznicapozycji;
unsigned int wynik;
unsigned int dolnyzakres;
unsigned int gornyzakres;
unsigned int licznik;
unsigned int korekta;
unsigned int lewo;
unsigned int prawo;
unsigned long int pozycja;
unsigned int kontrolaenkodera;
ISR(INT0_vect) {
pozycja++; //przy int0 ustaw flage1 na 1
}
ISR(INT1_vect) {
pozycja++; //przy int1 ustaw flage2 na 1
}
ISR (BADISP_vect){}
int main(void) {
DDRD = 0x00; //port D jako wejscie
PORTD = 0xFF;
MCUCR = 0x0f; // ustaw przerwanie INT0 i INT1, zbocze narastajace
GICR = (1<<INT0) | (1<<INT1);
licznik = 31000;
pozycja=10000;
korekta=1;
dolnyzakres=440;
gornyzakres=510;
DDRB=0xFF; // PINB jako wyjścia
DDRC = 0x00;
PORTC = 0x0F;
//Ustawiamy PWM w Fast 8 bits mode -> WGM13,WGM12,WGM11,WGM10 = 0b0101
TCCR1A |= (1<<WGM10);
TCCR1A |= (0<<WGM11);
TCCR1B |= (1<<WGM12);
TCCR1B |= (0<<WGM13);
//włącz przekazywanie sygnału PWM na PIN PB1 (OC1A i 1B) rtfm str. 97
TCCR1A |= (1<<COM1A1);
TCCR1A |= (0<<COM1A0);
TCCR1A |= (1<<COM1B1);
TCCR1A |= (0<<COM1B0);
//Preskaler
TCCR1B &= ~((1<<CS12) | (1<<CS11) | (1<<CS10)); //wyzeruj bity preskalera
//TCCR1B |= (1<<CS11); //ustaw preskaler 1:8
TCCR1B |= (1<<CS10); //do 64 z cs11 // samo 1:1
// TCNT0 = 0; // Resetuj TCNT0
sei();
for (;;) {
//enkoder
switch(PINC & 0x03)
{
case 0x03:
//if (kontrolaenkodera == 3) pozycja--;
//if (kontrolaenkodera == 2) pozycja++;
kontrolaenkodera=1;
break;
case 0x01:
//if (kontrolaenkodera == 1) pozycja--;
//if (kontrolaenkodera == 3) pozycja++;
kontrolaenkodera=2;
break;
case 0x00:
if (kontrolaenkodera == 2) pozycja--;
if (kontrolaenkodera == 4) pozycja++;
kontrolaenkodera=3;
break;
case 0x02:
//if (kontrolaenkodera == 3) pozycja--;
// if (kontrolaenkodera == 1) pozycja++;
kontrolaenkodera=4;
break;
}
if ( pozycja < 9999 )
{
prawo = ( 10000 - pozycja );
roznicapozycji=10000-pozycja;
if ( prawo > 5 && korekta < 3) korekta++; // i moze razy stopa bledy? roznicapozycji z enkodera//rośnie!
if ( prawo < 5 && korekta > 0) korekta--; // jak juz nadgoni bledy to zwalnianie x wspolczynnik bledu wprowadzic roznicapozycji //spada
wynik = dolnyzakres + (prawo * korekta) + prawo;
if ( wynik > gornyzakres ) wynik=gornyzakres;
if ( wynik < dolnyzakres ) wynik=dolnyzakres;
OCR1B = wynik;
OCR1A = 1;
}
if ( pozycja > 10001 )
{
lewo = ( pozycja - 10000 );
roznicapozycji=pozycja-10000;
if ( lewo > 5 && korekta < 3) korekta++; // i moze razy stopa bledy? roznicapozycji z enkodera//rośnie!
if ( lewo < 5 && korekta > 0) korekta--; // jak juz nadgoni bledy to zwalnianie x wspolczynnik bledu wprowadzic roznicapozycji //spada!
wynik = dolnyzakres + (lewo * korekta) + lewo;
if ( wynik > gornyzakres ) wynik=gornyzakres;
if ( wynik < dolnyzakres ) wynik=dolnyzakres;
OCR1A = wynik;
OCR1B = 1;
}
if ( pozycja == 10000 )
{
OCR1A = 1;
OCR1B = 1;
}
} // koniec for(;;)
}