Externe Interrupts

OP #2747403
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
OP #2747462
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
OP #2747535
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.

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