Forum: Mikrocontroller und Digitale Elektronik Interrupt Vector Atmega4809


von Sandro (sandro91)


Lesenswert?

Hallo Leute

Ich habe grade ein Projekt mit dem Atmega4809.
Ich habe folgenden Code in einer Bibliotheksdatei.
1
#include <inttypes.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include "Ultra_Sonic_Sensor.h"
5
#include <util/delay.h>
6
7
8
void Ultra_Sonic_Sensor_init( void )
9
{
10
  // Aktiviere Externen Interrupt auf Echo Signal
11
  Echo_CTRL  =  PORT_ISC_FALLING_gc;
12
  
13
  // Schalte Trig als Ausgang 
14
  Trig_Dir  |=  Trig;
15
  
16
  //config Timer
17
  
18
  // select prescaler
19
  // mit prescaler 2 ein increment alle 0.4uS bei einem 20MHz Takt
20
  TCA0.SINGLE.CTRLA |= TCA_SINGLE_CLKSEL_DIV8_gc;
21
  
22
  // Aktiviere Interrupt "Compare Match 0"
23
  TCA0.SINGLE.INTCTRL = TCA_SINGLE_CMP0EN_bm;
24
  
25
  // Zähle clock ticks
26
  TCA0.SINGLE.EVCTRL &= ~(TCA_SINGLE_CNTEI_bm);
27
  
28
  // Compare Match Interrupt nach 25mS
29
  TCA0_SINGLE_CMP0 = 62500;
30
    
31
  // starte Timer
32
  TCA0.SINGLE.CTRLA |=  TCA_SINGLE_ENABLE_bm;
33
34
}
35
36
/*
37
ISR(TCA0_CMP0_vect)
38
{
39
  //lösche Interrupt flag
40
  TCA0.SINGLE.INTFLAGS = TCA_SINGLE_CMP0EN_bm;
41
  
42
  //Reset Counter Register
43
  TCA0.SINGLE.CNT  =  0; 
44
    
45
  // Start signal für 10uS
46
  Trig_Out |= Trig;
47
  _delay_us(10);
48
  Trig_Out &= ~Trig;
49
}
50
51
*/
52
53
uint32_t RohWert;
54
55
ISR(PORTB_PORT_vect)
56
{
57
  
58
  // lösche Interrupt flag
59
  PORTB.INTFLAGS = PORT_INT2_bm;
60
  
61
  RohWert = TCA0.SINGLE.CNT;
62
}
63
64
uint32_t Ultra_Sonic_Sensor_read (void)
65
{
66
  uint32_t Distanz = 0;
67
  
68
  // Berechne Distanz in mm
69
  Distanz = RohWert;
70
  Distanz *= 25;
71
  Distanz *= 23.3;
72
  Distanz /= 2;
73
  
74
  return Distanz;
75
}

Leider kriege ich beim compilieren immer die Fehlermeldung.

multiple definition of `__vector_34'.
Diese bezieht sich auf den Interrupt Vector ISR(PORTB_PORT_vect).
Wenn ich aber diese Routine in mein main File reinkopiere kommt diese 
Fehlermeldung nicht.

Was mach ich falsch?
Vielen Dank für die Hilfe.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Sandro schrieb:

> multiple definition of `__vector_34'.

Beim ATmega4809 ist Vector 34 PORTB_PORT_vect.

Es gibt also mehr als eine Definitionen dieser ISR im Project.

Grund kann sein, dass unterschiedliche Compilation Units die gleiche ISR 
definieren, dass eine Compilation Unit mehrfach im Makefile angegeben 
wurde, oder dass eine ISR in einem Header definiert wurde der in mehr 
als einer Compilation Unit inkludiert wird.

Davon ab fehlt "RohWert" ein volatile, und der Zugriff darauf in 
Ultra_Sonic_Sensor_read() ist nicht atomar.

von Harald K. (kirnbichler)


Lesenswert?

> Ich habe folgenden Code in einer Bibliotheksdatei.

Was soll eine "Bibliotheksdatei" sein?

von Wilhelm M. (wimalopaan)


Lesenswert?

Harald K. schrieb:
>> Ich habe folgenden Code in einer Bibliotheksdatei.
>
> Was soll eine "Bibliotheksdatei" sein?

Na, was wohl?

von Harald K. (kirnbichler)


Lesenswert?

Wilhelm M. schrieb:
> Na, was wohl?

*.lib bzw. *.a, das wären Bibliotheksdateien.

*.h ist keine Library. In C++ kann man zwar libraryartige Dinge damit 
anstellen, der da oben gezeigte Code aber fällt definitiv nicht 
darunter. Der hat in einer *.h-Datei absolut nichts zu suchen. Das ist 
ein Fehler.

von Wilhelm M. (wimalopaan)


Lesenswert?

Wo steht, dass das ein Header Datei sei?

von Harald K. (kirnbichler)


Lesenswert?

Wilhelm M. schrieb:
> Wo steht, dass das ein Header Datei sei?

Das steht nirgendswo, es ist aber zu befürchten, weil im Arduino-Umfeld 
Headerdateien als "Library" bezeichnet werden.

Obendrein lässt das geschilderte Symptom

Sandro schrieb:
> multiple definition of `__vector_34'.

darauf schließen, daß das eine von mehreren Sourcefiles eingebundene 
Headerdatei ist.

von Wilhelm M. (wimalopaan)


Lesenswert?

Harald K. schrieb:
> Wilhelm M. schrieb:
>> Wo steht, dass das ein Header Datei sei?
>
> Das steht nirgendswo, es ist aber zu befürchten, weil im Arduino-Umfeld
> Headerdateien als "Library" bezeichnet werden.

Wo steht Arduino?

>
> Obendrein lässt das geschilderte Symptom
>
> Sandro schrieb:
>> multiple definition of `__vector_34'.
>
> darauf schließen, daß das eine von mehreren Sourcefiles eingebundene
> Headerdatei ist.

Oder einfach die o.g. Datei als TU mehrfach gebunden wird.

von Harald K. (kirnbichler)


Lesenswert?

Wilhelm M. schrieb:
> Oder einfach die o.g. Datei als TU mehrfach gebunden wird.

Um so einen Fehler zu begehen, braucht es deutlich mehr krimineller 
Energie.

Außerdem würde dann der Begriff

Sandro schrieb:
> Bibliotheksdatei

auch noch weniger passen.

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.