Forum: Mikrocontroller und Digitale Elektronik Interrupt INT0/INT1 bei Atmega8


von Frank (Gast)


Angehängte Dateien:

Lesenswert?

Hi!

Bin ein Neuling betreffend µCs.
Wollte bei meinem Atmega8 mit den externen Interrupts experimentieren.
Ich verwende das "Atmel Evaluations-Board Version 2.0.1" von Pollin.

Code rüberspielen ist kein Problem. Aber da ist noch irgend ein 
logischer Fehler oder es fehlt irgendetwas. Liegt das am MCUCR? Habe 
versucht auf "Any logical change on INTx generates an interrupt request" 
zu stellen -- ISCx1 = 0, ISCx0 = 1.

Ich will per Tastendruck eine der zwei LEDs auf dem Board ausschalten.
Die Spannungspegel kommen auch am Controller an.
Also muss wohl oder übel ein Fehler im Code sein. peinlich :)

Hoffe ihr könnt mir helfen!
Danke im Voraus

Peter

von Sepp (Gast)


Lesenswert?


von Walter (Gast)


Lesenswert?

da fehlt irgendwie ein Enablen des Interrupts

von Frank (Gast)


Lesenswert?

@Sepp:
Entprellen ist doch Nebensache, weil ich die LED im Interrupt ja eh nur 
ausknipse. Oder ist da brauchbarer Code dabei?

@Walter:
Dachte dafür ist das "sei()"?

Danke derweil
Peter

von Justus S. (jussa)


Lesenswert?

Frank wrote:

> @Walter:
> Dachte dafür ist das "sei()"?

das ist für die globale Aktivierung, aber du musst natürlich noch die 
ext. Interrupts selber enablen...siehe Tut


> Danke derweil
> Peter

wie nun, Frank oder Peter

von STK500-Besitzer (Gast)


Lesenswert?

>@Walter:
>Dachte dafür ist das "sei()"?

Manchmal ist Denken Glückssache...
Guck dir die Register deiner Interrupts an. DA wird irgendein Bit 
"...Enable" heissen.

von Stephan H. (stephan-)


Lesenswert?

das ist das Problem,........
Tasten niemals mit Interrupt entprellen oder Abfragen !!
Gibt nur Ärger !!
Oder wieviele Interrupts löst Deine Taste aus ??

Die "Nebensache" fängt eben im Detail an !!

von Peter (Gast)


Lesenswert?

@jussa
Alles klar, okay danke. "GICR" könnte der richtige Weg sein.
Frank war neulich hier an meinem Rechner und ich hab nicht drangedacht, 
dass ich den Namen noch oben ändern muss.

@stephan-
Das ist momentan nur zum Debuggen. Da kommt später schon ein sauberer 
high/low-Pegel von einem IC hin. Bis jetzt hab ich eh nur hardwareseitig 
entprellt.

von Peter (Gast)


Lesenswert?

Mit "GICR" scheint's zu klappen. Wobei das im Tutorial afaik aber keine 
Verwendung findet.

von Justus S. (jussa)


Lesenswert?

Peter wrote:
> Mit "GICR" scheint's zu klappen. Wobei das im Tutorial afaik aber keine
> Verwendung findet.

doch, nur unter anderem Namen

von Hannes Lux (Gast)


Lesenswert?

Frank, sag bitte mal dem Peter, er möge sich auch mal das Datenblatt des 
Atmega8 ansehen. Da steht so ziemlich alles über die I/O-Register drin.

...

von Mark D. (mark85)


Lesenswert?

Hätte auch eine Frage zum Interrupt, programmiere in Assembler mit dem 
AtMega16 und irgendwie bekomm ich das nicht hin. Habe BTN7 an PD3 
angeschlossen und die LEDS an PD0:3. Ohne Interrupts kann ich die LEDS 
ganz normal ansteuern, beim Interrupt gibts halt Probleme:

.NOLIST
.INCLUDE "m16def.inc"
.LIST


.equ temp, 0x10
.equ leds,  0x11


.section    .text


.org 0x0000

    rjmp main


.org INT1addr

    jmp EXT_INT1



main:

      ldi      temp, lo8(RAMEND)
     out     SPL, temp
     ldi       temp, hi8(RAMEND)
     out     SPH, temp

      ldi     temp, 0x00
      out   DDRD, temp
      ldi     temp, 0xFF
      out   DDRC, temp
      ldi     temp, 0XFF
      out   PORTD, temp


      ldi      temp, 0b00001000
      out     MCUCR, temp
      ldi      temp, 0b10000000
      out     GICR, temp

      sei


infinite_loop:

        rjmp infinite_loop

EXT_INT1:
        ldi    temp, 0XFF
       out   PORTC, temp
        reti



Vielleicht kann mir ja jemand helfen, sitz schon Ewigkeiten herum und 
mir fällt nichts mehr ein.

Lg

von spess53 (Gast)


Lesenswert?

Hi

>Ohne Interrupts kann ich die LEDS ganz normal ansteuern, beim Interrupt >gibts 
halt Probleme:....

1.Welche?

2.    ldi      temp, 0b00001000
      out     MCUCR, temp
      ldi      temp, 0b10000000
      out     GICR, temp

Schreibe mal lieber 'ldi tmp, 1<<xyz' Mit der Bitbezeichnung xyz. Ist 
sicherer und auch ohne Datenblatt lesbar.


MfG Spess

von Mark D. (mark85)


Lesenswert?

Stimmt, mit 1<<xyz hast Recht.
Problem is halt das die LEDS nicht angehen wenn ich den Button drücke. 
Scheint sonst der Code in Ordnung zu sein?

von Johannes M. (johnny-m)


Lesenswert?

Mark Drobnick wrote:
> .equ temp, 0x10
> .equ leds,  0x11
> [...]
>       ldi     temp, 0x00
Du solltest Dich vielleicht mal erkundigen, was .equ überhaupt macht! Es 
macht jedenfalls nicht das, was Du vermutlich denkst...

Abgesehen ist das mit dem .equ syntaktisch falsch (und kann deshalb 
schon mal gar nicht assemblieren).

von Johannes M. (johnny-m)


Lesenswert?

Ich sehe grad, dass das gar kein AVR-Assembler ist! Womit assemblierst 
Du das? Mit dem GNU-Assembler?

von Mark D. (mark85)


Lesenswert?

Habs jetzt hinbekommen, das einzige was ich geändert hab war ein mal 
zwei bei INT1addr, also ".org INT1addr * 2", weil die vordefinierten 
Adressen anscheinend Word Format haben und der Assembler Byte haben 
will.

Mit dem assemblieren hatte ich keine Probleme. Wie hätt ich das mit dem 
.equ besser machen sollen?

lg

von Mark D. (mark85)


Lesenswert?

Assembler dürft avr-as, avr-gcc sein. Musste jetzt selber nachschaun 
weil wir von der Uni schon ein fertiges Makefile bekommen haben und die 
ganzen Packages schon installiert waren.

von Johannes M. (johnny-m)


Lesenswert?

Mark Drobnick wrote:
> Assembler dürft avr-as, avr-gcc sein.
Dürfte? Toll, da programmiert einer und weiß gar nicht, womit...

> Musste jetzt selber nachschaun
So, muss ich das?

von Mark D. (mark85)


Lesenswert?

Sehr nett danke, programmier seit gestern das erste mal einen 
Microcontroller. Aber sinnlos zu diskutieren, jetzt hab ichs ja eh 
hinbekommen.

Schönen Abend noch!

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.