Forum: Mikrocontroller und Digitale Elektronik Externe Interrupts


von Wolfgang M. (procrash)


Lesenswert?

Hallo, ich teste gerade auf meinem Atmega 2560 die externen interrupts 
und kann sie irgendwie nicht dazu überreden auszulösen.
Hab zum Test mal einen externen Taster per externem Pull up Wiederstand 
angeschlossen.
Gibts ausser dem sei Befehl, der Pin Konfiguration als Einfgang, dem 
EIMSK und dem EICRB noch weiteres zu beachten, was ein 
Interruptsauslösen verhinern lönnte?

Grüße

Wolfgng


Anbei der Code:

// Taster hängt an PB4 dran, sollte also Interrupt Int 4 auslösen...

  // Taster
  ldi r_temp, 0x00 // PB0-PB7 inputs
  out DDRB, r_temp

  ldi r_temp, 0x00
  out PORTB, r_temp


// Interrupts initialisiere ich so...

  // Initilize Interrupts INT5 (PB5) + INT4 (PB4)

  // Set Interrupt Mask Register and enable INT7 and INT6
  ldi r_temp, (1<< INT5) | (1<< INT4)
  out _SFR_IO_ADDR(EIMSK), r_temp

  // Set Triggers...
  // Low Level Generates IRQ (00)
  // Any Change Generates IRQ (01)<- Selected
  // Falling Edge Triggers IRQ (10)
  // Rising Edge Triggers changes (11)

  ldi  r_temp, (0 << ISC51) | (1<< ISC50) | (0 << ISC41) | (1<< ISC40)
  sts _SFR_IO_ADDR(EICRB), r_temp


  sei



Probiere ich im Hauptprogramm das ganze per Polling funktioniert es 
übrigens:

  loop:

  in r_temp, PINB
  out DEBUG_PORT, r_temp

  andi r_temp, (1<<PINB4)
  cpi r_temp, (1<<PINB4)
  brne on
  LED_OFF
  rjmp loop
  on:
  LED_ON
  rjmp loop

von Thomas E. (thomase)


Lesenswert?

Wie wäre es denn mal mit komplettem Code?

Und was ist das für ein Ding?
> externem Pull up Wiederstand

Und wieder stand da was geschrieben, was es nicht gibt. Und auf dem 
Markt stehen wieder Stände.

mfg.

von Wolfgang M. (procrash)


Lesenswert?

Ok, kompletter Code ist folgender (Achtung, hab dran rumgeschraubt seit 
dem letzten Posting)...



#include <avr/io.h>
#define _SFR_ASM_COMPAT 1
#define __SFR_OFFSET 0

#define r_temp r17
#define r_sreg_save r18

#define DEBUG_PORT PORTC
#define TASTER_PORT PORTB
#define LED_PORT PORTF

// Makro Definitions
.macro LED_ON
  ldi r_temp, 0x00
  out LED_PORT, r_temp
.endm

.macro LED_OFF
  ldi r_temp, 0xFF
  out LED_PORT, r_temp
.endm


// Main Program
.global main
main:

  // Setup Stack Pointer

  ldi     r16,lo8(RAMEND)         ;load the stack pointer
  out     SPL,r16
  ldi     r16,hi8(RAMEND)
  out     SPH,r16


  // Configure Ports

  // Led
  ldi r_temp, 0xFF // PF0-PF7 outputs
  out DDRF, r_temp

  // Taster
  ldi r_temp, 0x00 // PB0-PB7 inputs
  out DDRB, r_temp

  ldi r_temp, 0x00
  out PORTB, r_temp

  // Debug
  ldi r_temp, 0xFF
  out DEBUG_PORT, r_temp



  // Initilize Interrupts INT5 (PB5) + INT4 (PB4)

  // Set Interrupt Mask Register and enable INT7 and INT6
  ldi r_temp, (1<< INT5) | (1<< INT4)
  out _SFR_IO_ADDR(EIMSK), r_temp

  // Set Triggers...
  // Low Level Generates IRQ (00)
  // Any Change Generates IRQ (01)
  // Falling Edge Triggers IRQ (10)
  // Rising Edge Triggers changes (11) <- Selected

  ldi  r_temp, (0 << ISC51) | (1<< ISC50) | (0 << ISC41) | (1<< ISC40)
  sts _SFR_IO_ADDR(EICRB), r_temp

  // Set Pin Change Interrupt Registers...

  ldi r_temp, (1<<PCINT4) | (1<<PCINT5)
  sts _SFR_IO_ADDR(PCMSK0), r_temp


  sei


  LED_OFF

  loop:

  in r_temp, PINB
  out DEBUG_PORT, r_temp
/*
  andi r_temp, (1<<PINB4)
  cpi r_temp, (1<<PINB4)
  brne on
  LED_OFF
  rjmp loop
  on:
  LED_ON
  */
  rjmp loop

  // Interrupt Handlers
  .global INT4_vect
  INT4_vect:
  in r_sreg_save,_SFR_IO_ADDR(SREG)
  LED_ON

  out _SFR_IO_ADDR(SREG), r_sreg_save
  reti

  .global INT5_vect
  INT5_vect:
  in r_sreg_save,_SFR_IO_ADDR(SREG)
  LED_ON

  out _SFR_IO_ADDR(SREG), r_sreg_save
  reti

von Wolfgang M. (procrash)


Lesenswert?

Das mit dem Widerstand werd ich mir hinter die Ohren schreiben ;-)

Hat ansonsten keiner ne Idee warum es so nicht funktioniert?

von Thomas E. (thomase)


Lesenswert?

Wolfgang Meyerle schrieb:
> Hat ansonsten keiner ne Idee warum es so nicht funktioniert?
Nun guck mal auf die Uhr.
Ich hab' da jetzt auch keine Lust mehr, das durchzukauen. Warte mal bis 
morgen. Naja, eigentlich ist da ja auch schon heute.

mfg.

von Wolfgang M. (procrash)


Lesenswert?

Na ok.

Hast eigentlich Recht.

Debugge gerade noch mit AVRICE aber ich denke mal der Hund liegt schon 
im Source begraben, wenn ich's simulier und den Pin per Hand setze löst 
er im Simulator auch schon nicht mehr aus. Also das Problem ist 
definitiv im Code denke ich, Polling funktioniert ja und die LED geht 
an, also ein Schaltungsproblem ist es wohl nicht...


Trotzdem danke.

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.