Hallo allemaal,
Het leek me leuk een nixie klok te gaan bouwen met het DCF77 atoomklok radiosignaal voor de klok. Ik had op een site gezien dat een Atmega8 daar goed voor te gebruiken is. Ik ben echter helemaal nieuw wbt AVR en dergelijke dus er zijn een aantal dingen die ik niet helemaal begrijp (programmeren kan ik al wel op beginnersniveau maar heb het nog nooit op hardware toegepast).
Ik heb een simpele breadboard opstelling met een ledje dat moet knipperen als ik 5 volt op PD1 zet. Hiervoor heb ik een programmatje met WinAVR geschreven en het met ponyprog op de Atmega8 gezet. init() Zet PB1 als uitgang en blinking() maakt de poort afwisselend hoog en laag zodat de aangekoppelde led gaat knipperen. Hier de code:
code:
int main(void)
{
init();
while(1)
{
if(bit_is_set(PIND,1))
{
blinking(3);
}
}
}
Tot zover gaat alles goed, en in de simulatie van AVR Studio werk het ook zoals ik bedacht had.
Het eerste probleem is dat om de een of andere reden mijn pinnen altijd hoog lijken te zijn. Ik hoef de reset ook niet met een pull up te verbinden, hij doet het gewoon. Zodra ik de reset met de 0 volt verbind reset hij zich pas daadwerkelijk.
Pin B1 is ook steeds hoog, dus het ledje knippert constant en gaat pas uit als ik hem op de 0 volt zet.
Als ik hem door wil meten met mijn multimeter gaat het ledje ook uit en geeft de multimeter ook zoals werwacht 0 volt aan.
Ik heb nog even getest met de interne pull up aanzetten (PORTD = 0xFF), dan staat er inderdaad +5V op de pinnen als ik het meet en werkt hij verder nog hetzelfde.
De vraag dus: is dit een gevolg zijn van het monteren op een simpel breadboard of kan er iets anders aan de hand zijn?
Dan nog een andere programmeer vraag. Ik ben zelf Java gewend en weet dus niet of dit 'typisch C gedrag' is.
De blinking() method is als volgt
code:
void blinking(int times)
{
int i = 0;
int msec = 500;
while(i<times)
{
/* set output to 5V, LED on */
PORTB|= _BV(PB1);
_delay_ms(msec);
/* led off, pin=0 */
PORTB&= ~_BV(PB1);
_delay_ms(msec);
i++;
}
}
Times is het aantal keer dat de led moet knipperen als de method opgeroepen wordt. msec is het aantal miliseconden dat de led aan moet zijn 'per knipper'.
Ik weet trouwens dat int gebruik niet zo efficient is hier wegens kleine getallen maar da's gewoon gemakshalve, en de for loop deed niet gelijk wat ik wilde dus handmatig met de i teller.
Maak ik daar nou van
code:
void blinking(int times, int msec)
(...)
//int msec = 500;
(...)
Dus msec aangeven in de method call en weg gecomment in de code, dan neemt mijn code ineens van 158 bytes (1,9% full) naar 3592 (43,8%) in grootte toe. Dit is vergelijkbaar met de grootte van mijn eerste code als ik de optimization op -O0 zet ipv -O1. Er gaat denk ik dus iets mis met de optimalisatie, maar ik heb geen idee wat dat kan zijn of hoe ik het moet oplossen.
Bedankt voor jullie tijd en eventuele hulp