/****************************************************************************/ /* */ /* Project : Motor Umpolung-Schalter */ /* Author : Otmar Schmid */ /* Homepage: http://oschmid.home.solnet.ch */ /* Licence : GNU General Public License (GPL) */ /* Tools : Keil C V3.2 */ /* */ /* Module : UMPOL.C */ /* HW : CPU 87C751 mit 12MHz Quarz */ /* Purpose : Motor Umpolung */ /* P10: Motor Eingang */ /* low Motor steht still */ /* high Motor dreht */ /* P15: Puls Eingang vom Empfänger */ /* low 20ms Intervall */ /* high 1.0ms - 2.0ms Eingangspuls */ /* 1.0ms rückwärts */ /* 1.5ms stop */ /* 2.0ms vorwärts */ /* P30: Relais Ausgang */ /* low Relais angezogen (rückwärts) */ /* high Relais nicht angezogen (vorwärts) */ /* P31: LED grün Ausgang */ /* low LED dunkel */ /* high LED hell */ /* P32: LED rot Ausgang */ /* low LED dunkel */ /* high LED hell */ /* P37: Puls Ausgang für Fahrtregler */ /* low 20ms Intervall */ /* high 1.0ms - 2.0ms */ /* 1.0ms stop */ /* 2.0ms vollgas */ /* */ /* History : */ /* 18.10.99 - Start UMPOL */ /* - Version 0.1 */ /* 23.10.99 - Version 1.0 */ /* 23.10.99 - Version 1.1 */ /* 12.12.99 - Version 1.2 */ /* - Solange der Motor ausläuft mit 1.02ms ansteuern -> Freilauf */ /* Robbe Regler: 1.00ms - 1.01ms Bremse */ /* 1.01ms - 1.06ms Freilauf */ /* 1.06ms - 2.00ms Drehen */ /* */ /****************************************************************************/ /* Register für 87C751 */ /* BYTE Register */ sfr P0 = 0x80; sfr P1 = 0x90; sfr P3 = 0xB0; /* BIT Register P0 */ sbit P02 = 0x82; sbit P01 = 0x81; sbit P00 = 0x80; /* BIT Register P1 */ sbit P17 = 0x97; sbit P16 = 0x96; sbit P15 = 0x95; /* Puls Eingang vom Empf„nger */ sbit P14 = 0x94; sbit P13 = 0x93; sbit P12 = 0x92; sbit P11 = 0x91; sbit P10 = 0x90; /* Motor Eingang -> dreht / steht still */ /* BIT Register P3 */ sbit P37 = 0xB7; /* Puls Ausgang fr Fahrtregler */ sbit P36 = 0xB6; sbit P35 = 0xB5; sbit P34 = 0xB4; sbit P33 = 0xB3; sbit P32 = 0xB2; /* LED rot Ausgang */ sbit P31 = 0xB1; /* LED grn Ausgang */ sbit P30 = 0xB0; /* Relais Ausgang */ sfr TCON = 0x88; /* Timer Control Register */ sfr TL0 = 0x8A; /* Timer 0 Low */ sfr TH0 = 0x8C; /* Timer 0 High */ /*--------------------------------------------------------------------------*/ #define false 0 #define true 1 typedef enum {e_stop, e_zurueck, e_vor} Tknueppel; typedef enum {e_bremse, e_freilauf, e_drehen} Tmotorzust; unsigned char motorzust = e_bremse; /* Ansteuerung des Motors */ unsigned char vor = true; /* TRUE = vorw„rts, FALSE = rckw„rts */ unsigned char relaispause = 0; /* Pause fr Relais nach dem Umschalten */ /*--------------------------------------------------------------------------*/ void delay(unsigned int del) { unsigned int n; n = del; while(n > 0) { n--; } /* while */ } /* delay */ /*--------------------------------------------------------------------------*/ void init() { motorzust = e_bremse; vor = true; relaispause = 0; P1 = 0xFF; P3 = 0xFF; delay(4000); P31 = 1; /* LED gn ein */ P32 = 1; /* LED rt ein */ delay(4000); P31 = 0; /* LED gn aus */ P32 = 0; /* LED rt aus */ delay(4000); /* Timer initialisieren */ TCON = 0x90; /* Timer Control Register */ /* GATE C/T TF TR IE0 IT0 IE1 IT1 */ /* 1 0 0 1 0 0 0 0 */ TL0 = 0; TH0 = 0; } /* init */ /*--------------------------------------------------------------------------*/ unsigned int puls_messen() { unsigned int cnt; /* positive Flanke erkennen */ while(P15 == 0) { /* warten bis pos. Flanke */ } /* while */ /* negative Flanke erkennen */ while(P15 == 1) { /* warten bis neg. Flanke */ } /* while */ cnt = 256 * TH0 + TL0; TL0 = 0; TH0 = 0; return cnt; } /* puls_messen */ /*--------------------------------------------------------------------------*/ /* 1.0ms = 77, 1.5ms = 115, 2.0ms = 154, 13.0ms = 1000 */ /*--------------------------------------------------------------------------*/ void puls_ausgeben(unsigned int dauer) { unsigned int cnt; cnt = dauer; P37 = 0; /* Puls zum Fahrtregler ein */ while (cnt > 0) { cnt --; } /* while */ P37 = 1; /* Puls zum Fahrtregler aus */ } /* puls_ausgeben */ /*--------------------------------------------------------------------------*/ unsigned int puls_berechnen(unsigned int dauer) { unsigned int cnt; cnt = 79; /* 77 -> Bremse, 79 -> Freilauf */ if (dauer > 1550) { cnt = dauer - 1550; cnt = 5 * cnt / 29; cnt = cnt + 79; } /* if */ if (dauer < 1450) { cnt = 1450 - dauer; cnt = 5 * cnt / 58; /* halbe Geschwindigkeit rckw„rts */ cnt = cnt + 79; } /* if */ if (motorzust == e_freilauf) { cnt = 79; } /* if */ if (motorzust == e_bremse) { cnt = 77; } /* if */ return cnt; } /* puls_berechnen */ /*--------------------------------------------------------------------------*/ void auswerten(unsigned int dauer) { unsigned char knueppel; /* Tknueppel knueppel; */ unsigned int cnt; cnt = puls_berechnen(dauer); puls_ausgeben(cnt); knueppel = e_stop; /* Impuls > 1.55ms vorw„rts */ if (dauer > 1550) { knueppel = e_vor; } /* if */ /* Impuls < 1.45ms rckw„rts */ if (dauer < 1450) { knueppel = e_zurueck; } /* if */ /* LED Ausgabe */ if (knueppel == e_zurueck) { P31 = 0; /* LED gn aus */ P32 = 1; /* LED rt ein */ } /* if */ if (knueppel == e_vor) { P31 = 1; /* LED gn ein */ P32 = 0; /* LED rt aus */ } /* if */ if (knueppel == e_stop) { P31 = 0; /* LED gn aus */ P32 = 0; /* LED rt aus */ } /* if */ /* Relais Ansteuerung */ if (P10 == 1) { /* P10 == 1 -> Motor dreht */ if ((knueppel == e_zurueck) && (vor == true)) { motorzust = e_freilauf; P31 = 1; /* LED gn ein */ P32 = 1; /* LED rt ein */ } /* if */ if ((knueppel == e_vor) && (vor == false)) { motorzust = e_freilauf; P31 = 1; /* LED gn ein */ P32 = 1; /* LED rt ein */ } /* if */ if (knueppel == e_stop) { motorzust = e_freilauf; P31 = 1; /* LED gn ein */ P32 = 1; /* LED rt ein */ } /* if */ } else { /* P10 == 0 -> Motor steht still */ motorzust = e_bremse; if (relaispause > 0) { relaispause--; } else { if (knueppel == e_zurueck) { if (vor == true) { relaispause = 20; } else { motorzust = e_drehen; } /* if */ vor = false; P30 = 0; /* Relais ein */ } /* if */ if (knueppel == e_vor) { if (vor == false) { relaispause = 20; } else { motorzust = e_drehen; } /* if */ vor = true; P30 = 1; /* Relais aus */ } /* if */ } /* if */ } /* if */ } /* auswerten */ /*--------------------------------------------------------------------------*/ void main() { unsigned int dauer; init(); while(1) { dauer = puls_messen(); auswerten(dauer); } /* while */ } /* main */