Forum: Mikrocontroller und Digitale Elektronik attiny freq-messung


von Ray M. (ray_m)


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.
von Abel H. (abel)


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

von Ray M. (ray_m)


Lesenswert?

sensorISRIsCounting und SENSOR_time werden von sensorISR() gesetzt,
so hätte ich es jedenfalls gern ... Kann es sein das noch irgendwas 
Wildes
auf einem attiny machen muss, damit Interrupts funktionieren ?

von Abel H. (abel)


Lesenswert?

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

von Rene K. (xdraconix)


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.

von Ray M. (ray_m)


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
}

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.