Aktuelle Zeit: 25 Feb 2018 02:59:11


ATXMEGA externer Interrupt

General Luna forum for AVR Microcontrollers.
Allgemeines Luna Forum für AVR Mikrocontroller.
  • Autor
  • Nachricht
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

ATXMEGA externer Interrupt

Beitrag30 Jan 2018 18:56:19

Kann mir mal jemand ein Beispiel geben, wie ich beim ATXMEGA einen externen Interrupt z.B. Auf Leitung Portf.7 konfiguriere?
Hintergrund: Ich möchte den ENC28J60 zumindest testweise auch per Interrupt betreiben. Leider werde ich aus der Beschreibung nicht so ganz schlau, aber so sollte es doch gehen oder?.:
Code: Alles auswählen
PORTF.DIR  = 0   ' Jetzt mal alle pinsI/O Port Data Direction (byte)
PORTF.PIN7CTRL.ISC.LEVEL   'Input/Sense Configuration: Sense Level (Transparent For Events)
PORTF.INT0_VECT = myIsrName   'External Interrupt 0
PORTF.INTCTRL.INT0LVL.HI   'Port Interrupt 0 Level: High level
PMIC.CTRL.HILVLEN.BITSET   'High Level Enable: set bit

(sei)

Stimmt das so?

Grüße
Ulrich

Edit Code-Tags: de0508
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: ATXMEGA externer Interrupt

Beitrag30 Jan 2018 19:28:06

Hallo Ulrich,

nur für das Protokoll, um welchen ATXMEGA handelt es sich?
Dann schaue ich mal ins Datenblatt.
Grüße Uwe
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag30 Jan 2018 19:38:54

Sorry ATXMEGA128a3U

Gruß
Ulrich
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag01 Feb 2018 12:17:48

Update:

Ich habe jetzt mal ein Miniprogramm geschrieben, was auf einen externen Interrupt reagieren soll und etwas über die serielle Schnittstelle ausgibt. Auch das funktioniert nicht. Ich habe jetzt bestimmt 10 verschiedene Seiten/Tutorials etc. angesehen und alle beschreiben mehr oder weniger identisch, wie die Register konfiguriert werden müssen.
Darauf hin habe ich die Konfigurationsrationsregister wieder ausgegeben.
Für PORTa.PIN0CTRL.OPC.PULLUP, PORTa.INTCTRL.INT0LVL.HI, PORTa.PIN0CTRL.ISC.falling, bekomme ich die gesetzten Werte beim Lesen zurück.

Bei PORTa.INT0MASK immer Null. Müsste aber von 0 verschieden sein.
Wie kann ich denn direkt (Umgehung des universalinterfaces ) die Hardware Adressen lesen oder schreiben, um zu testen, ob da noch was nicht stimmt. Die entsprechenden Konstanten und Registerwerte habe ich überprüft.

Grüße
Ulrich
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag02 Feb 2018 13:21:21

Update:

ich habe mir den C compiler von Microe heruntergeladen und mir aus einem Uart und Interrupt Beispiel ein Programm wie in Luna zusammen gestrickt, um meine Hardware zu testen und um zu sehen, ob es so geht.

Es geht.

Damit muss entweder ein Bug in Luna sein, oder ich mache noch irgend etwas falsch. Die Register werden ja in beiden gleich gesetzt, also sollte es ja in beiden funktionieren. Es wäre schön, wenn da mal jemand drüber schauen könnte und hoffentlich was findet.

Microe C
Code: Alles auswählen
/*******************************************************************************************
* Project name:
*  UART (Simple usage of UART module library functions)
* Copyright:
* (c) Mikroelektronika, 2010.
* Revision History:
*   20110513:
*     - initial release (FJ);
* Description:
*   This code demonstrates how to use UART library routines. Upon receiving
*   data via RS232, MCU immediately sends it back to the sender.
* Test configuration:
*   MCU:             ATxmega128A1
*                    http://www.atmel.com/dyn/resources/prod_documents/doc8067.pdf
*   Dev.Board:       MikroMedia for XMEGA
*                    http://www.mikroe.com/eng/products/view/688/mikrommb-for-xmega-board/
*   Oscillator:      Internal Clock, 32.0000 MHz
*   Modules:         USB UART on-board module
*                    ac:USB_UART
*   SW:              mikroC PRO for AVR
*                    http://www.mikroe.com/eng/products/view/228/mikroc-pro-for-avr/
* NOTES:
*    - None.
*******************************************************************************************/
#include "io.h"
#include "clock.h"
#include "interrupt.h"

char uart_rd;


   
 void main() {
  // ----- Internal Clock selection procedure!!!
  OSC_CTRL = 0x02;          // 32MHz internal RC oscillator

  while(RC32MRDY_bit == 0)
    ;

  CPU_CCP = 0xD8;
  CLK_CTRL = 1;             // set system clock to 32MHz internal RC oscillator

  // ---------------------------------
     clear_global_interrupt();
    //CPU_CCP = CCP_IOREG_gc;
    PMIC_CTRL = (PMIC_LOLVLEN_bm | PMIC_HILVLEN_bm);
    PMIC_INTPRI = 0x00;

PORTA_OUT = 0x00;
    PORTA_DIR = 0x00;
    PORTA_PIN0CTRL = (PORT_OPC_PULLUP_gc | PORT_ISC_LEVEL_gc);
    PORTA_PIN1CTRL = (PORT_OPC_PULLUP_gc | PORT_ISC_LEVEL_gc);
    PORTA_INTCTRL = (PORT_INT1LVL_HI_gc | PORT_INT0LVL_LO_gc);
    PORTA_INT0MASK = 0x01;
    PORTA_INT1MASK = 0x02;
    set_global_interrupt();


  UARTE0_Init(230400);              // Initialize UART module at 19200 bps
  Delay_ms(1000);                  // Wait for UART module to stabilize

  UARTE0_Write_Text("Start");

  while (1) {                      // Endless loop

   if (UARTE0_Data_Ready()) {      // If data is received,
     uart_rd = UARTE0_Read();      // read the received data,
     UARTE0_Write(uart_rd);        // and send data via UART

     
     
    }
  }
}
   


void PORTA_INT0_ISR()
org IVT_ADDR_PORTA_INT0
{

          UARTE0_Write_Text("INT0");

}
void PORTA_INT1_ISR()
org IVT_ADDR_PORTA_INT1
{

         UARTE0_Write_Text("INT1");

}


Das Programm sendet die gedrückten Tasten zurück. Wenn ein Interrupt aufgetreten ist, bekomme ich INT0 ODER INT1 über das Terminal.

Lunaavr

Code: Alles auswählen
#library "library/clksys.interface"
'******************************************************************************************************
'DEBUGGING

#define DEBUG         as 0   ' set to 1 to enable the error exceptions
'******************************************************************************************************


const F_CPU      = 32000000
const STACKSIZE   = 512
avr.device   = atxmega128a3u
avr.clock   = F_CPU
avr.stack   = STACKSIZE         'bei allen Diensten notwendig



'-----------------------------------------------------------------------------
'setup clock system
'----------------------------------------------------------------------------

ClkSys.Enable( OSC_RC32MEN_bm )                           'enable the internal 32 Mhz oscillator
ClkSys.Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc )   'configure the prescalers for the periferal to 1:1
ClkSys.WaitReady( OSC_RC32MRDY_bm )                        'wait until the clock is stable
ClkSys.Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc )         'set the clock as main clock


'-------------------------Usart Stup-----------------------------------------------------------------

#define txde0   as porte.3
txde0.mode = output,high
usart.interface = UsartE0
usart.baud = 230400
usart.rxd.enable
usart.txd.enable


'-----------------------------------------------Test Interrupt Mode-----------------------------------
cli

PORTa.dir = 0   'I/O Port Data Direction Clear (byte)
PORTa.PIN0CTRL.OPC.PULLUP   'Output/Pull Configuration: Totempole w/ Pull-up on Input
PORTa.INTCTRL.INT0LVL.HI   'Port Interrupt 0 Level: High level
PORTa.PIN0CTRL.ISC.LEVEL   'Input/Sense Configuration: Sense Falling Edge
PORta.INT0_VECT =test   'External Interrupt 0
PORTa.INT0MASK = 255


PMIC.CTRL.HILVLEN.BITSET
pmic.CTRL.LOLVLEN.BITSET
pmic.CTRL.MEDLVLEN.BITSET
PMIC.INTPRI= 0x00


sei

Do
print "in der Schleife"
print str(PORTa.INT0MASK)
print str(PORTa.INT1MASK)
print str(PORTa.PIN0CTRL.OPC)
print str(PORTa.PIN0CTRL.ISC)
print str(PORTa.INTCTRL.INT0LVL)
print str(PORTa.INTFLAGS.INT0IF)


'If porta.0 =0 then
'War ein Test, ob der Eingang tatsächlich auf 0 geht)
'print "portc.0 = 0"
'print str(PMIC.STATUS)   'Status Register (byte)
'end if
waitms 1000


loop

isr test


print " Isr called"

end isr




1x Pro Sekunde sendet mir der AVR ein Lebenszeichen und die Register. Der Interrupt wird nicht bedient. Da sind natürlich noch Reste von den Tests. Mal die Interruptmaske auf alle Pins gesetzt, um da Fehler in der Position zu vermeiden etc.

Grüße
Ulrich
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag02 Feb 2018 17:06:42

Ich habe mal im Forum gesucht und bin auf diesen Beitrag gestoßen:

https://forum.myluna.de/viewtopic.php?f=5&t=1397&p=9662&hilit=xmega#p9662

Kann das auch mein Problem sein?

EDIT:

Ja das war es! Mit 2016.r1.1.1 Build(8768 (beta) geht es.

Interrupt Problem gelöst, aber noch nicht gänzlich behoben.


Gruß
Ulrich
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag03 Feb 2018 17:25:03

Update:

Ich helfe mir jetzt mit Inline Assembler.

Code: Alles auswählen
asm
push r27
LDI  R27, 1
STS PORTA_INT0MASK+0, R27
pop r27
endasm


Möglicherweise nicht die ausgeklügelteste Variante, aber es geht erst einmal und ich kann die Webserver Version für den XMega fertig stellen. Möglicherweise hat ja jemand ein "State of the Art" Beispiel.

Den Fehler an sich finde ich gar nicht so schlimm. Es war nur viel Aufwand den tatsächlichen Fehler zu finden, da es ja auch Prototyp Boards waren und das eine Board tatsächlich einen defekten Interrupt Ausgang vom ENC28j60 hat.

Grüße
Ulrich
Offline

de0508

  • Beiträge: 2111
  • Registriert: 02 Okt 2012 18:18:30
  • Wohnort: Hessen, Deutschland

Re: ATXMEGA externer Interrupt

Beitrag03 Feb 2018 17:31:20

Hallo Ulrich,

bitte stelle mir einen kompletten Testcode zusammen, dann kann ich in den Libs nach möglichen Lösungen suchen.
Grüße Uwe
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag03 Feb 2018 18:21:18

Hallo Uwe,

mache ich am Montag.

Grüße
Ulrich
Offline
Benutzeravatar

Mathias

  • Beiträge: 254
  • Registriert: 04 Apr 2013 07:05:05

Re: ATXMEGA externer Interrupt

Beitrag05 Feb 2018 12:48:23

Hallo Uwe

Ich glaube dieser Test Code sollte ausreichen
viewtopic.php?f=5&t=1397&p=9662&hilit=xmega#p9662
Gruss Mathias
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag05 Feb 2018 13:02:36

Hallo Uwe,

ja der Code von Mathias würde reichen. Ich stelle trotzdem meinen Testcode zur Verfügung, damit kann man es gut an einer realen Platine testen (wenn vorhanden).

Das c Programm hatte ich genutzt, um zu sehen, ob es an der Hardware liegt.
Im Luna Programm kann man sich aussuchen, wie es compiliert wird. Ich hatte es zusätzlich mit PortB und PortF getestet. Das funktionierte auch nicht, deshalb würde ich einen Fehler im gesammten Maskregister schreiben vermuten.

Auszug:
Code: Alles auswählen
#define Mask_test as 0      

#if Mask_test

PORTa.INT0MASK = 255      ' geht nicht
#else

asm                  ' geht
push r27
LDI  R27, 1
STS PORTA_INT0MASK+0, R27
pop r27
endasm
#endif


Wahrscheinlich lässt sich der Ersatzcode auch einfacher schreiben. Allerdings habe ich bis jetzt nichts in AVR Assembler gemacht.

Falls Du Realtest an (m)einem Board brauchst, schick mir einfach die Datei (per Mail).

Grüße
Ulrich

Grüße
Ulrich
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Offline

rgf

Site Admin

  • Beiträge: 1506
  • Registriert: 22 Mai 2012 20:37:56

Re: ATXMEGA externer Interrupt

Beitrag13 Feb 2018 10:23:33

ich bin dran.... :twisted:
Gruß, rgf
Offline

meier13

  • Beiträge: 250
  • Registriert: 24 Mai 2013 21:05:19
  • Wohnort: Düsseldorf

Re: ATXMEGA externer Interrupt

Beitrag21 Feb 2018 11:10:33

Funzt jetzt!

Toll

Gruß
Ulrich

Zurück zu Luna Forum (AVR)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 5 Gäste

cron