externer Interrupt am xmega32

Gast #5494757
Lesenswert?

Warum lässt sich der code nicht builden??
Ich nutze das Atmel Studio 7
1
#include <avr/io.h>
2
#define F_CPU 32000000UL
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5

6
int main(void)
7
{
8
  PORTC.DIRSET = 0b00000001 ; 
9
  PORTA.DIR = 0x00;    
10
  PORTA.PIN1CTRL= PORT_OPC_WIREDANDPULL_gc; 
11

12
   sei();
13

14
    PMIC.CTRL |= PMIC_HILVLEN_bm;                                          
15
    PORTA.INTCTRL = 0x03;  
16
        PORTA.INT0MASK = 0x01;       
17
        PORTA.PIN1CTRL = PORT_ISC_FALLING_gc; 
18

19
  while(1){};
20
}
21

22

23
ISR(PORTA_INT0_vect)   
24
{  
25
  PORTD.OUTSET = 0b00010000 ; 
26
}

Ich erhalte den Fehler:
recipe for target 'main.o' failed

Kann der Code grundsätzlich so überhaupt funktionieren?
Ich möchte auf meinem Atxmega32E5 über einen externen Interruptveine LED 
einschalten. Bin Anfänger in Sachen xmega.
(Firma: L-E-A) #5494769
Lesenswert?

Ganter schrieb:
> Warum lässt sich der code nicht builden??

Bei mir "buildet" der Code wunderbar.

> Ich erhalte den Fehler:
> recipe for target 'main.o' failed

Dann ist wohl Dein "Rezept" fehlerhaft. Ist das die einzige 
Fehlermeldung?

> Kann der Code grundsätzlich so überhaupt funktionieren?

Vermutlich nicht. Wo werden die Ausgänge von PORTD intialisiert, also 
das DIR-Register initialisiert?

Grüßle
Volker
Gast #5494937
Lesenswert?

Volker B. schrieb:
> Super! Jetzt solltest Du uns mitteilen, wieso Du das anscheinend nicht
> vorhandene Register INT0MASK initialisieren willst. Wo hast Du dieses
> denn im Datenblatt der MCU gefunden?

offen gesagt, habe ich die Zeile kopiert. Ich komme mit den xmega 
Datenblättern noch nicht wirklich klar. Bei den Megas ist das ganze 
etwas einfacher. Wie müsste es denn richtig aussehen?
(Firma: L-E-A) #5494982
Lesenswert?

Ganter schrieb:

> offen gesagt, habe ich die Zeile kopiert. Ich komme mit den xmega
> Datenblättern noch nicht wirklich klar. Bei den Megas ist das ganze
> etwas einfacher. Wie müsste es denn richtig aussehen?

Ich bin jetzt auch zu faul, Dir hier die fertige Lösung zu präsentieren. 
In diesem Forum wird Hilfe zur Selbsthilfe geboten und keine 
schlüsselfertigen Wunschprojekte für lau erstellt.

Besorg' Dir die beiden Datenblätter, also von den MCU deren Code Du 
kopiert hast (Quelle) und der MCU auf dem Du Dein Programm laufen lassen 
willst (Ziel). Jetzt öffnest Du das Quell-Datenblatt und suchst nach dem 
fraglichen Registernamen, dann öffnest Du das Ziel-Datenblatt und gehst 
dort in genau das selbe Kapitel -- und dann wirst Du in Gottes Namen mal 
ein paar Zeilen Text selber lesen und verstehen müssen. Anders kann man 
m.E. kein Programm erstellen -- außer man wartet, bis es eine 
Arduino-Portierung gibt oder man nimmt etwas Kleingeld in die Hand und 
beauftragt einen Dienstleister.

Der zweite, einfachere Weg: Besorg' Dir genau die MCU deren Code Du 
kopiert hast. Für einen 32A4U lässt sich Dein Code compilieren -- äh ich 
meine natürlich builden.

Grüßle
Volker
Gast #5495002
Lesenswert?

Volker B. schrieb:
> Ganter schrieb:
>
>> offen gesagt, habe ich die Zeile kopiert. Ich komme mit den xmega
>> Datenblättern noch nicht wirklich klar. Bei den Megas ist das ganze
>> etwas einfacher. Wie müsste es denn richtig aussehen?
>
> Ich bin jetzt auch zu faul, Dir hier die fertige Lösung zu präsentieren.
> In diesem Forum wird Hilfe zur Selbsthilfe geboten und keine
> schlüsselfertigen Wunschprojekte für lau erstellt.
>
> [...]
>
> Der zweite, einfachere Weg: Besorg' Dir genau die MCU deren Code Du
> kopiert hast. Für einen 32A4U lässt sich Dein Code compilieren -- äh ich
> meine natürlich builden.
>
> Grüßle
> Volker

Na na. Fang bloss nicht so an, sonst fangen die Leute irgendwann noch an 
Code zu "maken". :-) Der Code wird ja auch nicht "gebaut" sondern von 
einem Menschen geschrieben. Das Gebaute ist dann evtl. das Object-File 
oder eher noch das Binary.

Ich bin mal gespannt, wohin diese "Sprachverschmierung" noch führt. Ich 
krieg schon Sodbrennen von der Inflation des "über" und nehme Natron 
"über" einen Löffel zu mir. - Öh. Ups ... Jetzt habe ich übertrieben, 
oder? :-)
Gast #5495299
Lesenswert?

Für alle, die ein ähnliches Problem haben, und hier außer Scheißgelaber 
nicht geholfen bekommen:

Der Funktionsfähige Code für einen ATxmega32E5. Signal an Pin6 PortA 
schaltet Pin4 an PORTD
1
#include <avr/io.h>
2
#define F_CPU 32000000UL
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5

6
int main(void)
7
{
8
  
9
  OSC.CTRL |= OSC_RC32MEN_bm;
10
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
11
  CCP = CCP_IOREG_gc;
12
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
13
  
14
  
15
  PORTD.DIRSET = 0b00010000 ;
16
  PORTC.DIRSET = 0b00000001 ;
17
  PORTA.DIR = 0x00;
18
  PORTA.PIN6CTRL= PORT_OPC_WIREDANDPULL_gc;
19
  
20
  
21
  SREG |= 0x80;    
22
  sei();
23

24
  PMIC.CTRL |= PMIC_HILVLEN_bm;
25
  PORTA.INTCTRL |= 0x03;
26
  PORTA.INTMASK |= PIN6_bm;
27
  PORTA.PIN6CTRL |= PORT_ISC_RISING_gc;
28
  while(1){};
29
}
30

31
ISR(PORTA_INT_vect)
32
{
33
  PORTD.OUTSET = 0b00010000 ; 
34
  PORTA.INTFLAGS |= (1 << 6);  
35
}
Gast #5495395
Lesenswert?

"Es jedem recht getan, ist eine Kunst, die niemand kann", oder so 
ähnlich. Bringt man hier kompletten code, wird man als 
selbstdarstellender Fachmann, der seine Codes reinknallt beschimpft(@Auf 
Gemerkt), gibt man nur kleine Hinweise (eine Null zuviel: INT0MASK --> 
INTMASK), ist es Scheißgelaber - also bitte etwas Zurückhaltung bitte 
bei solchen Kraftausdrücken, Herr Ganter!
mfg
Achim
(Firma: L-E-A) #5495406
Lesenswert?

Ganter schrieb:
1
>   PORTA.PIN6CTRL= PORT_OPC_WIREDANDPULL_gc;
2
>   PORTA.INTCTRL |= 0x03;
3
>   PORTA.INTMASK |= PIN6_bm;
4
>   PORTA.PIN6CTRL |= PORT_ISC_RISING_gc;
5
> ISR(PORTA_INT_vect)
6
>   PORTA.INTFLAGS |= (1 << 6);

Super! Hast du das Datenblatt jetzt doch noch selber gelesen? Siehste, 
war doch gar nicht so schwer!
...und wenn Du das sofort gemacht hättest, hättest Du auch noch viel 
Zeit gespart. Das ist doch ein toller Lernerfolg! :-)

Grüßle
Volker

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