Witam serdecznie
Napisałem krótki program wykorzystujący asynchroniczny licznik Timer2. Jako rezonator kwarcowy posłużył mi oscylator zegarkowy (32.768kHz). Program ma za zadanie generowanie przebiegu 1Hz na porcie PD1.
Program:
Dla układu w obudowie DIP wszystko chodzi bez problemu, jednak po przerzuceniu go do układu w TQFP program nie chce działać. Fusebity dla obu układów są ustawione identycznie. Dla TQFP pin 3, 5, 21 zwarte jako masa, pin 4,6,18 zwarte jako VCC, kondensator 100nF w pobliżu pinów zasilania. Wykluczam brak połączeń i zimne luty ponieważ zmontowałem już 2 układy: jeden na płytce drukowanej w docelowym urządzeniu, drugi "w pająku" na drugim scalaku.
Moim zdaniem problem tkwi w obwodzie obsługi rezonatora. Podczas dochodzenia co działa nieprawidłowo, ustawiłem w fusebitach taktowanie zewnętrznym oscylatorem i teraz już nie mam komunikacji z uC poprzez programator, pomimo, iż oscylator jest podpięty wraz z kondensatorami 30pF.
Na szczęście miałem jeszcze drugi scalak, więc walczyłem dalej. Przypadkowo podłączyłem odwrotnie złącze ISP i układ zaczął działać poprawnie... Okazuje się, że podpięcie zasilania do pinów MISO(16), SCK (17) oraz odłączenie Vcc i GND od zasilania sprawia, że układ funkcjonuje prawidłowo, chociaż nie jest to prawidłowy sposób.
Jeżeli ktoś spotkał się z podobnym problemem lub ma jakikolwiek pomysł to proszę o pomoc.
Z góry dziękuję
Napisałem krótki program wykorzystujący asynchroniczny licznik Timer2. Jako rezonator kwarcowy posłużył mi oscylator zegarkowy (32.768kHz). Program ma za zadanie generowanie przebiegu 1Hz na porcie PD1.
Program:
[syntax=c]#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define TIMER2_BUSY ((ASSR & 0x01) | (ASSR & 0x02) | (ASSR & 0x04))
SIGNAL(SIG_OUTPUT_COMPARE2){
cli();
if(PORTD & 0x02){
PORTD &= ~(1<<PD1);
}else{
PORTD |= (1<<PD1);
}
sei();
}
int main(void)
{
DDRD |= (1<<PD1);
PORTD |=(1<<PD1);
TIMSK &=~_BV(TOIE2);
ASSR |= (1<<AS2);
OCR2 = 0x7f;
TCCR2 &= ~((1<<WGM20)|(1<<COM21)|(1<<COM20));
TCCR2 |= (5<<CS20)|(1<<WGM21);
while(TIMER2_BUSY){
}
TIMSK |= (1<<OCIE2);
sei();
while(1)
{
}
return 0;
}[/syntax]Dla układu w obudowie DIP wszystko chodzi bez problemu, jednak po przerzuceniu go do układu w TQFP program nie chce działać. Fusebity dla obu układów są ustawione identycznie. Dla TQFP pin 3, 5, 21 zwarte jako masa, pin 4,6,18 zwarte jako VCC, kondensator 100nF w pobliżu pinów zasilania. Wykluczam brak połączeń i zimne luty ponieważ zmontowałem już 2 układy: jeden na płytce drukowanej w docelowym urządzeniu, drugi "w pająku" na drugim scalaku.
Moim zdaniem problem tkwi w obwodzie obsługi rezonatora. Podczas dochodzenia co działa nieprawidłowo, ustawiłem w fusebitach taktowanie zewnętrznym oscylatorem i teraz już nie mam komunikacji z uC poprzez programator, pomimo, iż oscylator jest podpięty wraz z kondensatorami 30pF.
Na szczęście miałem jeszcze drugi scalak, więc walczyłem dalej. Przypadkowo podłączyłem odwrotnie złącze ISP i układ zaczął działać poprawnie... Okazuje się, że podpięcie zasilania do pinów MISO(16), SCK (17) oraz odłączenie Vcc i GND od zasilania sprawia, że układ funkcjonuje prawidłowo, chociaż nie jest to prawidłowy sposób.
Jeżeli ktoś spotkał się z podobnym problemem lub ma jakikolwiek pomysł to proszę o pomoc.
Z góry dziękuję
