Forum: Mikrocontroller und Digitale Elektronik Eingang für Interrupt_Unterprogramm


von Hua Guo (Gast)


Lesenswert?

Hallo,

Wie kann man den Eingang für ein Unterprogramm von Interrupt mit C
schreiben?
vielen Dank!

Hua

von Hubert G. (huvogs)


Lesenswert?

Je nach dem wodurch der Interrupt ausgelöst wurde, für ADC z.B.:
ISR(ADC_vect){} nachzulesen in der AVR-libc Modules.

von Hua Guo (Gast)


Lesenswert?

Vielen Dank!
Jetzt benutze ich Atmega8. Die Interrupt Vector No. ist 3, Programm
Addresse ist 0x002.
Wie kann ich meine Interrupt_Programm mit diese Interrupt Vector
Verbindung machen?

von Hubert G. (huvogs)


Lesenswert?

ISR(INT1_vect){}

von Hua Guo (Gast)


Lesenswert?

Entschuldigung ich bin eine Anfangin.
Welche Headdatei soll ich include?
vielen vielen Dank!

von Hubert G. (huvogs)


Lesenswert?

#include <avr/interrupt.h>
#include <avr/io.h>

von Hua Guo (Gast)


Lesenswert?

ISR(INT1_vect)
{
  USART_TransmitString(" externe Interrupt happend ", 27);
  return;
}

int main(void)
{
  USART_Init(9600);
  SREG = 0x80;
  MCUCR = (1<<ISC11) | (1<<ISC10);
  GICR = (1<<INT1);
  for(;;);
}

Bei mir funktioniert noch nicht.
Wenn ein Interrupt happend, kann ich keine Ergebnisse bekommen. Welche
Fehler habe ich gemacht?
Vielen Dank!

von Hubert G. (huvogs)


Lesenswert?

In der ISR ein Port mit einer LED dran setzen dann sieht man ob der
Interrupt oder der USART nicht funktioniert.
Der PIN PB3 ist der Eingang: The rising edge of INT1 generates an
interrupt request.

von Hua Guo (Gast)


Lesenswert?

Ich habe ein anderes Programm für diesen Interrupt, es benutzt nicht
ISR, sonder lese direkt die Interrupt Falg Bit.

int main(void)
{
  USART_Init(9600);
  MCUCR = (1<<ISC11) | (1<<ISC10);
  GICR = (1<<INT1);
  while(!(GIFR & (1<<INTF1)));
  USART_TransmitString(" externe Interrupt happend ", 27);
  for(;;);
}

Es funktioniert. Das bedeutet, wenn die Schalter einschaltet, tretet
ein Interrupt und funktioniert der USART auch.
Ich denke, es gibt irgentwo Fehler in meinem Interrupt_Programm.

Soll ich "INT1_vect" selbst definieren? Oder für boot soll ich etwas
machen? Oder......?

Und ich wollte noch fragen, welcher Port ist "ein Port in der ISR"?
Vielen Danke!

von Hubert G. (huvogs)


Lesenswert?

Diese Schreibweise "ISR(INT1_vect)" gilt erst ab GCC.Version 4.x, bei
einer älteren Version muss es heißen: zusätzlich
#include <avr/signal.h>
 und anstelle von ISR(INT1_vect) gehört:
SIGNAL(SIG_INTERRUPT1)

von Hua Guo (Gast)


Lesenswert?

Wunderbar! Es funktioniert! herzlichen besten Dank!

Ich wollte noch fragen, benutzt man SIGNAL auch für Interrupt? Welche
Unterschied gibt es zwischen ISR und SIGNAL?

von Hubert G. (huvogs)


Lesenswert?

ISR heist es ab GCC_Version 4.x
Vorher war SIGNAL ein nicht zu unterbrechender Interrupt.
INTERRUPT konnte durch einen anderen INTERRUPT unterbrochen werden.
Ab GCC_Version 4.x gibt es nur mehr ISR = SIGNAL alt

von Hua Guo (Gast)


Lesenswert?

Danke!
Ich wollte noch fragen, wo kann ich wissen die Name für ein Interrupt?
z.B. Für External Interrupt Request1 ist die Name "SIG_INTERRUPT1".
Was ist für "USART,Rx Complete"? usw.

von Hubert.G (Gast)


Lesenswert?

http://download.savannah.gnu.org/releases/avr-libc/
Unter avr-libc Modules Interrupts gibt es eine Liste mit den diversen
Namen. Achtung! auf die richtige Version achten.

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.