Witam Koledzy
Mam następujący problem. Napisałem programowy 8 kanałowy PWM do sterowania diodami realizowany w przerwaniu. Wszystko działa do czasu rozłączenia i ponownego załączenia zasilania. uC się wysypuje i zdaje się wystawiać na wyjścia losowe stany. W przypadku połączonego programatora (druty z rezystorami pod LPT) sytuacja występuje po każdorazowym zaniku zasilania, przy braku programatora średnio 1 na 10 razy.
Teraz najciekawsze: wszystko to występuje tylko wtedy gdy wyłączę dzielenie częstotliwości taktowania oscylatora przez 8 ( co daje częstotliwość równą 8 Mhz na wewnętrznym oscylatorze RC,wszystkie inne ustawienia fusów domyśle), w przypadku taktowania z prędkoscia 1 Mhz nic się nie wysypuje, ani w tym, ani w innych programach.
Co może być przyczyną takiego stanu rzeczy? Czy wyłączając dzielenie przez 8 należy podjąć jeszcze jakieś dodatkowe działania? Oczywiście w kompilatorze częstotliwość została zmieniona w kompilatorze ale to chyba i tak bez znaczenia przy braku korzystania z delay. Dodatkowo reset został podciągnięty do Vcc przez R47k. Zakłócenia też raczej nie wchodzą w grę bo obciążenie to 8 diod, dodatkowo puszczone przez ULN208.
Dodatkowo załączam kod programu, być może tu tkwi problem.
Proszę poprawić tytuł!
Robak
Mam następujący problem. Napisałem programowy 8 kanałowy PWM do sterowania diodami realizowany w przerwaniu. Wszystko działa do czasu rozłączenia i ponownego załączenia zasilania. uC się wysypuje i zdaje się wystawiać na wyjścia losowe stany. W przypadku połączonego programatora (druty z rezystorami pod LPT) sytuacja występuje po każdorazowym zaniku zasilania, przy braku programatora średnio 1 na 10 razy.
Teraz najciekawsze: wszystko to występuje tylko wtedy gdy wyłączę dzielenie częstotliwości taktowania oscylatora przez 8 ( co daje częstotliwość równą 8 Mhz na wewnętrznym oscylatorze RC,wszystkie inne ustawienia fusów domyśle), w przypadku taktowania z prędkoscia 1 Mhz nic się nie wysypuje, ani w tym, ani w innych programach.
Co może być przyczyną takiego stanu rzeczy? Czy wyłączając dzielenie przez 8 należy podjąć jeszcze jakieś dodatkowe działania? Oczywiście w kompilatorze częstotliwość została zmieniona w kompilatorze ale to chyba i tak bez znaczenia przy braku korzystania z delay. Dodatkowo reset został podciągnięty do Vcc przez R47k. Zakłócenia też raczej nie wchodzą w grę bo obciążenie to 8 diod, dodatkowo puszczone przez ULN208.
Dodatkowo załączam kod programu, być może tu tkwi problem.
#include <avr/io.h>
#include <avr/interrupt.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define tbi(sfr, bit) (_SFR_BYTE(sfr) ^= _BV(bit))
volatile unsigned char DIODY,licznik=255,flaga_7ms=0;
volatile unsigned char tablica[8]={255,3,2,10,10,2,3,255};//0 kompletne //wylaczenie 255 max
void init(void);
int main()
{
unsigned char i,a=0,b=10,a1=0,b1=0,licznik1=0,speed=7,program=0;
unsigned char pom[8];
unsigned int pomocniczy_licznik=0;
init();
while(1)
{
}
return(0);
}
void init(void)
{
DDRD=0xff;
PORTD=0xff;
DDRB=0xff; //ustawienie linii portu B jako wyscie
PORTB=0x00;
//timer0
TCCR0B = 0b00000001; //preskaler 1 (konieczne do ustawienia!!)
TIMSK |= (1 << TOIE0); // aktywne przerwanie overflow
TCNT0 = 6;
sei();
}
//obsluga przerwania od timera
SIGNAL (SIG_OVERFLOW0)
{
licznik--;
DIODY=0;
//diody 0-7
if(tablica[7]>licznik){sbi(DIODY,PB0);}
if(tablica[6]>licznik){sbi(DIODY,PB1);}
if(tablica[5]>licznik){sbi(DIODY,PB2);}
if(tablica[4]>licznik){sbi(DIODY,PB3);}
if(tablica[3]>licznik){sbi(DIODY,PB4);}
if(tablica[2]>licznik){sbi(DIODY,PB5);}
if(tablica[1]>licznik){sbi(DIODY,PB6);}
if(tablica[0]>licznik){sbi(DIODY,PB7);}
if (licznik==0){flaga_7ms=1;}
PORTB=DIODY;
}
Proszę poprawić tytuł!
Robak