Toon posts:

[atmega16 mc] interrupt

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben wat aan het experimenteren met een atmega16 maar heb een probleem met interrupts. Als ik port D2 0 maak gebeurt er helemaal niets. De led op port A.0 zou 10x achter elkaar snel moeten knipperen.

Mijn programma ziet er zo uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <mega16.h>

interrupt [EXT_INT0] void ext_int0_isr(void)
{
 unsigned int x,y;
  for(y=0; y < 10; y++) {
   for(x = 0; x < 0xff; x++);
   PORTA = PORTA ^ 0x1;  // toggle bit0 van portA 
  }
  
}

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

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

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

  while(1){  
    for(x = 0; x < 0xffff; x++);
    PORTA = PORTA ^ 0x1;  // toggle bit0 van portA
  }
  return 0;
}

Verwijderd

Ik heb verder geen verstand van die atmega, maar zou het niet kunnen zijn dat je wachtlusjes weggeoptimaliseerd worden door de compiler?

Verwijderd

Topicstarter
nee, de led knippert namelijk wel, alleen niet op verschillende snelheden

Mvg Boris.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 12-05 20:13
Moet je eerst een globale int vlag aanzetten misschien? Btw waarom zou ie op verschillende snelheden moeten gaan knipperen? De code in de isr staat wordt op dezelfde snelheid uitgevoerd als de code die in je main staat.

[ Voor 61% gewijzigd door farlane op 09-02-2005 22:55 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • jan-marten
  • Registratie: September 2000
  • Laatst online: 18:06
Je led knippert wel maar niet op verschillende snelheden???
Dat kan toch ook niet met die routine (althans, dat ding zal zo snel zijn dat jij dat niet kunt zien)...
Misschien dat je een interrupt in een interrupt krijgt? Dan gaat het bij mij ook meestal mis. Even de interrupt uitschakelen als je in die routine komt.

  • Dirtbiter
  • Registratie: Maart 2002
  • Laatst online: 08-05 10:48
Het is logisch dat je ledje niet sneller gaat knipperen.

Je main-loop roept iedere keer die while aan, waar je 0xFFFF keer je ledje toggelt, voor elke x. Er wordt dus niet gewacht, waardoor het ledje zo snel getoggeld wordt als de processor is.

Bij een interrupt wordt het ledje 10*0xFF keer getoggeld, maar nog steeds met dezelfde snelheid.

Er is nergens in je code een wachtloop, dus is het nogal logisch dat je dezelfde snelheid blijft houden.

Logischer zou zijn om je led bij elke interrupt 1 keer te toggelen, maar dan moet je wel regelmatige interrupts hebben, en ervoor zorgen dat gedurende een bepaalde tijd, de main-loop de led niet aanstuurt.

Anders kun je proberen om een wachtloop erin te zetten, eventueel met een do-nothing statement in assembler, maar dan moet je er op letten dat deze niet uitgeoptimaliseerd wordt door de compiler.
Pagina: 1