1 | /** I N C L U D E S **********************************************************/
|
2 | #include "p18f2550.h" // PIC- Header
|
3 | #include "delays.h" // für Warteschleifen
|
4 | #include "usart.h" // für RS232- Schnittstelle
|
5 |
|
6 | /** Configuration Fuses********************************************************/
|
7 | #pragma config FOSC = HS // CPU=20 MHz
|
8 | #pragma config PWRT = ON // PowerOnTimer AN
|
9 | #pragma config BOR = OFF // BOR AUS
|
10 | #pragma config WDT = OFF // Watchdog Timer
|
11 | #pragma config LVP = OFF // Low Voltage ICSP AUS
|
12 | #pragma config PBADEN = OFF // PORTA Analogeingänge AUS
|
13 | #pragma config VREGEN = OFF // VREGEN AUS
|
14 | #pragma config MCLRE = ON // Master Reset AN
|
15 | #pragma config PLLDIV = 1 // PLLTeiler = 1 => 20 MHz
|
16 | #pragma config CPUDIV = OSC1_PLL2 // OSCTeiler = 1 => 20 MHz
|
17 | #pragma config USBDIV = 1 // CPUTeiler = 1 => 20 MHz
|
18 |
|
19 | /** Globale Variablendeklarationen**********************************************************/
|
20 | signed long int counter = -18946; // Zählvariable
|
21 | signed long int ncounter = 0; // Hilfsvariable
|
22 | char gray_code = 0; // Einlesevariable
|
23 | char gray_help = 0; // Vergleichsvariable
|
24 | char ch0, ch1, ch2, ch3, ch4, ch5, ch6; // Sendevariablen
|
25 | int s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0; // Counterstellenvariablen
|
26 | #define Takt 200000000 // Quarz HS 20 MHZ an OSC1- OSC2
|
27 | #define Baud 57600 // Baudrate über SPBRG eingestellt 1 BIT = 1,74 µs
|
28 |
|
29 | /** Programm **************************************************/
|
30 | #pragma code
|
31 |
|
32 | void InitUsart(void)
|
33 | {
|
34 | SPBRG = 20; // Baudrate 57600 Baud SPBRG- Berechnung 59524 = 20000000/(16*(20+1)) = Fehlerquote unter 5%
|
35 | SPBRGH = 0; // 8 Bit Übertragung
|
36 | TRISCbits.TRISC6 = 1; // Aktivierung Senden TXD
|
37 | TRISCbits.TRISC7 = 1; // Aktivierung Empfangen RXD
|
38 | RCSTA = 0b10000100; // Empfangsregister konfigurieren
|
39 | TXSTA = 0b00100100; // Senderegister konfigurieren
|
40 | return 0;
|
41 | }
|
42 |
|
43 | void PICConfig(void)
|
44 | {
|
45 | // PORTA => Ausgänge LEDs RA0, RA4, RA5
|
46 | TRISA = 0x00;
|
47 | PORTA = 0x00;
|
48 | LATA = 0x00;
|
49 |
|
50 | // PORTB => Eingänge Inkrementalgeber
|
51 | TRISB = 0xFF;
|
52 | PORTB = 0x00;
|
53 | LATB = 0x00;
|
54 |
|
55 | // PORTC => alles Ausgänge RC0, RC1, RC2
|
56 | TRISC = 0x00;
|
57 | PORTC = 0x00;
|
58 | LATC = 0x00;
|
59 | return 0;
|
60 | }
|
61 |
|
62 | void Senden(unsigned char byte)
|
63 | {
|
64 | WriteUSART(byte); // Byte in RS232 Sendebyte schreiben
|
65 | while(BusyUSART( )); // Warten bis Sendebyte leer
|
66 | return 0;
|
67 | }
|
68 |
|
69 | signed long int Counter(void)
|
70 | {
|
71 | gray_code = PORTBbits.RB0; //A1 X
|
72 | gray_help = gray_code << 1; // X0
|
73 | gray_code = gray_help | PORTBbits.RB1; //B1 XY
|
74 | gray_help = gray_code << 1; // XY0
|
75 | Nop(); // 0,2 µs Warten
|
76 | gray_code = gray_help | PORTBbits.RB0; //A2 XYZ
|
77 | gray_help = gray_code << 1; // XYZ0
|
78 | gray_code = gray_help | PORTBbits.RB1; //B2 XYZW
|
79 | Nop(); // 0,2 µs Warten
|
80 | switch (gray_code)
|
81 | {
|
82 | case 0b00000001:
|
83 | counter--;
|
84 | break;
|
85 | case 0b00000010:
|
86 | counter++;
|
87 | break;
|
88 | case 0b00000100:
|
89 | counter--;
|
90 | break;
|
91 | case 0b00000111:
|
92 | counter++;
|
93 | break;
|
94 | case 0b00001101:
|
95 | counter--;
|
96 | break;
|
97 | case 0b00001110:
|
98 | counter++;
|
99 | break;
|
100 | case 0b00001000:
|
101 | counter--;
|
102 | break;
|
103 | case 0b00001011:
|
104 | counter++;
|
105 | break;
|
106 | } // Ende Switch- Anweisung
|
107 | return counter;
|
108 | }
|
109 |
|
110 | char InttoChar(int counter)
|
111 | {
|
112 | ncounter = counter;
|
113 | ch0 = 0;
|
114 | ch1 = 0;
|
115 | ch2 = 0;
|
116 | ch3 = 0;
|
117 | ch4 = 0;
|
118 | ch5 = 0;
|
119 | if(counter == 0 || counter > 0)
|
120 | {
|
121 | ch0 = '+';
|
122 | }
|
123 | if (counter < 0)
|
124 | {
|
125 | ch0 = '-';
|
126 | counter = (counter*(-1));
|
127 | }
|
128 | for(;counter > 9999;counter -= 10000)
|
129 | {s1++;}
|
130 | for(;counter > 999;counter -= 1000)
|
131 | {s2++;}
|
132 | for(;counter > 99;counter -= 100)
|
133 | {s3++;}
|
134 | for(;counter > 9;counter -= 10)
|
135 | {s4++;}
|
136 | for(;counter > 0;counter -= 1)
|
137 | {s5++;}
|
138 | ch1 = s1 + 0x30;
|
139 | ch2 = s2 + 0x30;
|
140 | ch3 = s3 + 0x30;
|
141 | ch4 = s4 + 0x30;
|
142 | ch5 = s5 + 0x30;
|
143 | ch6 = '#';
|
144 | s1, s2, s3, s4, s5 = 0; // Counterstellenvariablen nullen
|
145 | return ch0, ch1, ch2, ch3, ch4, ch5, ch6; // Rückgabe von chars
|
146 | }
|
147 |
|
148 | void main(void)
|
149 | {
|
150 | PICConfig(); // Konfigurieren der PORTs
|
151 | InitUsart(); // Start der USART- Schnittstelle
|
152 | PORTCbits.RC0 = 1; // Anschalten EIN/Aus Lampe
|
153 | //InttoChar(counter); // Zähler in chars zum Senden umwandeln
|
154 | //loop
|
155 | while(1) //Hauptprogramm
|
156 | {
|
157 | //Counter(); // Zählen
|
158 | InttoChar(counter); // Zähler in chars zum Senden umwandeln
|
159 | counter = ncounter;
|
160 | Nop(); // Warten
|
161 | Nop(); // Warten
|
162 | Senden(ch0); // Senden Vorzeichen
|
163 | Senden(ch1); // Senden Zehntausender
|
164 | Senden(ch2); // Senden Tausender
|
165 | Senden(ch3); // Senden Hunderter
|
166 | Senden(ch4); // Senden Zehner
|
167 | Senden(ch5); // Senden Einer
|
168 | Senden(ch6); // Senden Trennzeichen
|
169 | } // Ende Endlosschleife
|
170 | return 0;
|
171 | } /* Ende Mainfunktion */
|