/********************************************************************/ /* D/A Converter sample with SAB80C517 - 1996 Arnd Kobus */ /********************************************************************/ #include <80C517.h> #include #include #include #include #include main () { unsigned char i; char string[5]="10\n", ch; int PWM=20; /* setup compare timer CT */ /* Der Siemens SAB80C517 besitzt auer den drei Timern 0, 1, und 2, die alle maximal mit 1/12 der Oszillatorfrequenz laufen knnen einen vierten Timer, der mit maximal der halben Oszilatorfrequenz laufen kann. Dies ist der 16 Bit Compare Timer CT. Die auf dem chip befindliche Compare Capture Unit CCU erlaubt es, verschiedene Timer mit 16 Bit Registern CM0 bis CM4 Registern zu vergleichen und bei Uebereinstimmung Portbits zu setzen. Benutzt man dazu den Timer CT, so werden beim Ueberlauf des Timers die Portbits P4.0 bis P4.3 geloescht und bei erreichen der Register CM0 bis CM3 gesetzt. So kann man also ohne Prozessorbelastung PWM Signale erzeugen. */ CTCON = 0x00; /* Taktrate Fosz/2 = 9 MHz */ CTREL = 0xFF00; /* Reload Wert fr CT. Wir wollen 256 Stufen unterscheiden, also 0xFFFF-255=0xFF00 */ CM0=0xFF40; /* Wert, bei dem Ausgang gesetzt wird. So mu man also nur noch CML0 setzen als PWM Wert. */ CMSEL=0x01; /* Fr Compare 0 CT als Timebasis (nicht Timer2). Daher Ausgabe an Pin P4.0. */ CMEN=0x01; /* Enable Compare 0 */ printf("PWM Signal an P4.0. Bitte PWM Wert eingeben zwischen 0 und 255.\n"); while(1) { printf("PWM Wert: "); gets (string, sizeof(string)); sscanf (string, "%d", &PWM); CML0=PWM; } }