Forum: Mikrocontroller und Digitale Elektronik Interrupt Problem Arduino Due


von Oliver R. (olli_r)


Lesenswert?

Guten morgen zusammen,

ich habe folgendes Problem: und zwar habe ich ein Mikrofon, welches 
digitale Signale im PDM-Format ausgiebt.
Dieses Mikrofon wird mit einem 2MHz-Clock-Signal angesteuert, mit dem 
selben Takt schickt das Mikrofon die Signale auch raus. Jetzt möchte ich 
diese Signale über ein Interrupt einlesen. Wenn eine bestimmte Anzahl an 
Werten aufgenommen wurde soll der Interrupt deaktiviert werden, damit 
die Werte in Ruhe abgearbeitet werden können. Aber leider kommen keine 
Daten auf meinem Rechner an. Das Clocksignal und die Serielle 
Übertragung ansich funktionieren aber das Zusammenspiel leider nicht.

Habt ihr eine Idee woran es liegen kann?

Vielen dank schon mal im Vorraus!!!
1
volatile int n=0;
2
volatile unsigned char data[65536];
3
4
void setup() {
5
    Serial.begin(9600); 
6
  
7
  pinMode(25, INPUT);
8
  pinMode(29,OUTPUT);
9
  pinMode(7,INPUT);
10
 
11
  digitalWrite(29,HIGH);
12
13
int32_t mask_PWM_pin_7 = digitalPinToBitMask(7);
14
15
REG_PMC_PCER1 = 1<<4;                
16
REG_PIOC_PDR |= mask_PWM_pin_7;      
17
REG_PIOC_ABSR |= mask_PWM_pin_7;     
18
REG_PWM_CLK = 0;                  
19
REG_PWM_CMR6 = 0<<9;               
20
REG_PWM_CPRD6 = 35;        
21
REG_PWM_CDTY6 = 17;                 
22
REG_PWM_ENA = 1<<6; 
23
24
attachInterrupt(7, read, RISING);          
25
}
26
27
void loop() {
28
 
29
int b = 1; 
30
int y = 0;
31
32
  if (n > 65536){
33
    detachInterrupt(7);
34
   
35
   for (int zeiger = 0; zeiger < 65024; zeiger++) {
36
37
      for(int k = 0; k < 512; k++){
38
        y = b * data[k + zeiger];
39
        }
40
        Serial.println(y);
41
        y = 0;
42
    }
43
    delay(1000);  
44
    n = 0;
45
46
    attachInterrupt(7, read, RISING);
47
  }
48
}     
49
50
void read (){
51
  data[n] = REG_PIOD_PDSR & 0x1;   
52
  n=n+1;
53
}

Gruß Olli

von Oliver R. (olli_r)


Lesenswert?

Ich nochmal,

hat keiner ne Idee.

Wenn ich das Clock-Signal auf 100kHz runtersetzt funktioniert es leider 
ebenfalls nicht. Spätestens da müsste es doch keine Zeitprobleme mehr 
geben oder?

Gruß Olli

von Oliver (Gast)


Lesenswert?

Oliver Reinsdorff schrieb:
> Wenn ich das Clock-Signal auf 100kHz runtersetzt funktioniert es leider
> ebenfalls nicht.

Wenn dein Prozessor mit den Default-Einstellungen läuft, läuft der mit 
1MHz Takt. Da sind auch 100kHz Interrupt-Frequenz noch seeeehr 
sportlich.

Der weiteren schau doch mal ins Datenblatt, wie

> volatile unsigned char data[65536];

mit der SRam-Größe des Prozessors zusammenpasst.

Und dann, obwohl in dem Fall eher akademisch, denkst du bitte auch 
nochmal über diese Zeile nach:

> if (n > 65536){

Vermutlich sind noch mehr Fehler drin, aber die darftst du dann selber 
finden.

Oliver

von Oliver S. (oliverso)


Lesenswert?

Ich nehme fast alles zurück, bis auf die letze Anmerkung. Ein ARM ist da 
dann doch kein AVR.

Oliver

von Oliver R. (olli_r)


Lesenswert?

Vielen dank :)

Aber wenn ich die Fehler selber gefunden hätte, die dieses Programm 
enthält hätte ich hier nicht gefragt :)

von Oliver S. (oliverso)


Lesenswert?

Ich meinte ja eigentlich das hier:

Oliver schrieb:
> Und dann, obwohl in dem Fall eher akademisch, denkst du bitte auch
> nochmal über diese Zeile nach:
>
>> if (n > 65536){

Ist im Falle des ARM nicht akademisch.

Oliver

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.