hey,
ik ben een aantal dagen geleden begonnen met de attiny2313, ik heb hem ondertussen aan de praat gekregen en met succes een lopend led gemaakt, code hieronder :
#include <avr/io.h>
#include <util/delay.h>
int main()
{
DDRD = 0x7f;
while(1)
{
PORTD = (1 << PD0);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD1);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD2);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD3);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD4);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD5);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD4);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD3);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD2);
_delay_ms(15000);
PORTD = 0;
PORTD = (1 << PD1);
_delay_ms(15000);
PORTD = 0;
}
return 0;
}
mijn vraag is nu, ik heb een drukknop aangesloten op PCINT0, hoe kan ik de snelheid waarmee de ledjes lopen sneller laten gaan door op de knop te drukken? Mss ook een tip om mijn code hierboven korter te maken. Ik weet dat er veel resources te vinden zijn op het net, maar ik ben tot hier geraakt momenteel en snap niet echt hoe ik met die interrupts overweg moet om een var te veranderen.
alvast bedankt
Dat zijn vrij elementaire programmeervragen.
Ten eerste kan je de code een stuk verkorten door een loop/lus te gebruiken (hint: die PD0, PD1, etc. zijn allemaal opeenvolgende waarden. Als je weet wat die << precies doet kunt je wel iets verzinnen).
Voor die interrupt: interrupts kun je in deze context als een functie beschouwen. Je moet dus een variabele delen tussen twee functies (hint: globale variabele). Ik bespaar je wat ellende: die _delay_ms kan je geen variabele meegeven (de compiler doet daar wat rare dingen mee waardoor de parameter een constante moet zijn). Je zal dus je delay moet splitsen in aparte delays met een if/loop.
Een geavanceerde manier zou werken met een timer die je een interrupt laat genereren als deze een bepaalde (instelbare) waarde bereikt. Op die manier kan je microcontroller ook iets anders doen terwijl hij wacht.