attiny freq-messung

OP #5069954
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.
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.