1 ///////////////////////////////////////////////////////////////////////////////
\r
3 // IAR Atmel AVR C/C++ Compiler V4.30F/W32 13/Mar/2008 04:52:01 /
\r
4 // Copyright 1996-2007 IAR Systems. All rights reserved. /
\r
6 // Source file = C:\home\kevin\pub\src\bc100\IAR\PWM.c /
\r
7 // Command line = C:\home\kevin\pub\src\bc100\IAR\PWM.c /
\r
8 // --cpu=tiny861 -ms -o C:\home\kevin\pub\src\bc1 /
\r
9 // 00\IAR\Release\Obj\ -D NDEBUG -lCN /
\r
10 // C:\home\kevin\pub\src\bc100\IAR\Release\List\ /
\r
11 // -lB C:\home\kevin\pub\src\bc100\IAR\Release\Li /
\r
12 // st\ --initializers_in_flash -s9 /
\r
13 // --no_cross_call --no_tbaa /
\r
14 // -DENABLE_BIT_DEFINITIONS -e -I "C:\Program /
\r
15 // Files\IAR Systems\Embedded Workbench /
\r
16 // 4.0\avr\INC\" -I "C:\Program Files\IAR /
\r
17 // Systems\Embedded Workbench 4.0\avr\INC\CLIB\" /
\r
18 // --eeprom_size 512 --misrac=5-9,11-12,14,16-17, /
\r
19 // 19-21,24-26,29-32,34-35,38-39,42-43,46,50, /
\r
20 // 52-54,56-59,61-62,64-65,68-80,83-84,87-91, /
\r
21 // 94-95,98-100,103-110,112-126 /
\r
22 // Enabled MISRA C rules = 5-9,11-12,14,16-17,19-21,24-26,29-32,34-35, /
\r
23 // 38-39,42-43,46,50,52-54,56-59,61-62,64-65, /
\r
24 // 68-80,83-84,87-91,94-95,98-100,103-110,112-126 /
\r
25 // Checked = 5,7-9,11-12,14,17,19-21,24,29-32,34-35,38-39, /
\r
26 // 42,46,50,52-54,56-59,61-62,64,68-69,71-80, /
\r
27 // 83-84,87-89,91,94-95,98,100,104-105,108-109, /
\r
28 // 112-115,118-126 /
\r
29 // Not checked = 6,16,25-26,43,65,70,90,99,103,106-107,110, /
\r
31 // List file = C:\home\kevin\pub\src\bc100\IAR\Release\List\P /
\r
35 ///////////////////////////////////////////////////////////////////////////////
\r
39 RSEG CSTACK:DATA:NOROOT(0)
\r
40 RSEG RSTACK:DATA:NOROOT(0)
\r
42 PUBLIC PWM_DecrementDutyCycle
\r
43 PUBLIC PWM_IncrementDutyCycle
\r
66 // C:\home\kevin\pub\src\bc100\IAR\PWM.c
\r
67 // 1 /* This file has been prepared for Doxygen automatic documentation generation.*/
\r
68 // 2 /*! \file *********************************************************************
\r
71 // 5 * Functions for use of PWM
\r
73 // 7 * Contains functions for initializing and controlling PWM output.
\r
75 // 9 * \par Application note:
\r
76 // 10 * AVR458: Charging Li-Ion Batteries with BC100\n
\r
77 // 11 * AVR463: Charging NiMH Batteries with BC100
\r
79 // 13 * \par Documentation
\r
80 // 14 * For comprehensive code documentation, supported compilers, compiler
\r
81 // 15 * settings and supported devices see readme.html
\r
84 // 18 * Atmel Corporation: http://www.atmel.com \n
\r
85 // 19 * Support email: avr@atmel.com
\r
89 // 23 * $Revision: 2299 $
\r
91 // 25 * $URL: http://svn.norway.atmel.com/AppsAVR8/avr458_Charging_Li-Ion_Batteries_with_BC100/tag/20070904_release_1.0/code/IAR/PWM.c $
\r
92 // 26 * $Date: 2007-08-23 12:55:51 +0200 (to, 23 aug 2007) $\n
\r
93 // 27 ******************************************************************************/
\r
95 // 29 #include <ioavr.h>
\r
97 ASEGN ABSOLUTE:DATA:NOROOT,050H
\r
98 // <unnamed> volatile __io _A_TCCR1A
\r
102 ASEGN ABSOLUTE:DATA:NOROOT,04fH
\r
103 // <unnamed> volatile __io _A_TCCR1B
\r
107 ASEGN ABSOLUTE:DATA:NOROOT,04dH
\r
108 // <unnamed> volatile __io _A_OCR1A
\r
112 ASEGN ABSOLUTE:DATA:NOROOT,04cH
\r
113 // <unnamed> volatile __io _A_OCR1B
\r
117 ASEGN ABSOLUTE:DATA:NOROOT,04bH
\r
118 // <unnamed> volatile __io _A_OCR1C
\r
122 ASEGN ABSOLUTE:DATA:NOROOT,04aH
\r
123 // <unnamed> volatile __io _A_OCR1D
\r
127 ASEGN ABSOLUTE:DATA:NOROOT,049H
\r
128 // <unnamed> volatile __io _A_PLLCSR
\r
132 ASEGN ABSOLUTE:DATA:NOROOT,047H
\r
133 // <unnamed> volatile __io _A_TCCR1C
\r
137 ASEGN ABSOLUTE:DATA:NOROOT,046H
\r
138 // <unnamed> volatile __io _A_TCCR1D
\r
142 ASEGN ABSOLUTE:DATA:NOROOT,044H
\r
143 // <unnamed> volatile __io _A_DT1
\r
147 ASEGN ABSOLUTE:DATA:NOROOT,037H
\r
148 // <unnamed> volatile __io _A_DDRB
\r
152 ASEGN ABSOLUTE:DATA:NOROOT,020H
\r
153 // <unnamed> volatile __io _A_TCCR1E
\r
157 // 31 #include "enums.h"
\r
159 // 33 #include "main.h"
\r
160 // 34 #include "PWM.h"
\r
161 // 35 #include "time.h"
\r
164 // 38 //******************************************************************************
\r
166 // 40 //******************************************************************************
\r
167 // 41 /*! \brief Stops PWM output
\r
171 RSEG CODE:CODE:NOROOT(1)
\r
172 // 44 void PWM_Stop(void)
\r
175 // 46 OCR1B = 0; // Reset compare level.
\r
178 // 47 PLLCSR = 0; // Disable PLL, switch to synchronous CLK mode.
\r
180 // 48 TCCR1A = 0; // Set normal port operation, disable PWM modes.
\r
182 // 49 TCCR1B = 0; // Stop timer/counter1.
\r
184 // 50 TCCR1C = 0; // Set normal port operation.
\r
186 // 51 TCCR1D = 0; // No fault protection, normal waveform.
\r
188 // 52 OCR1C = 0; // Reset compare.
\r
190 // 53 OCR1D = 0; // Reset compare.
\r
192 // 54 DT1 = 0; // No dead time values.
\r
207 // 58 /*! \brief Initializes and starts PWM output
\r
209 // 60 * Initializes timer1 for use as a PWM with a clock rate of 64 MHz.\n
\r
210 // 61 * Its comparator is connected to PB3 and will output high until timer1 reaches
\r
211 // 62 * the value of OCR1B. It is then dropped to 0.\n
\r
212 // 63 * The comparator outputs high again when the counter overflows, which will
\r
213 // 64 * happen at a rate of 250 kHz.
\r
216 RSEG CODE:CODE:NOROOT(1)
\r
217 // 66 void PWM_Start(void)
\r
220 // 68 // Clear OC1B on compare match, enable PWM on comparator OCR1B.
\r
221 // 69 TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<PWM1B);
\r
225 // 71 // Non-inverted PWM, T/C stopped.
\r
230 // 74 // Copy shadow bits, disconnect OC1D.
\r
231 // 75 TCCR1C = (TCCR1A & 0xF0);
\r
236 // 77 // No fault protection, use phase & frequency correct PWM.
\r
237 // 78 TCCR1D = (0<<WGM11)|(1<WGM10);
\r
241 // 80 // Does not matter -- PWM6 mode not used.
\r
245 // 83 // Does not matter -- OC1A is disabled.
\r
249 // 86 // Set reset compare level. (Offset is used, or JumperCheck() will fail.)
\r
250 // 87 OCR1B = PWM_OFFSET;
\r
254 // 89 // TOP value for PWM, f(PWM) = 64MHz / 255 = 251kHz.
\r
255 // 90 OCR1C = 0xFF;
\r
259 // 92 // Does not matter -- OC1D is disabled.
\r
264 // 95 // No dead time values.
\r
268 // 98 // Set PWM port pin to output.
\r
269 // 99 DDRB |= (1<<PB3);
\r
272 // 101 // Enable PLL, use full speed mode.
\r
273 // 102 PLLCSR = (0<<LSM) | (1<<PLLE);
\r
277 // 104 // Use general timer and wait 1 ms for PLL lock to settle.
\r
278 // 105 Time_Set(TIMER_GEN,0,0,1);
\r
285 // 107 }while(Time_Left(TIMER_GEN));
\r
292 // 109 // Now wait for PLL to lock.
\r
294 // 111 }while((PLLCSR & (1<<PLOCK)) == 0);
\r
300 // 113 // Use PLL as clock source.
\r
301 // 114 PLLCSR |= (1<<PCKE);
\r
306 // 116 // CLK PCK = 64MHz / 1 = 64MHz.
\r
307 // 117 TCCR1B |= (0<<CS13)|(0<<CS12)|(0<<CS11)|(1<<CS10);
\r
327 // 121 /*! \brief Increments the PWM duty cycle, if not already at max
\r
329 // 123 * \retval TRUE Success, duty cycle could be incremented.
\r
330 // 124 * \retval FALSE Failure, duty cycle already at maximum.
\r
333 RSEG CODE:CODE:NOROOT(1)
\r
334 // 126 unsigned char PWM_IncrementDutyCycle(void){
\r
335 PWM_IncrementDutyCycle:
\r
337 // 128 if (OCR1B < PWM_MAX) {
\r
340 BREQ ??PWM_IncrementDutyCycle_0
\r
345 // 130 return(TRUE);
\r
349 // 132 return(FALSE);
\r
350 ??PWM_IncrementDutyCycle_0:
\r
358 // 137 /*! \brief Decrements the PWM duty cycle, if not already at zero.
\r
360 // 139 * \retval TRUE Success, duty cycle could be decremented.
\r
361 // 140 * \retval FALSE Failure, duty cycle already at zero.
\r
364 RSEG CODE:CODE:NOROOT(1)
\r
365 // 142 unsigned char PWM_DecrementDutyCycle(void){
\r
366 PWM_DecrementDutyCycle:
\r
368 // 144 if (OCR1B > 0) {
\r
371 BREQ ??PWM_DecrementDutyCycle_0
\r
376 // 146 return(TRUE);
\r
380 // 148 return(FALSE);
\r
381 ??PWM_DecrementDutyCycle_0:
\r
388 ASEGN ABSOLUTE:DATA:NOROOT,01cH
\r
391 ASEGN ABSOLUTE:DATA:NOROOT,01dH
\r
394 ASEGN ABSOLUTE:DATA:NOROOT,01eH
\r
397 ASEGN ABSOLUTE:DATA:NOROOT,01fH
\r
402 // 12 bytes in segment ABSOLUTE
\r
403 // 142 bytes in segment CODE
\r
405 // 142 bytes of CODE memory
\r
406 // 0 bytes of DATA memory (+ 12 bytes shared)
\r