1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <avr/signal.h>
|
4 |
|
5 | typedef unsigned char uchar;
|
6 | typedef unsigned short int usint;
|
7 |
|
8 | /*++++++++++++++++++++++++++++++++Verdrahtung++++++++++++++++++++++++++++++++*/
|
9 | // ++++++++++++++++port B
|
10 | #define PortB_DDR 0xff // alles ausgänge (wird noch überschrieben durch spi config)
|
11 | #define PortB_Init 0x00 // ausgang auf 0 (s.u.)
|
12 | // ++++++++++++++++port C
|
13 | #define PortC_DDR 0xff // alles auf Ausgang
|
14 | #define PortC_Init 0x00 // alles Low
|
15 | // +++++++++++++++port D
|
16 | #define PortD_DDR 0xc0 // pin 6/7 als ausgang rest eingang
|
17 | #define PortD_Init 0x3f // eingänge pull up ein, ausgänge Low
|
18 |
|
19 | /*++++++++++++++globale Variablen+++++++++++++++++++++++++++*/
|
20 |
|
21 | volatile unsigned char t0count;
|
22 | volatile unsigned char mscount;
|
23 | volatile unsigned char sek;
|
24 |
|
25 | struct { // Bit-Variablen
|
26 | uchar Auswerten:1; // flag für starten der Auswertung
|
27 | uchar Sek:1; // flag sekundenumschaltung hat statt gefunden
|
28 | uchar Entprell:1; // 100ms flagt nutzung für entprellen
|
29 | uchar SPIfrei:1; // bit zur kontrolle für spi übertragung
|
30 | } g ;
|
31 |
|
32 | /*+++++++++++++++++++Funktionsprototypen++++++++++++++++++++*/
|
33 | void timer0_init_8bit (void); // timerintialisirung
|
34 |
|
35 | /*++++++++++++++++++++INTERRUPT verarbeitung ++++++++++++++++++*/
|
36 | SIGNAL (SIG_SPI){ // SPI übertragung beendet
|
37 | g.SPIfrei=1; //
|
38 | PORTB |= (1<<PB2); // flanke zur datenübernahme erzeugen
|
39 | PORTB &= ~(1<<PB2);
|
40 | }
|
41 |
|
42 | SIGNAL (SIG_OVERFLOW0){ // Verarbeitung Überlauf Timer 0 (Uhr)
|
43 | t0count++; // überlauf alle 16384 takte
|
44 | if (t0count==25){ // soll 75 um auf 100ms zu kommen bei 14,..
|
45 | t0count = 0;
|
46 | mscount++;
|
47 | g.Entprell=1;
|
48 | if (mscount==10){ // soll 10
|
49 | mscount=0;
|
50 | sek++;
|
51 | g.Sek=1; // flag sekundenumschaltung hat statt gefunden
|
52 | }
|
53 | }
|
54 | }
|
55 |
|
56 | /********************************Hauptprogramm********************************/
|
57 | int main (void)
|
58 | {
|
59 | outp (PortB_DDR, DDRB); outp (PortB_Init, PORTB);
|
60 | outp (PortC_DDR, DDRC); outp (PortC_Init, PORTC);
|
61 | outp (PortD_DDR, DDRD); outp (PortD_Init, PORTD);
|
62 |
|
63 | //+++++++++++++++++Variablen++++++++++++++++
|
64 |
|
65 | char i=0x68;
|
66 | //+++++++++++++++einmalige Initialisierung
|
67 |
|
68 | g.SPIfrei=1;
|
69 | timer0_init_8bit ();
|
70 | SPCR = ((1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)|(1<<CPHA));
|
71 | sei ();
|
72 |
|
73 | /*+++++++++++++++++++++Hauptschleife +++++++++++++++++++++++*/
|
74 | for (;;){ // für immer ;-)
|
75 |
|
76 | if (g.Sek) {
|
77 | g.Sek=0;
|
78 | i++;
|
79 | }
|
80 |
|
81 | if (g.SPIfrei) {
|
82 | g.SPIfrei=0;
|
83 | SPDR=i;
|
84 | }
|
85 |
|
86 | PORTC ^= (1<<PC1); // lebt er noch ?
|
87 |
|
88 | }} // main und for (;;) ende
|
89 |
|
90 | /*++++++++++++++++++++++++++++++++++Unterfunktionen++++++++++++++++++++++++++*/
|
91 | void timer0_init_8bit (void)
|
92 | { // intialisieren des timers 0
|
93 | TIMSK = _BV(TOIE0); // timer interrupt ein
|
94 | TCNT0 = 0; // timer nullen
|
95 | TCCR0 = _BV(CS01) | _BV(CS00); // starten mit vorteiler 64
|
96 | }
|