Skip to content

Commit a159f7f

Browse files
committed
Extend L13 by best practic examples
1 parent c497986 commit a159f7f

1 file changed

Lines changed: 111 additions & 2 deletions

File tree

13_AVR_CPU.md

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ narrator: Deutsch Female
99
import: https://raw.githubusercontent.com/liascript-templates/plantUML/master/README.md
1010
https://github.com/LiaTemplates/Pyodide
1111
https://github.com/LiaTemplates/AVR8js/main/README.md#10
12+
https://github.com/liascript/CodeRunner
1213
1314
mark: <span style="background-color: @0;
1415
display: flex;
@@ -811,5 +812,113 @@ Zusammengesetzt ergibt sich eine Folgeadresse $0xe4$. Im Programmspeicher steht
811812

812813
## Vorbereitung der praktischen Aufgaben
813814

814-
+ Anmeldung bei TinkerCad - https://www.tinkercad.com/
815-
+ Optional - Abholen eines Mikrocontrollers
815+
**Bitoperationen in C**
816+
817+
| Operation | Bedeutung |
818+
| --------- | ----------------------- |
819+
| `>>` | Rechts schieben |
820+
| `<<` | Links schieben |
821+
| `|` | binäres, bitweises ODER |
822+
| `&` | binäres, bitweises UND |
823+
| `^` | binäres, bitweises XOR |
824+
825+
```cpp Bitshifting.cpp
826+
#include <iostream>
827+
#include <bitset>
828+
829+
int main()
830+
{
831+
char v = 0x1;
832+
for (int i = 0; i <=7; i++){
833+
std::cout << std::bitset<8>((v<<i)) << std::endl;
834+
}
835+
return 0;
836+
}
837+
```
838+
@LIA.eval(`["main.c"]`, `g++ -Wall main.c -o a.out`, `./a.out`)
839+
840+
Mit diesen Operationen werden sogenannte Masken gebildet und diese dann auf die
841+
Register übertragen.
842+
843+
### Setzen eines Bits
844+
845+
```cpp BitSetting.cpp
846+
#include <iostream>
847+
#include <bitset>
848+
849+
/* übersichtlicher mittels Bit-Definitionen */
850+
#define PB0 0
851+
#define PB1 1
852+
#define PB2 2
853+
854+
int main()
855+
{
856+
char PORTB; // Wir "simulieren" die Portbezeichnung
857+
PORTB = 0;
858+
std::cout << std::bitset<8>(PORTB) << std::endl;
859+
860+
// Langschreibweise
861+
PORTB = PORTB | 1;
862+
std::cout << std::bitset<8>(PORTB) << std::endl;
863+
// Kurzschreibweise
864+
PORTB |= 0xF0;
865+
std::cout << std::bitset<8>(PORTB) << std::endl;
866+
867+
// Kurzschreibweise mit mehrteiliger Maske (setzt Bit 0 und 2 in PORTB auf "1")
868+
PORTB |= ((1 << PB0) | (1 << PB2));
869+
std::cout << std::bitset<8>(PORTB) << std::endl;
870+
}
871+
```
872+
@LIA.eval(`["main.c"]`, `g++ -Wall main.c -o a.out`, `./a.out`)
873+
874+
### Löschen eines Bits
875+
876+
Das Löschen basiert auf der Idee, dass wir eine Maske auf der Basis der invertierten
877+
Bits generieren und diese dann mit dem bestehenden Set mittels `&` abbilden.
878+
879+
```cpp BitSetting.cpp
880+
#include <iostream>
881+
#include <bitset>
882+
883+
/* übersichtlicher mittels Bit-Definitionen */
884+
#define PB0 0
885+
#define PB1 1
886+
#define PB2 2
887+
888+
int main()
889+
{
890+
char PORTB = ((1 << PB0) | (1 << PB2));
891+
std::cout << std::bitset<8>(PORTB) << std::endl;
892+
893+
PORTB &= ~(1 << PB0);
894+
std::cout << std::bitset<8>(PORTB) << std::endl;
895+
}
896+
```
897+
@LIA.eval(`["main.c"]`, `g++ -Wall main.c -o a.out`, `./a.out`)
898+
899+
### Prüfen eines Bits
900+
901+
```cpp BitSetting.cpp
902+
#include <iostream>
903+
#include <bitset>
904+
905+
/* übersichtlicher mittels Bit-Definitionen */
906+
#define PB0 0
907+
#define PB1 1
908+
#define PB2 2
909+
910+
int main()
911+
{
912+
char PORTB = ((1 << PB0) | (1 << PB2));
913+
std::cout << std::bitset<8>(PORTB) << std::endl;
914+
915+
if (PORTB & (1 << PB0))
916+
std::cout << "Bit 2 gesetzt" << std::endl;
917+
if (!(PORTB & (1 << PB0)))
918+
std::cout << "Bit 2 nicht gesetzt" << std::endl;
919+
// Ist PB0 ODER PB2 gesetzt?
920+
if (PORTB & ((1 << PB0) | (1 << PB2)))
921+
std::cout << "Bit 0 oder 2 gesetzt" << std::endl;
922+
}
923+
```
924+
@LIA.eval(`["main.c"]`, `g++ -Wall main.c -o a.out`, `./a.out`)

0 commit comments

Comments
 (0)