Hallo. Ik ben nieuw met AVR's en zit momenteel dus met een AT M16(L) te experimenteren, tot nu toe verloopt alles goed gelukkig
Waarom de titel 'algemeen' bevat? Omdat ik na deze vraag vast nog wel meer vragen heb. (natuurlijk mag iedereen ook in dit topic vragen stellen, graag zelfs)
Op het moment heb ik aan de avr op PORTA 8 ledjes aangesloten, en deze volgen 3 patronen achter elkaar, en dat gaat eindeloos door. Nu ben ik aan het kijken met interrupt routines enzo. Op pin 16 (PD2, INT0) heb ik een schakelaar (open contact) naar de massa gelegd met een pull up weerstand van 10K eraan naar Vcc. Als ik op het knopje drukt moeten het led patroon worden onderbroken, en gaan dan eventjes allemaal aan.
De volgende code gebruik ik : (een deel)
void extinterrupt_aan(void)
{
MCUCR = (1<<ISC01) | (0<<ISC00); //Set Interrupt on Falling Edge
GICR |= ~_BV(INT0); //Enable External Intterupt 0
sei(); //Global Enable all interrupts
}
//--- Interrupts Vector for EXT INT0 ---
SIGNAL(SIG_INTERRUPT0)
{
int i3;
PORTA = (255); //Laat PORTA voor een tijdje aan gaan
for (i3=0; i3<2; i3++)
{
_delay_loop_2(65000);
}
}
Echter dit doet het niet, maar wanneer ik CR |= ~_BV(INT1); gebruik ipv INT0 dan doet de code het perfect zonder problemen. (ik ben er 250% zeker van dat t knopje op INT0 is aangesloten
)
Waarom gaat het fout?
Alvast bedankt!
De fout lijkt te zitten in de regel
GICR |= ~_BV(INT0);
Je stelt hier niet de complement van INT0 in, maar zet tegelijkertijd alle andere bits in het GICR register op 1. Resultaat: alle interrupts cq instellingen enabled BEHALVE INT0!
Oplossing: GICR |= _BV(INT0)
Of beter: GICR |= (1<<INT0)
LET OP: Als je WinAVR/GCC gebruikt: de BV macro's zullen in toekomstige versies verdwijnen en moet je dus niet meer gebruiken. Zie manual.
Misschien een overbodige opmerking, maar het is niet aan te raden delay routines in signal interrupt routines te zetten. In het algemeen moet je interrupt routine zo kort mogelijk zijn!
Ok het werkt! Top! Ik ben ook tegelijk bezig met C leren en was aan het kijken naar de manieren om een bit te setten.
EDM > Bedankt voor de tip, dit keer was alleen bedoeld om het zichtbaar te maken.
Ik heb gezocht op avrfreaks over Stacks, maar het is mij niet helemaal duidelijk wat ik ermee moet. Kan iemand mij dat verhelderen?
Op 17 november 2003 15:18:23 schreef Nofri:
... Ik heb gezocht op avrfreaks over Stacks, maar het is mij niet helemaal duidelijk wat ik ermee moet. Kan iemand mij dat verhelderen?
Het begrip stack komt op twee niveaus terug wanneer je een microprocessor aan het programmeren bent:
Hoog niveau (C): Tijdelijke opslagplaats voor het opslaan van variabelen en functie pointers. Wanneer functie A() bijvoorbeeld recursief wordt aangeroepen worden alle variabelen tijdelijk op de stack geplaatst. Wanneer het programma weer terug keert naar de oorspronkelijke functie worden de in de stack opgeslagen variabelen weer ingeladen. Bij complexe programma's (of slechte programmeer structuren) kan het zijn dat er zoveel variabelen in de stack worden geplaatst dat deze volraakt. Door het aanpassen van de code kun je direct invloed uitoefenen op deze vorm van stack gebruik. Als een beginner zou ik me hier voorlopig nog geen zorgen over maken.
Ook op een lager niveau (gecompileerde assembly code) heb je te maken met de stack. De processor houdt bij waar ze in de programma code zij bezig is en gebruikt de variabelen op de stack om zaken als loops en functie aanroepen mogelijk te maken. Elk goed boek over microprocessoren zal een gedetailleerde beschrijving geven. Het is leuk cq. goed dat je weet wat de stack is, maar niet direct noodzakelijk voor een beginnende C programmeur. Deze vorm van stack gebruik hangt niet alleen af van je C-code, maar ook voor een groot deel van de (optimalisatie) instellingen van je compiler.
Ik wil nu bijvoorbeeld 5 drukknoppen aansluiten. Onafhankelijk van elkaar, maar als ik 1 van deze 5 indruk moet het wel een interrupt opwekken. Kan ik dit simpelweg als volgt doen? : --> http://members.home.nl/nofri.djohor/SwitchInt.gif
Edit : oeps, de 2e pull up weerstand moet naar de andere schakelaar toe 
[Bericht gewijzigd door Nofri op ]
Een AVR heeft interne pullup weerstanden die je kunt gebruiken. Het schema is verder goed. Hou wel rekening in de software met het bouncen van de knoppen?
Op 21 november 2003 19:46:09 schreef darksteel83:
Een AVR heeft interne pullup weerstanden die je kunt gebruiken. Het schema is verder goed. Hou wel rekening in de software met het bouncen van de knoppen?
Ok dus de 2 weerstanden kunnen gewoon weg. En debouncen kan gewoon simpelweg door een kleine pause te houden na het indrukken van de knop toch?
Dus zoiets :
Wordt de knop ingedrukt? --> Ja, delay xx ms --> voer opdracht uit.
RES
RES
INT kan werken op stijgende of dalende flank, met een pull-up (intern of extern) dus een dalende flank (drukken is naar GND kortsluiten) AVR interne pull-up is beetje gevoelig houdt daar rekening mee ? (korte draadjes, spoortjes), anders 10k extern. Voor debounce iets van 20 - 30 msec nemen, niet teveel anders merkt de gebruiker het.
Er zijn ook andere methoden. Of debounce chipjes eraanhangen. Of via wat poortjes (staat wel ergens op internet) Soms gebruikt men een Ctje om te ontdenderen, schijnt ook te werken.