attiny freq-messung

OP #5069954
Lesenswert?

Ich würde gern mit einem attiny eine Freq messen und via i2c abfragen

Das schaut bei mir aktuell so aus und funktionert natürlich nicht,
die gelesenen Werte sind immer null ;(

Kann jemand sehen warum ?
1
#include "main.h"
2

3
#define I2C_SLAVE_ADDRESS 4
4
#define LED_PIN PB3
5
#define SENSOR  PB1
6
#define SCL     PB2
7
#define SDA     PB0
8

9
volatile float SENSOR_time          = 0;
10
volatile float SENSOR_time_last     = 0;
11
int            SENSOR_array[5]      = {0,0,0,0,0};
12
volatile bool  sensorISRIsCounting  = 0;
13
unsigned int   senVal               = 0;
14

15
unsigned long  previousMillis       = 0;
16
unsigned int   interval             = 100;
17

18
void readSENSOR() {
19
    if (SENSOR_time > 0 && sensorISRIsCounting > 0 ) {
20
        SENSOR_array[0] = SENSOR_array[1];
21
        SENSOR_array[1] = SENSOR_array[2];
22
        SENSOR_array[2] = SENSOR_array[3];
23
        SENSOR_array[3] = SENSOR_array[4];
24
        // interrupts bei einer volatile variable sperren !!!
25
        noInterrupts();
26
            SENSOR_array[4] = 1000000/SENSOR_time;
27
        interrupts();
28
        senVal = (int)(SENSOR_array[0] + SENSOR_array[1] + SENSOR_array[2] + SENSOR_array[3] + SENSOR_array[4]) / 5;
29
        sensorISRIsCounting = 0;
30
    }
31
}
32

33
void requestEvent() {
34
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
35
    TinyWireS.send(senVal);
36
}
37

38
void sensorISR() {
39
    sensorISRIsCounting  = 1;
40
    unsigned long m     = micros();
41
    SENSOR_time          = (m - SENSOR_time_last);
42
    SENSOR_time_last     = m;
43
}
44

45
void setup() {
46
    TinyWireS.begin(I2C_SLAVE_ADDRESS);
47
    TinyWireS.onRequest(requestEvent);
48
    pinMode(LED_PIN, OUTPUT);
49
    digitalWrite(LED_PIN, HIGH);
50
    pinMode(SENSOR, INPUT);
51
    attachInterrupt(SENSOR, sensorISR, FALLING);
52
}
53

54
void loop() {
55
    unsigned long currentMillis = millis();
56
    if (currentMillis - previousMillis > interval) {
57
        previousMillis = currentMillis;
58
        readSENSOR();
59
    }
60
    TinyWireS_stop_check();
61
}
Beitrag #5069987 wurde von einem Moderator gelöscht.
Beitrag #5069994 wurde von einem Moderator gelöscht.
Beitrag #5070001 wurde von einem Moderator gelöscht.
#5070006
Lesenswert?

Ray M. schrieb im Beitrag #5069994:
> flachwichser

Könnte man meinen...

Zum Thema: Ich warne vorher, daß ich von C nichts verstehe, denke aber:

Hier wird die Variable "Sensor-Time" mit Null initialisiert:

Ray M. schrieb:
> volatile float SENSOR_time          = 0;

...und hier gehts nicht los, weil die Bedingung "Sensor_time>0" nicht 
erfüllt ist:

Ray M. schrieb:
> if (SENSOR_time > 0 && sensorISRIsCounting > 0 ).....


Wie gesagt: Ohne Gewähr -ich bin kein C-Mann

Abel
#5070028
Lesenswert?

Abel H. schrieb:
> Zum Thema: Ich warne vorher, daß ich von C nichts verstehe, denke aber:

Das ist auch kein reines C sondern wieder Arduino Zeugs...

Ray M. schrieb im Beitrag #5069994:
> flachwichser

...was diese Art der Kommunikation auch vermuten lässt.

Schade das die Antwort gegeben wurde, denn nach diesem Kommentar hätte 
ihm nicht mehr geholfen gehört.
OP #5070038
Lesenswert?

Abel H. schrieb:
> Ray M. schrieb:
>> Kann es sein das noch irgendwas
>> Wildes
>> auf einem attiny machen muss, damit Interrupts funktionieren ?
>
> Normalerweise muß man Interrupts extra erlauben. In anderen Sprachen mit
> "Sei" oder mit "Enable Interrupts".
>
> Ob (und wie) das hier auch so ist, das weiß ich nicht.
>
> Abel

Ich hab das jetzt mal ganz minimal versucht.
Aber auch das funktioniert so nicht.
Das sollte doch jenachdem ob an PB1 5V oder GND anliegen
den Status der LED umschalten oder nicht ?
1
#include "main.h"
2

3
#define LED_PIN PB3
4
#define SENSOR  PB1
5

6
void sensorISR() {
7
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
8
}
9

10
void setup() {
11
    pinMode(LED_PIN, OUTPUT);
12
    digitalWrite(LED_PIN, HIGH);
13
    pinMode(SENSOR, INPUT);
14
    sei();
15
    attachInterrupt(SENSOR, sensorISR, CHANGE);
16
}
17

18
void loop() {
19
}

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