Frage zu interrupts

Gast #2752446
Lesenswert?

Hey Leute eine kurze Frage, da wir hier GAR NICHMTEHR weiterkommen!
Was machen wir mit dem interrupt falsch?

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

ISR(INT0_vect)
{
  PORTD = 0x80;
}

int main()
{
  DDRD = 0xFB;
  MCUCR = 0x0F;
  sei();
  PORTD = 0x40;


}

(Falls ihr des hinkriegt schicken wir euch noch unseren richtigen Code 
;) )
Versuchen gerade was mit RFID´s hängen aber mit den Interrupts sowas 
von, sodass wir gerade verzweifeln.
AVR Studio 4, Atmega8 Mikrocontroller.

Danke schonnmal für eure Hilfe

MfG Interruptor
Gast #2752459
Lesenswert?

Ja das return fehlt^^. Die Funktion ist ein Test und soll so einfach wie 
möglich gestrickt sein. D.h. sie hat keien sinnvolle Aufgabe. Sie soll 
uns nur Zeigen, ob unser Interrupt funktioniert
Gast #2752470
Lesenswert?

Sry da war wohl ein Witzbold schnell mal am PC-.-
Ja mit ner while schleife will das ganze ding auch nich tun. wir sind 
total verzweifelt. Könnte einer vllt mal einen total einfachen code für 
ein interrupt posten?
Gast #2752490
Lesenswert?

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

Logisch falsche Reihenfolge - hier spezielles Include vor dem 
allgemeinen Include.

>   MCUCR = 0x0F;

Was soll diese Zeile laut Datenblatt bewirken?

>  PORTD = 0x80;
>  DDRD = 0xFB; // PORTD Pin2 Eingang, alle anderen Ausgang
>  PORTD = 0x40;

Was erwartet ihr in eurer Schaltung von PORTD Pin7 und Pin3?

Was in eurer Schaltung soll INT0 an PRTD Pin2 auslösen? Was hält den 
Ruhepegel (= Nicht-IRQ) auf HIGH?

> while(1)...

Diese Arbeitsschleife fehlt. Grob gesagt: main() sollte in einem µC 
Programm regulär nicht verlassen werden.

Die "Falle" hier: Die avr-libc fügt ein while(1); im Exitcode ein. Aber 
das ist nur ein Däumchendrehen.

Ich denke, dass ihr eine ständige Reaktion auf Pin2 und Wechsel an den 
Pins 7 und 3 vermisst. Das wäre mit obigem Code erklärlich.
Gast #2752491
Lesenswert?

GICR ist gesetzt, allemöglichen Hilfen und Datenblätter und Codes schon 
durchgelesen aber wir kommen einfach nicht weiter. Könnte es an einer 
Compiler-Version liegen? Der Code an sich müsste ja stimmen....oda?!
Gast #2752499
Lesenswert?

Der µC macht hinter main weiter !
Da sollten zwar nur nops stehen bis er am ende vom flash ankommt. Dann 
läuft der PC über und sollte wieder bei 0 beginnen. Da sollte der Reset 
Vector stehen und ihn erneut in die main schicken. Der Interupt müßte 
funktionieren.
Ist aber trotzdem falsch programmiert.
Probiert doch mal den INT0 anzuschalten im GICR Bit 6.
Gast #2752522
Lesenswert?

Wenn ihr schon keine Hexadezimalen Zahlen gut lesen und schreiben könnt, 
DANN macht sowas doch nicht !
Dann benutzt wenigstens 0b00000100 !
Besser noch PORTD |= (1<<PD2); oder
GICR |= (1 << INT0) | (1 << INT1);
Gast #2752531
Lesenswert?

> Ja das Interrupt soll ja noch in der main aufgerunfen werden
aber nicht mit PORTD = 0x40;
sondern mit
PORTD = 0x04;

> Erstmal danke. Wir haben "einen" Fehler gefunden
> (Aber nicht in dem kleinen Programm hier sondern in unserem
> Hauptprogramm)
jaja

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren