Falk B. schrieb:
> @ D a v i d K. (oekel)
>
>>ich verwende gerade jede Menge I2C Aufrufe. Eine davon sogar im ISR
>
> Naja, hoffentlich ist die ISR-Frequenz nicht zu hoch.
Teiler: 1024
> Nun ja, selbst wenn man eine Funktion atomar ausführen will, sollte man
> im Normalfall die Funktionen aus util/atomic.h nutzen. Denn die können
> am Ende des atomaren Blocks den vorherigen Zustand des I-Bit wieder
> herstellen. Sprioch, wenn es vorher gelöscht war, bleibt es gelöscht!
>
>
1 | > #include <util/atomic.h>
|
2 | >
|
3 | > ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
|
4 | > // atomarer Funktionsblock, Interrupts sind gesperrt
|
5 | > }
|
6 | >
|
Mein theoretisches Szenario wäre das sich das ganze wie folgt mal michen
könnte:
1 | void I2C_WriteRegister(uint8_t busAddr, uint8_t deviceRegister, uint8_t data) {
|
2 | cli();
|
3 | i2c_start(busAddr);
|
4 | i2c_write(deviceRegister);
|
5 | //...nun kommt der ISR..
|
6 |
|
7 | //uint8_t I2C_ReadRegister(uint8_t busAddr, uint8_t deviceRegister) {
|
8 | cli();
|
9 | uint8_t data = 0;
|
10 | i2c_start(busAddr); // send device address
|
11 | i2c_write(deviceRegister); // set register pointer
|
12 | i2c_start(busAddr + I2C_READ); // restart as a read operation
|
13 | data = i2c_readNak(); // read the register data
|
14 | i2c_stop(); // stop
|
15 | //sei();
|
16 | //}
|
17 |
|
18 | //...weiter gehts
|
19 | i2c_write(data);
|
20 | i2c_stop();
|
21 | sei();
|
22 | }
|
Sprich es kommt im besten Fall Müll auf dem Display an (dafür verwende
ich das "I2C_WriteRegister") im Schlimmsten Fall hängt er sich auf?
(darartigen Fall habe ich gerade sporadisch in der Praxis und schiebe es
auf den ISR.
(konkret läuft eine Endlosschleife mit Testausgaben: 40-100x ok. dann
steht alles...)