Witam,
Posiadam ATMEGA128A z całą płytką stąd
http://serwis.avt.pl/manuals/AVT1752.pdf z rezonatorem kwarcowym 16MHz i podłączam do tego kartę przekaźników (zaprojektowana samodzielnie). Napisałem do tej karty obsługę w AtmelStudio 7 (kod poniżej). Na symulatorze wszystko jest ok program śmiga bez zarzutu, wrzucam go po ISP do ATMEGI i po odpaleniu wykonuje się tak jakby tylko RC_Initalize(); i nic z pętli while, żaden z przekaźników się nie załącza (podłączając diody też żadna się nie świeci). Ten sam kod wrzuciłem na ATTINY2313 i na ATMEGA88 i wszystko działa bez zarzutu z tą kartą i z tymi avrami a na 128A już nie. W czym może być problem? Fusebity w ATMEGA128A zmieniłem tylko dla low na 0xFF żeby zewnętrzny kwarc 16MHz obsługiwał. Dla testów zmieniłem też linie RC_PORT = 0x00; na RC_PORT = 0xFF i po uruchomieniu układu załączają się przekaźniki ale ich stan się nie zmienia, więc stąd podejrzenie że ATMEGA128A nie wchodzi do pętli while lub nie wraca z voida RC_Initalize() tylko pytanie dlaczego tak się dzieje? Jeśli kod przerzucę kod z RelayCard.h i RelayCard.c do main.c to wszystko jest ok układ działa prawidłowo. Dodatkowo na ATMEGA128A nie działa mi tak naprawdę nic na zew. bibliotekach np LCD który działa bez problemu na ATMEGA88 na tym samym kodzie na 128A już nie działa, tak samo ENC28J60 który mi hula z ATMEGA88 na ATMEGA128A (po wydaje mi się właściwej konfiguracji) też nie działa. Ta 128A może być jakaś walnięta albo coś?
main.c
Kod:
//#define F_CPU 16000000UL to mam w ustawieniach projektu
#include <avr/io.h>
#include <util/delay.h>
#include "RelayCard.h"
int main(void)
{
RC_Initalize();
while(1)
{
RC_Enable_Port(OUT1);
_delay_ms(1000);
RC_Enable_Port(OUT2);
_delay_ms(1000);
RC_Enable_Port(OUT3);
_delay_ms(1000);
RC_Enable_Port(OUT4);
_delay_ms(1000);
RC_Disable_All_OUT();
_delay_ms(1000);
}
}
RelayCard.h
Kod:
#include <avr/io.h>
#define RC_DIR DDRC
#define RC_PORT PORTC
#define OUT1 PC0
#define OUT2 PC1
#define OUT3 PC2
#define OUT4 PC3
void RC_Initalize(void);
void RC_Enable_Port(uint8_t);
void RC_Disable_All_OUT(void);
oraz RelayCard.c
Kod:
#include <avr/io.h>
#include "RelayCard.h"
void RC_Initalize(void)
{
RC_DIR = 0xFF;
RC_PORT = 0x00;
}
void RC_Enable_Port(uint8_t p)
{
RC_Disable_All_OUT();
RC_PORT |= (1<<p);
}
void RC_Disable_All_OUT(void)
{
RC_PORT &= ~(1<<OUT1);
RC_PORT &= ~(1<<OUT2);
RC_PORT &= ~(1<<OUT3);
RC_PORT &= ~(1<<OUT4);
}