Hallo,
ich möchte Daten über die serielle Schnittstelle verschicken. Dazu werde
ich die Nachrichten in Manchester kodieren, was aber hier zunächst
uninteressant sein soll. Es geht mir darum, dass ich im Moment mit einem
delay() warte, um zum nächsten zu übertragenden Bit zu wechseln. Diese
Methode finde ich allerdings nicht optimal. Ich freue mich auf die
Lehrbuchlösungen, die Ihr mir bietet! :-)
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define FREQ 36000 // Modulationsfrequenz
|
6 |
|
7 | #define PIN PB1 // IR-LED-Pin
|
8 | #define DDR DDRB // IR-LED-Port-Einstellungen
|
9 | #define PORT PORTB // IR-LED-Port
|
10 |
|
11 | #define IR_LO TCCR1A = 0 // Modulations-Interrupt deaktivieren
|
12 | #define IR_HI TCCR1A = (1 << COM1A0) // Modulations-Interrupt aktivieren
|
13 |
|
14 | int main()
|
15 | {
|
16 | // Port
|
17 | DDR |= (1 << PIN);
|
18 |
|
19 | // Timer
|
20 | OCR1A = (F_CPU + FREQ) / (FREQ * 2); // Frequenz korrekt runden
|
21 | TCCR1A = (1 << COM1A0); // OC1A togglen, CTC-mode
|
22 | TCCR1B = (1 << CS10) | (1 << WGM12); // Vorteiler: 1
|
23 |
|
24 | // Interrupt
|
25 | sei(); // Interrupts: An
|
26 |
|
27 | // Daten
|
28 | char msg[] = "A"; // Zu sendende Nachricht
|
29 | char i; // Byte-Zähler
|
30 | char n; // Bit-Zähler
|
31 |
|
32 | // Hauptschleife
|
33 | while(1)
|
34 | {
|
35 | for (i = 0; i < sizeof(msg); i++) // Bytes durchlaufen
|
36 | {
|
37 | for (n = 7; n >= 0; n--) // Bits durchlaufen (MSB)
|
38 | {
|
39 | if (msg[(int)i] & (1 << n))
|
40 | {
|
41 | IR_LO; // LED aus
|
42 | }
|
43 | else
|
44 | {
|
45 | IR_HI; // LED an
|
46 | }
|
47 | }
|
48 | _delay_us(500); // Ein Bit ist 500µs lang
|
49 | }
|
50 | _delay_ms(10); // Nachricht alle 10ms senden
|
51 | }
|
52 | }
|
Natürlich freue ich mich auch über generelle konstruktive stilistische
Kritik!