Forum: Mikrocontroller und Digitale Elektronik externer Interrupt am xmega32


von Ganter (Gast)


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.

von Volker B. (Firma: L-E-A) (vobs)


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

von Jim M. (turboj)


Lesenswert?

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

Folgefehler. Zeige uns den 1. Fehler, nicht den letzten.

von Ganter (Gast)


Lesenswert?

Sorry vergessen, zweiter Fehler:

'PORT_t {aka struct PORT_struct}' has no member named 'INT0MASK'


ups, es muss natürlich PORTD.DIRSET = 0b00010000 heißen

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Ganter schrieb:

> 'PORT_t {aka struct PORT_struct}' has no member named 'INT0MASK'

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?

Grüßle
Volker

von Ganter (Gast)


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?

von Volker B. (Firma: L-E-A) (vobs)


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

von J. Zimmermann (Gast)


Lesenswert?

XMEGA-E-Manual, Seite 151; Manchmal ist in diesem Forum einfach mal eine 
NULL zuviel.
mfg
Achim

von Theor (Gast)


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? :-)

von Ganter (Gast)


Lesenswert?

Ganz große Sprüche. Kommt mal runter ihr nerds.

von Ganter (Gast)


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
}

von J. Zimmermann (Gast)


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

von Volker B. (Firma: L-E-A) (vobs)


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

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.