Witam mam kolejny problem z nieszczęsną atmega128. Napisałem program który działał na ATmega16 i chciałem go przenieść do atmega128 no i jest problem. Program w ogóle nie działa. W przerwaniu powinny się zwiększać wartości zmiennych. Niestety chyba nie zwiększają się :/ program wchodzi do przerwania bo wstawiłem tam naprzemienne ustawianie i kasowanie stanu jednego bitu i wszystko działa. Niestety jak wstawiłem mój tester do funkcji. próbowałem napisać innego if'a ale niestety też nie działa
if(overflow_ADC>=overflow_ADC_max)
{
LED_TOGGLE //tester
overflow_ADC=0;
}
dodaję cały program, wyrzuciłem z niego dalszą część ponieważ najprostsza funkcja nie chce działać. Są tam również deklaracje wielu zmiennych którą są teraz niewykorzystywane:
Dodano po 21 [minuty]:
napisałem krótszy program i na ATmega16 działa bez zarzutu czyli program wchodzi do funkcji if(overflow_ADC>=overflow_ADC_max) po osiągnięciu odpowiedniej wartości przez overflow_ADC a na ATmega128 nie działa, sprawdzałem też na innych portach, to gdzie może być błąd?
if(overflow_ADC>=overflow_ADC_max)
{
LED_TOGGLE //tester
overflow_ADC=0;
}
dodaję cały program, wyrzuciłem z niego dalszą część ponieważ najprostsza funkcja nie chce działać. Są tam również deklaracje wielu zmiennych którą są teraz niewykorzystywane:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
/////// SILNIK 1 //////////////// PORT - E
#define OUT1a_ON PORTE |= _BV(0);
#define OUT1a_OFF PORTE &= ~_BV(0);
#define OUT1b_ON PORTE |= _BV(1);
#define OUT1b_OFF PORTE &= ~_BV(1);
#define OUT1c_ON PORTE |= _BV(2);
#define OUT1c_OFF PORTE &= ~_BV(2);
#define OUT1d_ON PORTE |= _BV(3);
#define OUT1d_OFF PORTE &= ~_BV(3);
/////// SILNIK 2 //////////////// PORT - E
#define OUT2a_ON PORTE |= _BV(4);
#define OUT2a_OFF PORTE &= ~_BV(4);
#define OUT2b_ON PORTE |= _BV(5);
#define OUT2b_OFF PORTE &= ~_BV(5);
#define OUT2c_ON PORTE |= _BV(6);
#define OUT2c_OFF PORTE &= ~_BV(6);
#define OUT2d_ON PORTE |= _BV(7);
#define OUT2d_OFF PORTE &= ~_BV(7);
/////// SILNIK 3 //////////////// PORT - B
#define OUT3a_ON PORTB |= _BV(0);
#define OUT3a_OFF PORTB &= ~_BV(0);
#define OUT3b_ON PORTB |= _BV(1);
#define OUT3b_OFF PORTB &= ~_BV(1);
#define OUT3c_ON PORTB |= _BV(2);
#define OUT3c_OFF PORTB &= ~_BV(2);
#define OUT3d_ON PORTB |= _BV(3);
#define OUT3d_OFF PORTB &= ~_BV(3);
/////// SILNIK 4 //////////////// PORT - B
#define OUT4a_ON PORTB |= _BV(4);
#define OUT4a_OFF PORTB &= ~_BV(4);
#define OUT4b_ON PORTB |= _BV(5);
#define OUT4b_OFF PORTB &= ~_BV(5);
#define OUT4c_ON PORTB |= _BV(6);
#define OUT4c_OFF PORTB &= ~_BV(6);
#define OUT4d_ON PORTB |= _BV(7);
#define OUT4d_OFF PORTB &= ~_BV(7);
/////// SILNIK 5 //////////////// PORT - D
#define OUT5a_ON PORTD |= _BV(0);
#define OUT5a_OFF PORTD &= ~_BV(0);
#define OUT5b_ON PORTD |= _BV(1);
#define OUT5b_OFF PORTD &= ~_BV(1);
#define OUT5c_ON PORTD |= _BV(2);
#define OUT5c_OFF PORTD &= ~_BV(2);
#define OUT5d_ON PORTD |= _BV(3);
#define OUT5d_OFF PORTD &= ~_BV(3);
/////// SILNIK 6 //////////////// PORT - D
#define OUT6a_ON PORTD |= _BV(4);
#define OUT6a_OFF PORTD &= ~_BV(4);
#define OUT6b_ON PORTD |= _BV(5);
#define OUT6b_OFF PORTD &= ~_BV(5);
#define OUT6c_ON PORTD |= _BV(6);
#define OUT6c_OFF PORTD &= ~_BV(6);
#define OUT6d_ON PORTD |= _BV(7);
#define OUT6d_OFF PORTD &= ~_BV(7);
///// LEDY //////
#define LED_ON PORTC |= _BV(0);
#define LED_OFF PORTC &= ~_BV(0);
#define LED_TOGGLE PORTC ^= _BV(0);
volatile uint16_t overflow_ADC=0;
volatile uint16_t overflow1=0;
volatile uint16_t overflow2=0;
volatile uint16_t overflow3=0;
volatile uint16_t overflow4=0;
volatile uint16_t overflow5=0;
volatile uint16_t overflow6=0;
volatile uint16_t overflow_ADC_max=100;
volatile uint16_t overflow1_max=10;
volatile uint16_t overflow2_max=30;
volatile uint16_t overflow3_max=100;
volatile uint16_t overflow4_max=38;
volatile uint16_t overflow5_max=30;
volatile uint16_t overflow6_max=50;
volatile char sw1a=0;
volatile char sw1b=0;
volatile char sw2a=0;
volatile char sw2b=0;
volatile char sw3a=0;
volatile char sw3b=0;
volatile char sw4a=0;
volatile char sw4b=0;
volatile uint16_t value; // zapisywana wartość przetwornika
volatile unsigned char stan1 = 3;
volatile unsigned char stan2 = 3;
volatile unsigned char stan3 = 3;
volatile unsigned char stan4 = 3;
volatile unsigned int value; // zmienna przechowują stan wyjścia przetwornika ADC
volatile unsigned int zakres=150; // wartść po jakiej ma nastąpić załączenie
volatile uint8_t test=20;
ISR (TIMER0_OVF_vect)
{
TCNT0 = 120; // Załaduj wartość początkową do timera 0
overflow1++;
overflow2++;
overflow3++;
overflow_ADC++;
}
int main (void)
{
DDRB = 255; // Ustawienie rejestru B jako wyjݣie na silnik
DDRC = 255; // Ustawienie rejestru C jako TEST
DDRD = 255; // Ustawienie rejestru D jako wyjݣie na silniki
DDRE = 255; // Ustawienie rejestru E jako wyjݣie na silniki
DDRF = 0; // Ustawienie rejestru F jako Wejścia z pad'a
TIMSK = _BV(TOIE0); // wӹcz obsԵgꡰrzerwawoԡne timerem 0
TCCR0 = _BV(CS02) | _BV(CS02) ; //Ustawia timer0 z preskalerem 32
ADCSRA = _BV(ADEN)|_BV(ADSC)|_BV(ADPS0)|_BV(ADPS2)|_BV(ADFR); // ustaw przetwornik ADC
sei(); // włącz obsługę przerwań
while(1) // Program główny
{
if(overflow_ADC>=overflow_ADC_max)
{
LED_TOGGLE
overflow_ADC=0;
}
} //zamyka while
} //zamyka main
Dodano po 21 [minuty]:
napisałem krótszy program i na ATmega16 działa bez zarzutu czyli program wchodzi do funkcji if(overflow_ADC>=overflow_ADC_max) po osiągnięciu odpowiedniej wartości przez overflow_ADC a na ATmega128 nie działa, sprawdzałem też na innych portach, to gdzie może być błąd?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
///// LEDY //////
#define LED_ON PORTC |= _BV(0);
#define LED_OFF PORTC &= ~_BV(0);
#define LED_TOGGLE PORTC ^= _BV(0);
volatile uint8_t overflow_ADC=0;
volatile uint8_t overflow_ADC_max=10;
ISR (TIMER0_OVF_vect)
{
TCNT0 = 250; // Załaduj wartoś początkową do timera 0
overflow_ADC++;
}
int main (void)
{
DDRC = 255; // Ustawienie rejestru C jako TEST
TIMSK = _BV(TOIE0); // wӹcz obsԵgꡰrzerwawoԡne timerem 0
TCCR0 = _BV(CS02) | _BV(CS02) ; //Ustawia timer0 z preskalerem 32
sei(); // włącz obsługę przerwań
while(1) // Program główny
{
if(overflow_ADC>=overflow_ADC_max)
{
LED_TOGGLE
overflow_ADC=0;
}
} //zamyka while
} //zamyka main
