/** I N C L U D E S **********************************************************/ #include "p18f2550.h" // PIC- Header #include "delays.h" // für Warteschleifen #include "usart.h" // für RS232- Schnittstelle #include "timers.h" // für Timerinterrupt /** Configuration Fuses********************************************************/ #pragma config FOSC = HS // CPU=20 MHz #pragma config PWRT = ON // PowerOnTimer AN #pragma config BOR = OFF // BOR AUS #pragma config WDT = OFF // Watchdog Timer #pragma config LVP = OFF // Low Voltage ICSP AUS #pragma config PBADEN = OFF // PORTA Analogeingänge AUS #pragma config VREGEN = OFF // VREGEN AUS #pragma config MCLRE = ON // Master Reset AN #pragma config PLLDIV = 1 // PLLTeiler = 1 => 20 MHz #pragma config CPUDIV = OSC1_PLL2 // OSCTeiler = 1 => 20 MHz #pragma config USBDIV = 1 // CPUTeiler = 1 => 20 MHz /** Globale Variablendeklarationen**********************************************************/ signed long int counter = 0; // Zähler char ch0, ch1, ch2, ch3, ch4, ch5, ch6; // Sendevariablen char code = 0; // Graycode char new = 0; // Neuer Zustand char old = 0; // Alter Zustand #define Takt 200000000 // Quarz HS 20 MHZ an OSC1- OSC2 #define Baud 57600 // Baudrate über SPBRG eingestellt 1 BIT = 1,74 µs /** Programm **************************************************/ #pragma code void InitUsart(void) { SPBRG = 20; // Baudrate 57600 Baud SPBRG- Berechnung 59524 = 20000000/(16*(20+1)) = Fehlerquote unter 5% SPBRGH = 0; // 8 Bit Übertragung TRISCbits.TRISC6 = 1; // Aktivierung Senden TXD TRISCbits.TRISC7 = 1; // Aktivierung Empfangen RXD RCSTA = 0b10000100; // Empfangsregister konfigurieren TXSTA = 0b00100100; // Senderegister konfigurieren return 0; } void PICConfig(void) { // PORTA => Ausgänge LEDs RA0, RA4, RA5 TRISA = 0x00; PORTA = 0x00; LATA = 0x00; // PORTB => Eingänge Inkrementalgeber TRISB = 0xFF; PORTB = 0x00; LATB = 0x00; // PORTC => alles Ausgänge RC0, RC1, RC2 TRISC = 0x00; PORTC = 0x00; LATC = 0x00; // PORTB-ON-CHANGE-INTERRUPT konfigurieren INTCON = 0x11001000; INTCON2 = 0x10000001; return 0; } void Senden(unsigned char byte) { WriteUSART(byte); // Byte in RS232 Sendebyte schreiben while(BusyUSART( )); // Warten bis Sendebyte leer return 0; } void Counter(void) { new = (PORTBbits.RB6<<1) | (PORTBbits.RB7); code = (old<<2) | (new); switch (code) { case 0b00000001: counter++; break; case 0b00000111: counter++; break; case 0b00001110: counter++; break; case 0b00001000: counter++; break; case 0b00000010: counter--; break; case 0b00000100: counter--; break; case 0b00001101: counter--; break; case 0b00001011: counter--; break; } // Ende Switch- Anweisung old = new; return 0; } void InttoChar(signed long int counter) { int s1 = 0, s2 = 0, s3 = 0, s4 = 0, s5 = 0; ^ // Counterstellenvariablen signed long int ncounter = 0; // Hilfscounter ncounter = counter; if(counter == 0 || counter > 0) { ch0 = '+'; } if (counter < 0) { ch0 = '-'; counter = (counter*(-1)); } for(;counter > 9999;counter -= 10000) {s1++;} for(;counter > 999;counter -= 1000) {s2++;} for(;counter > 99;counter -= 100) {s3++;} for(;counter > 9;counter -= 10) {s4++;} for(;counter > 0;counter -= 1) {s5++;} ch1 = s1 + 0x30; ch2 = s2 + 0x30; ch3 = s3 + 0x30; ch4 = s4 + 0x30; ch5 = s5 + 0x30; ch6 = '#'; counter = ncounter; return 0; } int main(void) { PICConfig(); // Konfigurieren der PORTs InitUsart(); // Start der USART- Schnittstelle PORTCbits.RC0 = 1; // Anschalten EIN/Aus Lampe //loop while(1) //Hauptprogramm { Counter(); // Zählen InttoChar(counter); // Zähler in chars zum Senden umwandeln Senden(ch0); // Senden Vorzeichen Senden(ch1); // Senden Zehntausender Senden(ch2); // Senden Tausender Senden(ch3); // Senden Hunderter Senden(ch4); // Senden Zehner Senden(ch5); // Senden Einer Senden(ch6); // Senden Trennzeichen } // Ende Endlosschleife return 0; } /* Ende Mainfunktion */