FloppyMusik.c


1
/*
2
 *    FloppyMusik.c
3
 *
4
 *    Created: 11.07.2014 08:09:28
5
 *      Author: chaoskind
6
 *    Programm zur Steuerung von 3,5" Floppy Laufwerken, um Töne zu erzeugen
7
 *    
8
 *
9
 *    Pinbelegung(Active Low)    0/1
10
 *    
11
 *    PD1 = Floppy        An/Aus
12
 *    PD2 = Diskmotor           An/Aus
13
 *    PD3 = Richtung Lesekopf   Vor/Zurück
14
 *    PD4 = Schritt
15
 */
16
 
17
#define F_CPU 8000000UL
18
 
19
 
20
#define Floppy 1
21
#define Motor 2
22
#define Richtung 3
23
#define Schritt 4
24
 
25
#define Rueckwaerts (1<<3)
26
 
27
#define FLOPPY_AN        PORTD &= ~(1 << Floppy);
28
#define FLOPPYY_AUS        PORTD |= (1 << Floppy);
29
 
30
#define MOTOR_AN        PORTD &= ~(1 << Motor);
31
#define MOTOR_AUS        PORTD |= (1 << Motor);
32
 
33
#define KOPF_VOR        PORTD &= ~(1 << Richtung);
34
#define KOPF_RUECK        PORTD |= (1 << Richtung);
35
 
36
#define SCHRITT_LOW        PORTD &= ~(1 << Schritt);        //einmal Low High um einen Schritt auszuführen
37
#define SCHRITT_HIGH      PORTD |= (1 << Schritt);
38
 
39
#define TON_AUS          TCCR1B &= ~(1<<CS01);
40
#define TON_AN          TCCR1B |= (1<<CS01);
41
 
42
#define STEP_TIME    10
43
 
44
#define Grundstellung   0b00011110;
45
 
46
 
47
 
48
#define Stille          0
49
#define A        2272
50
#define Ais        2145
51
#define h        2024
52
#define C        1911
53
#define Cis        1804
54
#define D        1703
55
#define Dis        1607
56
#define E        1517
57
#define F        1432
58
#define Fis        1351
59
#define G        1276
60
#define Gis        1203
61
 
62
 
63
 
64
#include <avr/io.h>
65
#include <avr/interrupt.h>
66
#include <util/delay.h>
67
 
68
 
69
void Init (void);
70
void Startposition (void);
71
void WildeTonfolge (void);
72
void TonSpielen(uint16_t Dauer, uint16_t Ton, uint8_t Oktave);
73
 
74
volatile uint8_t Schrittzaehler = 0;
75
volatile uint8_t Minutenzaehler = 0;
76
volatile uint16_t SysTick_ms = 0;
77
volatile uint16_t zeitAlt = 0;
78
79
ISR(TIMER1_COMPA_vect)
80
{    
81
    FLOPPY_AN
82
    
83
    if (PORTD & Rueckwaerts)                    //Aktuellen Zustand einlesen und prüfen in welche Richtung der letzte Schritt ging    
84
    {            
85
        Schrittzaehler ++;
86
    
87
        if (Schrittzaehler >=60)        //um nicht in den Anschlag zu fahren, nach 60 Schritten Richtung wechseln (von Anschlag zu Anschlag etwa 85)
88
        {
89
            KOPF_VOR
90
            Schrittzaehler = 0;
91
        }        
92
    
93
        else{}
94
    }
95
    
96
    else
97
    {        
98
        Schrittzaehler ++;
99
    
100
        if (Schrittzaehler >=60)
101
        {
102
            KOPF_RUECK
103
            Schrittzaehler = 0;
104
        }    
105
    
106
        else{}
107
    }
108
    
109
    
110
    SCHRITT_LOW
111
    _delay_us(STEP_TIME);
112
    SCHRITT_HIGH
113
    
114
    FLOPPYY_AUS                    
115
}
116
 
117
ISR (TIMER0_COMP_vect)
118
{
119
    SysTick_ms ++;
120
  
121
    if (SysTick_ms == 60000)
122
    {
123
        Minutenzaehler++;
124
        SysTick_ms = 0;
125
        zeitAlt = 0;
126
    }
127
}
128
 
129
int main(void)
130
{
131
    Init();
132
    
133
    Minutenzaehler = 0;
134
    SysTick_ms = 0;
135
  
136
    while(1)
137
    {
138
        TonSpielen(100, A, 1);
139
        TonSpielen(25, Stille, 1);
140
        TonSpielen(100, Ais, 4);
141
        TonSpielen(25, Stille, 1);
142
        TonSpielen(100, h, 2);
143
        TonSpielen(25, Stille, 1);
144
        TonSpielen(100, C, 2);
145
        TonSpielen(25, Stille, 1);
146
        TonSpielen(100, Cis, 3);
147
        TonSpielen(25, Stille, 1);
148
        TonSpielen(100, D, 4);
149
        TonSpielen(25, Stille, 1);
150
        TonSpielen(100, Dis, 5);
151
        TonSpielen(25, Stille,1);
152
        TonSpielen(100, E, 6);
153
        TonSpielen(25, Stille, 1);
154
        TonSpielen(100, F, 7);
155
        TonSpielen(25, Stille, 1);
156
        TonSpielen(100, Fis, 8);
157
        TonSpielen(25, Stille, 1);
158
        TonSpielen(100, G, 6);
159
        TonSpielen(25, Stille, 1);
160
        TonSpielen(100, Gis, 4);
161
        TonSpielen(150, Stille, 1);
162
  }
163
}
164
165
void Init(void)
166
{    
167
    DDRD = Grundstellung;
168
    PORTD = Grundstellung;
169
    
170
    OCR1A = 2000;
171
    OCR0 = 125;        
172
    TCCR0 = (1 << WGM01) | (1 << CS01) | (1 << CS00);    //Timer0 CTC Vorteiler 64, für Systick 125Ticks = 1ms        
173
    TIMSK  = (1 << OCIE1A) | (1 << OCIE0);        
174
    
175
    sei();
176
    
177
    Startposition();
178
    
179
    cli();
180
    TCCR1B = (1 << CS11) | (1 << WGM12);    //Timer1 im CTC-Modus(Clear Timer on Compare match) Vorteiler 8
181
    sei();
182
}
183
 
184
void Startposition (void)
185
{   
186
    uint8_t SysTick_alt = 0;
187
    
188
    FLOPPY_AN
189
    while (SysTick_ms < 100)                //100ms lang 1Schritt/ms um sicher an den Endanschlag zu fahren
190
    {
191
        KOPF_RUECK
192
        
193
        if (SysTick_ms - SysTick_alt)        //wenn eine ms vergangen ist, nächsten Schritt machen
194
        {
195
            SCHRITT_LOW
196
            _delay_us(STEP_TIME);
197
            SCHRITT_HIGH
198
        }
199
    
200
        SysTick_alt = SysTick_ms;
201
    }
202
    
203
    if (SysTick_ms >= 100)                    //weitere 15ms 1S/ms um auf definierte Startposition zu kommen.
204
    {
205
    
206
        while (SysTick_ms < 115)
207
        {
208
            KOPF_VOR
209
            
210
            if (SysTick_ms - SysTick_alt)
211
            {
212
                SCHRITT_LOW
213
                _delay_us(STEP_TIME);
214
                SCHRITT_HIGH
215
            }
216
      
217
            SysTick_alt = SysTick_ms;
218
        }
219
    }
220
    FLOPPYY_AUS
221
}
222
223
void TonSpielen(uint16_t Dauer, uint16_t Ton, uint8_t Oktave)
224
{
225
    Dauer = (Dauer * 10) + zeitAlt;
226
    Ton = Ton * Oktave;
227
    
228
    if (Dauer >= 60000)
229
    {
230
        Dauer -= 60000;
231
    }
232
            
233
    if (Ton > 1)
234
    {
235
        TON_AN
236
        OCR1A = Ton;
237
    }
238
     else if (Ton == 0)
239
     {
240
         TON_AUS
241
     }
242
      else
243
      {
244
          TON_AN
245
      }
246
    
247
    while (SysTick_ms != Dauer);
248
    zeitAlt = SysTick_ms;
249
    
250
        
251
}
252
253
254
255
256
/*
257
    uint16_t Noten [][2] = {
258
        {  200, 10000 },
259
        {  488, 8000 },
260
        {  732, 6000 },
261
        { 1038, 4000 },
262
        { 1453, 2000 },
263
        { 2145, 1000 },
264
        { 2256, 15555 },
265
        { 2565, 13555 },
266
        { 2900, 6443 },
267
        { 3131, 3452 },
268
        { 3333, 13431 },
269
        { 3676, 33333 },
270
        { 4000, 13333 },
271
        { 4943, 1532 },
272
        { 5924, 4245 },
273
        { 8424, 1200 },
274
        { 8600, 0 },
275
        { 8800, 1 },
276
        { 9000, 980 },
277
        { 9200, 960 },
278
        { 9400, 0 },
279
        { 9600, 1 },
280
        { 9800, 900 },
281
        {10000, 890 },
282
        {10500, 0 },
283
        {10800, 1 },
284
        {12000, 860 },
285
        {12500, 850 },
286
        {13000, 840 },
287
        {13500, 830 }
288
    };*/