1 | /*
|
2 | Infoglobe.c
|
3 |
|
4 | ATTiny 25 Pinbelegung:
|
5 | PB0 frei
|
6 | PB1 TX Datenausgang
|
7 | PB2 frei
|
8 | PB3 Quarz 8MHz
|
9 | PB4 Quarz 8MHz
|
10 | PB5 Reset
|
11 | */
|
12 |
|
13 | #include <avr/io.h>
|
14 | #include <avr/interrupt.h>
|
15 |
|
16 | #define F_CPU 1000000UL // Prozessortakt 1MHz (Fuse CKDIV8 gesetzt)
|
17 | #include <util/delay.h>
|
18 |
|
19 |
|
20 | void Lowbit (void); // erzeugt 1ms Burst aus 38 Pulsen (je 10µs high / 16µs low)
|
21 | void Highbit (void); // erzeugt 1ms Pause
|
22 | void Zeichen_senden (unsigned char z); // gibt ein Zeichen aus
|
23 | void Text(char *zeiger); // gibt eine Zeichenkette plus Steuerzeichen aus
|
24 |
|
25 | unsigned char Timeout =1; // Merker für "1ms vorbei" (Low Aktiv)
|
26 |
|
27 |
|
28 | // ISR für den Timer 0 Overflow Interrupt
|
29 | ISR (TIMER0_OVF_vect)
|
30 | {
|
31 | Timeout = 0; // Merker für "1ms vorbei" setzen (Low Aktiv)
|
32 | TCNT0 =133; // Preset für 1ms Overflowdauer
|
33 | }
|
34 |
|
35 |
|
36 |
|
37 | // main
|
38 | int main(void)
|
39 | {
|
40 | // Initialisierung des Controllers
|
41 | DDRB |= (1 << DDB1); // Port B1 Ausgang
|
42 | #define Tx PB1 // Datenausgang
|
43 |
|
44 | // Timer 0
|
45 | TCCR0B |= (1 << CS01); // Timer 0 im "Normal Mode" Vorteiler 1:8
|
46 | TIMSK |= (1 << TOIE0); // Timer 0 Overflow Interrupt Enable setzen
|
47 |
|
48 | sei(); // Interrupts global freigeben
|
49 |
|
50 |
|
51 | // preset
|
52 | _delay_ms(3000); // 3 Sekunden warten damit der Rotor anlaufen kann
|
53 |
|
54 | Text ("Das ist ein Test"); // Textausgabe
|
55 |
|
56 | // mainloop
|
57 | while(1)
|
58 | {
|
59 |
|
60 | }
|
61 | }
|
62 |
|
63 |
|
64 |
|
65 | // Subroutinen
|
66 |
|
67 | // Zeichenkette ausgeben
|
68 | void Text( char *zeiger)
|
69 | {
|
70 | // zunächst den Beginn einer Millisekunden Periode abwarten
|
71 | Timeout = 1; // Merker für "1ms vorbei" zurücksetzen
|
72 | Highbit(); // kein IR, bis eine neue Millisekunde beginnt
|
73 |
|
74 | // Start der Ausgabe
|
75 | Zeichen_senden (0x00); // Steuerzeichen
|
76 | while(*zeiger != 0) {Zeichen_senden (*zeiger++);} // Zeichenkette Zeichenweise senden
|
77 | Zeichen_senden (0x03); // Steuerzeichen 3 Fade out Fade in
|
78 | Zeichen_senden (0x05); // Steuerzeichen
|
79 | }
|
80 |
|
81 |
|
82 | void Zeichen_senden (unsigned char z)
|
83 | {
|
84 | for (unsigned char i = 8; i > 0; i--) // 8 mal das MSB auf "0" oder "1" prüfen, ausgeben und einmal linksschieben
|
85 | {
|
86 | if (z & (1 << 7))
|
87 | Highbit(); // MSB war eine "1" => 1ms lang kein IR Signal
|
88 | else
|
89 | Lowbit(); // MSB war eine "0" => 1ms lang IR-Burst mit 38kHz
|
90 |
|
91 | z <<= 1; // Datenbyte einmal linksschieben und sich selbst zuweisen
|
92 | }
|
93 | }
|
94 |
|
95 |
|
96 | void Lowbit (void) // solange IR-Pulse 10µs high / 16µs low bis T0 überläuft
|
97 | {
|
98 |
|
99 | // IR Pulse von 10µsPuls / 16µsPause ausgeben,
|
100 | while (Timeout)
|
101 | {
|
102 | PORTB |= (1 << Tx); // Tx Pin high
|
103 | asm volatile ("nop");
|
104 | asm volatile ("nop");
|
105 | asm volatile ("nop");
|
106 | asm volatile ("nop");
|
107 | asm volatile ("nop");
|
108 | asm volatile ("nop");
|
109 | asm volatile ("nop");
|
110 | asm volatile ("nop");
|
111 | PORTB &= ~(1 << Tx); // Tx Pin low
|
112 | asm volatile ("nop");
|
113 | asm volatile ("nop");
|
114 | asm volatile ("nop");
|
115 | asm volatile ("nop");
|
116 | asm volatile ("nop");
|
117 | asm volatile ("nop");
|
118 | asm volatile ("nop");
|
119 | asm volatile ("nop");
|
120 | asm volatile ("nop");
|
121 | }
|
122 | Timeout = 1; // Merker für "1ms vorbei" zurücksetzen
|
123 | }
|
124 |
|
125 |
|
126 | void Highbit (void) // 1ms kein IR Signal
|
127 | {
|
128 | while (Timeout) // bis T0 überläuft
|
129 | {
|
130 | PORTB &= ~(1 << Tx); // Tx Pin low
|
131 | }
|
132 |
|
133 | Timeout = 1; // Merker für "1ms vorbei" zurücksetzen
|
134 | }
|