00001
00050 #include "ccpwrite.h"
00051
00052 #ifdef __cplusplus
00053 extern "C" {
00054 #endif
00055
00056
00065 void CCPWrite (volatile uint8_t *address, uint8_t value)
00066 {
00067 ENTER_CRITICAL_REGION( );
00068 #ifdef __ICCAVR__
00069
00070 asm("movw r30, r16");
00071 #ifdef RAMPZ
00072 RAMPZ = 0;
00073 #endif
00074 asm("ldi r16, 0xD8 \n"
00075 "out 0x34, r16 \n"
00076 #if (__MEMORY_MODEL__ == 1)
00077 "st Z, r17 \n");
00078 #elif (__MEMORY_MODEL__ == 2)
00079 "st Z, r18 \n");
00080 #else
00081 "st Z, r19 \n");
00082 #endif
00083
00084 #elif defined __GNUC__
00085 volatile uint8_t * tmpAddr = address;
00086 #ifdef RAMPZ
00087 RAMPZ = 0;
00088 #endif
00089 asm volatile(
00090 "movw r30, %0" "\n\t"
00091 "ldi r16, %2" "\n\t"
00092 "out %3, r16" "\n\t"
00093 "st Z, %1" "\n\t"
00094 :
00095 : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "i" (&CCP)
00096 : "r16", "r30", "r31"
00097 );
00098
00099 #endif
00100 LEAVE_CRITICAL_REGION( );
00101 }
00102
00103
00104 #ifdef __cplusplus
00105 }
00106 #endif