sourcecode.c


1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
#include <main.h> //Definitionen und Konstanten
6
7
#define RXB8 1
8
#define TXB8 0
9
#define UPE 2
10
#define OVR 3
11
#define FE 4
12
#define UDRE 5
13
#define RXC 7
14
15
#define FRAMING_ERROR (1<<FE)
16
#define PARITY_ERROR (1<<UPE)
17
#define DATA_OVERRUN (1<<OVR)
18
#define DATA_REGISTER_EMPTY (1<<UDRE)
19
#define RX_COMPLETE (1<<RXC)
20
21
22
// Standard Input/Output functions
23
#include <stdio.h>
24
25
26
27
// Declare your global variables here
28
struct {
29
    int     bytezeiger;             //Zeiger auf das Byte einer Busnachricht
30
    int     bitzeiger;              //Zeiger auf das Bit im Byte einer Busnachricht
31
    char    nachricht[6];           //Speicher fuer die Nachricht max. 6 Bytes
32
    char    buffer[4][6];           //Buffer fuer eine Nachricht max. 6 Bytes bereit zum Abarbeiten.
33
    int     flag[4];                //Zeigt an das im Buffer eine Nachricht abgearbeitet werden muss.
34
    int     laenge[4];              //Laenge der Nachricht in Bytes !inklusive Chksumme!
35
    int     eingangnr;              //Setzt auf den aktuellen empfangs Buffer 0 - 3
36
    int     ausgangsnr;             //Setzt auf den aktuellen zu bearbeitenden Buffer 0 - 3
37
    char    chksumme;               //Speicher fuer die Checksumme
38
    int     status;                 //Zeigt den Status an.
39
    } volatile bus_rx;    //Container fuer den Busempfaenger mit 4 Bufferstellen
40
struct {
41
    int     bytezeiger;             //Zeiger auf das Byte einer Busnachricht
42
    int     bitzeiger;              //Zeiger auf das Bit im Byte einer Busnachricht
43
    char    nachricht[6];           //Speicher fuer die Nachricht max. 6 Bytes
44
    int     laenge;                 //Laenge der Nachricht in Bytes !inklusive Chksumme!
45
    int     flag;                   //Zeigt an das im Buffer eine Nachricht abgearbeitet werden muss.
46
    int     status;                 //Zeigt den Status an.
47
    int     zeit;                   //Speicher fuer den Bussender
48
    } volatile bus_tx;    //Container fuer den Busdaten Sender
49
struct {
50
    int     status;                 //Status des Rs232 Empfaengers
51
    char    nachricht[5];           //Speicher fuer eine Nachricht zum Bus
52
    int     bytezeiger;             //Zeigt auf ein Byte in der Nachricht
53
    } rs232_rx; //Container fuer die rs232 Kommunikation  
54
55
int uart_putc(char daten);
56
57
ISR(BADISR_vect)
58
{
59
  uart_putc((char)0x24);
60
}
61
62
/**********************************************************************************/
63
/*! Analog Comparator Interrupt
64
 */
65
/**********************************************************************************/
66
ISR(ANALOG_COMP_vect)
67
{
68
  asm ("nop");
69
}//Ende analog comparator interrupt -- busdatenempfaenger
70
71
72
/**********************************************************************************
73
 *    Sendet ein Byte an den PC.
74
 *    !!! Nicht Interrupt gesteuert!!! Wartet bis Senden möglich ist, max. 125us bei 4MHz (500Zyklen)
75
 *
76
 *    - Return 0 wenn Daten gesendet werden konnten
77
 *    - Return 1 wenn Fehler auftrat 
78
 */
79
/**********************************************************************************/
80
int uart_putc(char daten)
81
{
82
    int i;                        //Hilfzaehler fuer die Routine
83
    i= 0;                         //Um Verzoegerung mit zu zaehlen auf 0 setzen
84
    
85
    while ((!(UCSR0A & (1<<UDRE))) & (i <= 500))  //warten bis Senden moeglich aber nur 500 Zyklen
86
    {
87
        i++;
88
    }
89
    if( UCSR0A & (1<<UDRE) ) //Wenn der TX Buffer frei ist Daten senden
90
    {    
91
        UDR0 = daten;        //Daten in Sendebuffer schreiben
92
        return 0;           //Rückmeldung OK
93
    }
94
    else                    //Wenn der TX Buffer nach 500 Zyklen immer noch nicht frei ist
95
    { 
96
        return 1;           //Einen Fehler zurück melden
97
    }
98
       
99
}//Ende int uart_putc(char daten)
100
101
/**********************************************************************************
102
 *      
103
 *    Empfaengt RS232 Daten vom PC
104
 *   
105
 *   - Handshake: PC sendet Handshake Signal, Controller antwortet OK, PC sendet erneut 
106
 *                Handshake Signal. Controller antwortet OK und ist verbunden!
107
 *   - Senden:    PC sendet einen Befehl der auf den Bus gesendet werden soll
108
 *                Es werden 5 Bytes erwartet.
109
 */
110
/**********************************************************************************/
111
ISR(USART0_RX_vect) 
112
{     
113
int i;
114
115
asm ("cli");
116
asm ("nop");
117
118
 uart_putc(rs232_rx.status);
119
   switch(rs232_rx.status)
120
    {
121
        case BUS_STANDBY:   //Bisher war RS232 Inaktiv
122
            if(UDR0 == HANDSHAKE) //Handshake anforderung
123
            {
124
                uart_putc(OK);   //Bestaetigen
125
                rs232_rx.status= BUS_HANDSHAKE;
126
         uart_putc(0x55);
127
        for(i= 0; i<500; i++)
128
          uart_putc(i);
129
130
131
            }
132
            break;
133
        case BUS_HANDSHAKE: //Handshake ausfuehren
134
            if(UDR0 == HANDSHAKE) //Handshake erfolgreich
135
            {
136
                uart_putc(OK);   //Bestaetigen
137
                rs232_rx.status= BUS_READY;
138
        uart_putc(0x66);
139
            }
140
            else  //Handshake fehlgeschlagen
141
            {
142
                uart_putc(FAULT);    //Fehler senden.
143
                rs232_rx.status= BUS_STANDBY;
144
            }
145
            break;
146
        case BUS_READY:     //Verbindung mit dem PC besteht
147
            switch(UDR0) //Je nach Befehl reagieren.
148
            {
149
                case SENDEN:  //naechsten 5 byte auf Bus senden
150
                    rs232_rx.status= BUS_SENDEN;
151
                    rs232_rx.bytezeiger= 0;
152
                    break;
153
                case DISCONNECT:  //Vom PC trennen
154
                    uart_putc(OK); //Bestaetigen
155
                    rs232_rx.status= BUS_STANDBY;
156
                    break;
157
                default:
158
                    uart_putc(FAULT); //Fehler senden
159
                    break;                    
160
            }
161
            break;
162
        case BUS_SENDEN:    //Nachricht zum Senden zusammen setzten
163
            //Es werden 5 Bytes vom PC + ein OK erwartet
164
            if(rs232_rx.bytezeiger >= 5) //Jetzt muesste OK kommen
165
            {
166
                if(UDR0 == OK)
167
                {
168
                    uart_putc(OK);  //Bestaetigen
169
                   // bustransmitter(rs232_rx.nachricht[0],rs232_rx.nachricht[1],rs232_rx.nachricht[2],rs232_rx.nachricht[3],rs232_rx.nachricht[4]);
170
                    rs232_rx.status= BUS_READY;
171
                }
172
                else //Falsche uebertragung --> Nachricht verwerfen.
173
                {
174
                    uart_putc(FAULT); //Fehler senden
175
                    rs232_rx.status= BUS_READY;
176
                }
177
                
178
            }
179
            else //Noch mit empfang beschaeftigt.
180
                rs232_rx.nachricht[rs232_rx.bytezeiger++]= UDR0;
181
           break;
182
    }                                  
183
    UCSR0A&= 0x7F;    //RXC flag loeschen
184
  
185
  asm ("sei");   
186
}//Ende Usart RX Interrupt -- RS232 Empfang
187
188
int main(void)
189
{
190
// Declare your local variables here
191
int i;
192
uart_putc(0x31);
193
//Watchdog Timer ausschalten
194
  WDTCR|= 0x18; //Logic 1 to WDCE and WDE
195
  WDTCR= 0x00; //Watchtog off
196
197
198
 // Input/Output Ports initialization
199
    // Port A initialization
200
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
201
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
202
    PORTA=0x00;
203
    DDRA=0xFF;
204
205
    // Port B initialization
206
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
207
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 
208
    PORTB=0x00;
209
    DDRB=0xFF;
210
211
    // Port C initialization
212
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=In Func0=In 
213
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=P State0=P 
214
    PORTC=0x03;
215
    DDRC=0xFC;
216
217
    // Port D initialization
218
    // Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=Out Func0=Out 
219
    // State7=P State6=P State5=P State4=0 State3=T State2=T State1=0 State0=0 
220
    PORTD=0xE0;
221
    DDRD=0x13;
222
223
    // Port E initialization
224
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In 
225
    // State7=0 State6=0 State5=0 State4=0 State3=T State2=T State1=T State0=T 
226
    PORTE=0x00;
227
    DDRE=0xF0;
228
229
    // Port F initialization
230
    // Func7=Out Func6=Out Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
231
    // State7=0 State6=0 State5=0 State4=T State3=T State2=T State1=T State0=T 
232
    PORTF=0x00;
233
    DDRF=0xE0;
234
235
    // Port G initialization
236
    // Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out 
237
    // State4=0 State3=0 State2=0 State1=0 State0=0 
238
    PORTG=0x00;
239
    DDRG=0x1F;
240
241
    // Timer/Counter 0 initialization
242
    // Clock source: System Clock
243
    // Clock value: Timer 0 Stopped
244
    // Mode: Normal top=FFh
245
    // OC0 output: Disconnected
246
    ASSR=0x00;
247
    TCCR0=0x00;
248
    TCNT0=0x00;
249
    OCR0=0x00;
250
251
    // Timer/Counter 1 initialization
252
    // Clock source: System Clock
253
    // Clock value: Timer 1 Stopped
254
    // Mode: Normal top=FFFFh
255
    // OC1A output: Discon.
256
    // OC1B output: Discon.
257
    // OC1C output: Discon.
258
    // Noise Canceler: Off
259
    // Input Capture on Falling Edge
260
    // Timer 1 Overflow Interrupt: Off
261
    // Input Capture Interrupt: Off
262
    // Compare A Match Interrupt: Off
263
    // Compare B Match Interrupt: Off
264
    // Compare C Match Interrupt: Off
265
    TCCR1A=0x00;
266
    TCCR1B=0x00;
267
    TCNT1H=0x00;
268
    TCNT1L=0x00;
269
    ICR1H=0x00;
270
    ICR1L=0x00;
271
    OCR1AH=0x00;
272
    OCR1AL=0x00;
273
    OCR1BH=0x00;
274
    OCR1BL=0x00;
275
    OCR1CH=0x00;
276
    OCR1CL=0x00;
277
278
    // Timer/Counter 2 initialization
279
    // Clock source: System Clock
280
    // Clock value: Timer 2 Stopped
281
    // Mode: Normal top=FFh
282
    // OC2 output: Disconnected
283
    TCCR2=0x00;
284
    TCNT2=0x00;
285
    OCR2=0x00;
286
287
    // Timer/Counter 3 initialization
288
    // Clock source: System Clock
289
    // Clock value: Timer 3 Stopped
290
    // Mode: Normal top=FFFFh
291
    // Noise Canceler: Off
292
    // Input Capture on Falling Edge
293
    // OC3A output: Discon.
294
    // OC3B output: Discon.
295
    // OC3C output: Discon.
296
    // Timer 3 Overflow Interrupt: Off
297
    // Input Capture Interrupt: Off
298
    // Compare A Match Interrupt: Off
299
    // Compare B Match Interrupt: Off
300
    // Compare C Match Interrupt: Off
301
    TCCR3A=0x00;
302
    TCCR3B=0x00;
303
    TCNT3H=0x00;
304
    TCNT3L=0x00;
305
    ICR3H=0x00;
306
    ICR3L=0x00;
307
    OCR3AH=0x00;
308
    OCR3AL=0x00;
309
    OCR3BH=0x00;
310
    OCR3BL=0x00;
311
    OCR3CH=0x00;
312
    OCR3CL=0x00;
313
314
    // External Interrupt(s) initialization
315
    // INT0: Off
316
    // INT1: Off
317
    // INT2: Off
318
    // INT3: Off
319
    // INT4: Off
320
    // INT5: Off
321
    // INT6: Off
322
    // INT7: Off
323
    EICRA=0x00;
324
    EICRB=0x00;
325
    EIMSK=0x00;
326
327
    // Timer(s)/Counter(s) Interrupt(s) initialization
328
    TIMSK=0x00;
329
    ETIMSK=0x00;
330
331
    // USART0 initialization
332
    // Communication Parameters: 8 Data, 1 Stop, No Parity
333
    // USART0 Receiver: On
334
    // USART0 Transmitter: On
335
    // USART0 Mode: Asynchronous
336
    // USART0 Baud Rate: 9600
337
    UCSR0A=0x00;
338
    UCSR0B=0x98;
339
    UCSR0C=0x06;
340
    UBRR0H=0x00;
341
    UBRR0L=0x19;
342
343
    // USART1 initialization
344
    // Communication Parameters: 8 Data, 1 Stop, No Parity
345
    // USART1 Receiver: On
346
    // USART1 Transmitter: On
347
    // USART1 Mode: Asynchronous
348
    // USART1 Baud Rate: 9600
349
    UCSR1A=0x00;
350
    UCSR1B=0x18;
351
    UCSR1C=0x06;
352
    UBRR1H=0x00;
353
    UBRR1L=0x19;
354
355
    // Analog Comparator initialization
356
    // Analog Comparator: On
357
    // Interrupt on Falling Output Edge
358
    // Analog Comparator Input Capture by Timer/Counter 1: Off
359
    ACSR=0x0A;
360
    SFIOR=0x00;
361
362
  
363
364
uart_putc(0x32);
365
366
    // Global enable interrupts
367
    asm ("sei");
368
369
    //Variablen in Ausgangszustand bringen:
370
    bus_rx.status= BUS_STANDBY;
371
    for(i=0; i<4; i++)
372
        bus_rx.flag[i]=   0;
373
    bus_rx.eingangnr= 0;
374
    bus_rx.ausgangsnr= 0;
375
    bus_tx.status= BUS_STANDBY;
376
    bus_tx.flag=   0;
377
    rs232_rx.status= BUS_STANDBY;    
378
  uart_putc(0x33);
379
  uart_putc(MCUCSR);
380
  MCUSR= 0x00;
381
                        
382
383
while (1)
384
      {
385
      PORTE ^= 0x20; 
386
      for(i=0 ; i<= 10000;i++)
387
        asm ("nop");
388
       
389
      
390
391
      };
392
}