hellow...
ik ben op zoek naar een manier om in C leds aantesturen met de ATmega16, het liefts met codevision want daar ben ik al mee begonnen.
Ik wil 8 leds aansturen, met verschillende methodes.
Bijvoorbeeld een methode dat de leds 4 om 4 branden of dat ze om en om branden of een soort van lopende led..

HELP ME PLEASE!!

ik werkte tot nu toe altijd met imagecraft / iccavr (ook in C dus).

Maar je kan toch gewoon elke pen afzonderlijk (de)activeren?

Je kan bv controleren of een pen hoog of laag is voor de werkingsmogelijkheid. hoog = bv. leds 1,3,5 en 7 aan. laag = bv. leds 2,4,6,8 aan.

in een interrupt lees je dan de toestand van deze pen uit. En dan roep je de juist functie aan waar je de leds (de)activeerd.

vb:

portc = portc | 0x01 --> gaat PORTC0 hoog maken en de andere pennen onveranderd laten.

Is het dit wat je bedoeld?

ja gedeeltelijk wel.
ik wil door middel van knop(knoppen) van methode veranderen..
Ik weet niet precies hoe ik dat moet doen.., wat de beste manier is om dat te realiseren

alvast bedankt voor je hulp

stel dat als je een knop indrukt dat de pen op je µC laag wordt:

in een interrupt ga je dan controleren of je knop is ingedrukt of niet.

je neemt de huidige toestand van de pen
je vergelijkt deze met de vorige

situatie 1) -> is de vorige toestand hoog & de huidige laag --> knop is ingedrukt geworden -> voer de juiste actie uit

situatie 2) -> is de huidige toestand hoog? --> knop is niet ingedrukt -> niets doen

situatie 3) is de vorige toestand laag & de huidige laag? -> knop is nog steeds ingedrukt -> actie opnieuw uitvoeren of niets doen (afhankelijk wat je wilt)

op het einde van de interrupt ga je de "vorige-toestand" van de knop onthouden

voorbeeld: port A pen 0 is de pen waar je knop op hangt. Als je deze indrukt wordt deze laag getrokken naar de massa.

main functie()
...
int huidige_toestand = 1;
vorige_toestand = porta & 0x01 (deze variabele is nu 0 of 1)

interrupt functie()
{
int werkingsmodus;
if(vorige_toestand == 0x01 && huidige_toestand == 0x00)
{
werkingsmodus = 1;
}

vorige_toestand = porta & 0x01; (is de toestand van de pen weer onthouden)

if(werkingsmodus==1)
{
start functie leds 1,3,5 en 7 aandoen bijvoorbeeld)
}

}

deze interrupt is natuurlijk uit te breiden met meerdere knoppen en / of werkingsmodussen

vanaf 5 knoppen kan je deze opnemen in een matrix om ingangspennen op je µC te sparen.

is goed man..thnxx
't is wel duidelijk wat je voor me hebt gestuurd, maar ik had ook een ander voorbeeld van een ext interrupt..
en er zijn hier wat dingen gebruikt wat ik bij jou voorbeeld niet heb gezien..
maar ik wist niet hoe ik deze methode precies moest toepassen.

#include <mega16.h>

interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTA = PORTA ^ 0x1; // toggle bit0 van portA
}

int main(void) {
DDRA = 0x01; // bit 0 port A

GICR = 0x40; // enable externe interrupt bit INT0
MCUCR = 0x02; // ISC0 bit (neergaande flank)

#asm("sei"); // zet interrupt flag

while(1) ; // doe niets

return 0;
}

klopt, externe interrupt is ook een oplossing (sneller misschien)

als de externe interrupt pen een hoog of laag (staat wel in de datasheet) ontvangt springt het programma direct naar een interruptfunctie.

Daar bepaal je dan wat met de LEDs moet gebeuren. Na de afhandeling hiervan gaat je programma terug gewoon verderdraaien (in de while(1) dus in dit geval)

Wil je meerdere toetsen gebruiken, dan zal je niet toekomen met je externe interrupts...