Interrupt Vector Atmega4809

#7468033
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.

Persönliche Seite #7468175
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.

#7468244
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.

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