Forum: Compiler & IDEs Interrupt für eingänge/ AVR


von Marco M. (marcom)


Lesenswert?

Hallo liebe Leute,

ich habe folgendes Problem: Ich versuche im Moment (nur im Simulator) 
eine Interruptgesteuerte Eingangsabfrage zu machen. Ich hab mich im GCC 
Tutorial ein wenig schlau gemacht und dann bin ich zu dem folgenden 
Quellcode gekommen:
1
#include <avr/io.h>         
2
#include <avr/interrupt.h>
3
#include <stdint.h>
4
5
int main(void)
6
{
7
  
8
9
  DDRD = 0x00;
10
  DDRA = 0xFF;
11
  PORTA = 0x00;
12
  
13
  
14
15
  GIMSK |= (1 << INT1);                 // Interrupt von INT1 enablen
16
  MCUCR |= (1 << ISC10) | (1 << ISC11); // Interrupt on rising edge
17
  sei();
18
19
  for (;;)
20
  {
21
  
22
   PORTA=PORTA+1;
23
24
  }
25
  
26
}
27
28
SIGNAL (SIG_INTERRUPT1)
29
{
30
PORTA=0x00;
31
}

Das Programm soll PortA hochzählen lassen, und sobald am INT1 eine 
Änderung da ist, soll er ihn wieder 0 setzen.

Ich danke für eure Hilfe bereits im Voraus

von Patrick (Gast)


Lesenswert?

Und was genau ist Dein Problem?

von Marco M. (marcom)


Lesenswert?

richtig^^ entschuldigt

Folgende Fehlermeldung bekomme ich vom Compiler:

"error: 'GIMSK' undeclared (first use in this function)"

von Patrick (Gast)


Lesenswert?

Ich weiss nicht welchen Controller Du verwendest, aber schau doch mal im 
Datenblatt. Beim ATmega16 müsstest Du GIMSK durch GICR ersetzen.

von Marco M. (marcom)


Lesenswert?

Du hast Recht ich verwende einen ATMega 16. Nun hab ich dies 
ausgetauscht +Signal durch ISR ersetzt (veraltete Variante...) Nun 
springt er mir aber nicht in die Routine. Wo liegt mein Fehler?

von Patrick (Gast)


Lesenswert?

Wie simulierst Du denn eine steigende Flanke am INT1? Was ist mit den 
Pull-up Widerständen?

von Marco M. (marcom)


Lesenswert?

Im Datenblatt vom ATmega 16 steht, dass dieser zusammenhängt mit dem Pin 
PD3. Deswegen setze ich diesen einfach auf High im Simulator

von Stefan E. (sternst)


Lesenswert?

Marco Müllner wrote:
> Deswegen setze ich diesen einfach auf High im Simulator

Wo genau, in PIND oder vielleicht in PORTD?

von Patrick (Gast)


Lesenswert?

Hast Du denn
1
SIGNAL (SIG_INTERRUPT1)
durch
1
ISR (INT1_vect)
ersetzt?

von Marco M. (marcom)


Lesenswert?

Im PIND 3 natürlich... warum sollte ich den ausgang high setzen?

von Marco M. (marcom)


Lesenswert?

Patrick wrote:
> Hast Du denn
>
1
SIGNAL (SIG_INTERRUPT1)
2
>
> durch
>
1
ISR (INT1_vect)
> ersetzt?

ja habe ich

von Stefan E. (sternst)


Lesenswert?

Marco Müllner wrote:
> Im PIND 3 natürlich... warum sollte ich den ausgang high setzen?

Oh entschuldige, dass ich ein mögliches Versehen deinerseits in Betracht 
gezogen habe. Ich wusste ja nicht, dass du dagegen gefeit bist.

von Marco M. (marcom)


Lesenswert?

Stefan Ernst wrote:
> Marco Müllner wrote:
>> Im PIND 3 natürlich... warum sollte ich den ausgang high setzen?
>
> Oh entschuldige, dass ich ein mögliches Versehen deinerseits in Betracht
> gezogen habe. Ich wusste ja nicht, dass du dagegen gefeit bist.

sorry^^ Es nervt mich nur im Moment ein wenig. Könnte es vllt sein dass 
ich noch die iom16.h einbinden muss?

von Stefan E. (sternst)


Lesenswert?

Marco Müllner wrote:

> Könnte es vllt sein dass ich noch die iom16.h einbinden muss?

Nein, das geschieht in io.h automatisch.

Im Simulator richtigen Controller eingestellt?

von Marco M. (marcom)


Lesenswert?

Ja es ist der ATMega 16 eingestellt

von Stefan E. (sternst)


Lesenswert?

Dann kann ich dir auch nicht weiterhelfen, denn der Code (mit den 
Änderungen) funktioniert bei mir im Simulator einwandfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.