> sbi/cbi ist deprecated
Er hat ja seine eigene Implementierung drübergeschrieben.
Ich finde die Wahl trotzdem nicht glücklich, gerade auch für Lernende.
Wenn's schon unbedingt in Makros verwurschtelt werden muss, dann
wären SETBIT und CLEARBIT allemal aussagekräftiger. Eigentlich ist
es aber sinnvoller, gleich noch einen Schritt weiter zu gehen und eine
Art HAL daraus zu machen (hardware abstraction layer), sodass z. B.
die Startbedingung dann aussieht wie:
1 | void i2c_start(void)
|
2 | {
|
3 | SDA_HIGH; i2c_warte();
|
4 | SCL_HIGH; i2c_warte();
|
5 | SDA_LOW; i2c_warte();
|
6 | SCL_LOW; i2c_warte();
|
7 | }
|
Ansonsten Zustimmung dazu, dass man delays nicht ,,nach Gutdünken''
zimmern sollte, entweder einen Timer oder die Funktionen aus
<util/delay.h> bzw. auch <util/delay_basic.h> nehmen. Das ist zwar
wieder inline asm, aber in diesem Falle vom Hersteller des Systems,
damit transparent für den Nutzer. Man kann sogar so weit gehen,
den Lernenden an Hand des aus der ,,privaten'' Zählschleife generierten
(oder besser: nicht generierten) Codes zu zeigen, warum man genau
sowas nicht machen darf und an welchen Stellen der C-Standard dem
Compiler Freiraum für seine Optimierungen gegeben hat.