Forum: Mikrocontroller und Digitale Elektronik Frage zu interrupts


von Interruptor (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Preisfrage (an Interruptor): Was passiert am Ende von main()?

von Interruptor (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Interruptor schrieb:
> Ja das return fehlt^^.

Setzen, 6.

von Rene H. (Gast)


Lesenswert?

Irgendwo sollte da noch ein while(1) stehen ;-)

Grüsse,
R.

von Interruptor (Gast)


Lesenswert?

Kannste nich was sinnvolles Posten?

von (prx) A. K. (prx)


Lesenswert?

Interruptor schrieb:
> D.h. sie hat keien sinnvolle Aufgabe. Sie soll
> uns nur Zeigen, ob unser Interrupt funktioniert

Eben. Aber da die Welt mit dem Ende von main() offiziell aufhört, wieso 
sollte dann der Interrupt noch funktionieren?

von Interruptor (Gast)


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?

von Interruptor (Gast)


Lesenswert?

@A.K.
Ja das Interrupt soll ja noch in der main aufgerunfen werden

von (prx) A. K. (prx)


Lesenswert?

Interruptor schrieb:
> Ja das Interrupt soll ja noch in der main aufgerunfen werden

Ohne die Schleife ist main() evtl. schon durch bevor er aktiv wird.

Ausserdem müsste der externe Interrupt erst einmal eingeschaltet werden, 
nicht nur konfiguriert (GICR).

von notorischer troll (Gast)


Lesenswert?


von Peter II (Gast)


Lesenswert?

Rene H. schrieb:
> Irgendwo sollte da noch ein while(1) stehen ;-)

macht es doch, hinter der main baut dir die libc soetwas immer ein. 
Damit spart man sich sogar code.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> macht es doch, hinter der main baut dir die libc soetwas immer ein.
> Damit spart man sich sogar code.

Yep, aber gerüchteweise steht ein CLI vor dieser Schleife. ;-)

von Krapao (Gast)


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.

von Interruptor (Gast)


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?!

von (prx) A. K. (prx)


Lesenswert?

Interruptor schrieb:
> Der Code an sich müsste ja stimmen....oda?!

Welcher? Der einzig gezeigte Code stimmt nicht.

von Uwe (Gast)


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.

von Uwe (Gast)


Lesenswert?

>  PORTD = 0x40;
Probiert doch mal besser so
   PORTD = 0x04;
man man

von (prx) A. K. (prx)


Lesenswert?

Uwe schrieb:
> Der µC macht hinter main weiter !

Irgendwie schon ...

> Da sollten zwar nur nops stehen bis er am ende vom flash ankommt.

... aber nicht so. Main wird vom Startup-Code der Lib aufgerufen und 
hinter diesem Aufruf geht es weiter. Mit einem CLI und einer 
Totschleife. Mit Interrupts wird das dann also nix mehr.

von Interruptor (Gast)


Lesenswert?

Erstmal danke. Wir haben "einen" Fehler gefunden und jetz funktionierts 
;) (Aber nicht in dem kleinen Programm hier sondern in unserem 
Hauptprogramm).
Trotzdem danke an alle

von Uwe (Gast)


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);

von Peter D. (peda)


Lesenswert?

Krapao schrieb:
> Die "Falle" hier: Die avr-libc fügt ein while(1); im Exitcode ein.

Und ein CLI:
1
00003c84 <_exit>:
2
    3c84:  f8 94         cli
3
4
00003c86 <__stop_program>:
5
    3c86:  ff cf         rjmp  .-2        ; 0x3c86 <__stop_program>


Peter

von Interruptor (Gast)


Lesenswert?

@UWE : Das war nicht das Problem ;)
man man

von Uwe (Gast)


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

von (prx) A. K. (prx)


Lesenswert?

Uwe schrieb:
> jaja

Lass mal. Das eigentliche Programm ist offenbar so geheim, dass man 
einen völlig anderen Code mit völlig anderen Fehlern postet, um das 
völlig andere Problem im eigentlichen Programm zu lösen.

Und was soll man sagen - dieser Ansatz hat sogar funktioniert!

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.