Project

General

Profile

Revision 266

Added by Brad Neuman over 16 years ago

PWM hack works in that it increases frequency. I2C breaks everything. Added robot debug code which will just print everything it gets from i2c... hopefully

View differences:

branches/autonomous_recharging/code/projects/autonomous_recharging/archs/Robot Debug/main.c
1
#include <dragonfly_lib.h>
2
#include <i2c.h>
3

  
4
void recv(char i2c_byte){
5
	usb_putc(i2c_byte);
6
	}
7

  
8
int main(){
9

  
10
	dragonfly_init(ALL_ON);
11
	i2c_init(1, NULL, recv, NULL);
12
	
13
	usb_puts("init'd everything.\n");
14
	
15
	while(1);
16
	}
branches/autonomous_recharging/code/projects/autonomous_recharging/archs/Robot Debug/Makefile
1
########Update This Section########
2
#
3
#
4

  
5
# Relative path to the root directory (containing lib directory)
6
ifndef COLONYROOT
7
#COLONYROOT = ../../../..
8
#COLONYROOT = ../../../../../../trunk
9
COLONYROOT = ../../../../..
10

  
11
endif
12

  
13
# Target file name (without extension).
14
TARGET = main
15

  
16
# Uncomment this to use the wireless library
17
 USE_WIRELESS = 1
18

  
19
# com1 = serial port. Use lpt1 to connect to parallel port.
20
AVRDUDE_PORT = /dev/ttyUSB1
21
#
22
#
23
###################################
24

  
25
# Hey Emacs, this is a -*- makefile -*-
26
#----------------------------------------------------------------------------
27
# WinAVR Makefile Template written by Eric B. Weddington, J?rg Wunsch, et al.
28
#
29
# Released to the Public Domain
30
#
31
# Additional material for this makefile was written by:
32
# Peter Fleury
33
# Tim Henigan
34
# Colin O'Flynn
35
# Reiner Patommel
36
# Markus Pfaff
37
# Sander Pool
38
# Frederik Rouleau
39
#
40
#----------------------------------------------------------------------------
41
# On command line:
42
#
43
# make all = Make software.
44
#
45
# make clean = Clean out built project files.
46
#
47
# make coff = Convert ELF to AVR COFF.
48
#
49
# make extcoff = Convert ELF to AVR Extended COFF.
50
#
51
# make program = Download the hex file to the device, using avrdude.
52
#                Please customize the avrdude settings below first!
53
#
54
# make debug = Start either simulavr or avarice as specified for debugging, 
55
#              with avr-gdb or avr-insight as the front end for debugging.
56
#
57
# make filename.s = Just compile filename.c into the assembler code only.
58
#
59
# make filename.i = Create a preprocessed source file for use in submitting
60
#                   bug reports to the GCC project.
61
#
62
# To rebuild project do "make clean" then "make all".
63
#----------------------------------------------------------------------------
64

  
65
#if you want your code to work on the Firefly++ and not Firefly+
66
#then add the -DFFPP line to CDEFS
67
CDEFS = 
68
#-DFFPP
69

  
70
# MCU name
71
MCU = atmega128
72

  
73
# Processor frequency.
74
#     This will define a symbol, F_CPU, in all source code files equal to the 
75
#     processor frequency. You can then use this symbol in your source code to 
76
#     calculate timings. Do NOT tack on a 'UL' at the end, this will be done
77
#     automatically to create a 32-bit value in your source code.
78
F_CPU = 8000000
79

  
80
# Output format. (can be srec, ihex, binary)
81
FORMAT = ihex
82

  
83
# List C source files here. (C dependencies are automatically generated.)
84
SRC = $(wildcard *.c)
85

  
86
# List Assembler source files here.
87
#     Make them always end in a capital .S.  Files ending in a lowercase .s
88
#     will not be considered source files but generated files (assembler
89
#     output from the compiler), and will be deleted upon "make clean"!
90
#     Even though the DOS/Win* filesystem matches both .s and .S the same,
91
#     it will preserve the spelling of the filenames, and gcc itself does
92
#     care about how the name is spelled on its command-line.
93
ASRC = 
94

  
95
# Optimization level, can be [0, 1, 2, 3, s]. 
96
#     0 = turn off optimization. s = optimize for size.
97
#     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
98
OPT = s
99

  
100
# Debugging format.
101
#     Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
102
#     AVR Studio 4.10 requires dwarf-2.
103
#     AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
104
DEBUG =
105

  
106
# Compiler flag to set the C Standard level.
107
#     c89   = "ANSI" C
108
#     gnu89 = c89 plus GCC extensions
109
#     c99   = ISO C99 standard (not yet fully implemented)
110
#     gnu99 = c99 plus GCC extensions
111
CSTANDARD = -std=gnu99
112

  
113
# Place -D or -U options here
114
CDEFS += -DF_CPU=$(F_CPU)UL 
115
CDEFS += -DFFP
116
# for wireless library
117
ifdef USE_WIRELESS
118
	CDEFS += -DROBOT
119
endif
120

  
121
# Place -I, -L options here
122
CINCS = -I$(COLONYROOT)/code/lib/include/libdragonfly 
123
CINCS += -L$(COLONYROOT)/code/lib/bin
124
ifdef USE_WIRELESS
125
	CINCS += -I$(COLONYROOT)/code/lib/include/libwireless
126
endif
127

  
128
#---------------- Compiler Options ----------------
129
#  -g*:          generate debugging information
130
#  -O*:          optimization level
131
#  -f...:        tuning, see GCC manual and avr-libc documentation
132
#  -Wall...:     warning level
133
#  -Wa,...:      tell GCC to pass this to the assembler.
134
#    -adhlns...: create assembler listing
135
CFLAGS =
136
# CFLAGS = -g$(DEBUG)
137
CFLAGS += $(CDEFS) $(CINCS)
138
CFLAGS += -O$(OPT)
139
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
140
CFLAGS += -Wall -Wstrict-prototypes
141
CFLAGS += -Wa,-adhlns=$(<:.c=.lst)
142
CFLAGS += $(CSTANDARD)
143

  
144
#---------------- Assembler Options ----------------
145
#  -Wa,...:   tell GCC to pass this to the assembler.
146
#  -ahlms:    create listing
147
#  -gstabs:   have the assembler create line number information; note that
148
#             for use in COFF files, additional information about filenames
149
#             and function names needs to be present in the assembler source
150
#             files -- see avr-libc docs [FIXME: not yet described there]
151
ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
152

  
153

  
154
#---------------- Library Options ----------------
155
# Minimalistic printf version
156
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
157

  
158
# Floating point printf version (requires MATH_LIB = -lm below)
159
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
160

  
161
# If this is left blank, then it will use the Standard printf version.
162
PRINTF_LIB = 
163
#PRINTF_LIB = $(PRINTF_LIB_MIN)
164
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
165

  
166

  
167
# Minimalistic scanf version
168
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
169

  
170
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
171
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
172

  
173
# If this is left blank, then it will use the Standard scanf version.
174
SCANF_LIB = 
175
#SCANF_LIB = $(SCANF_LIB_MIN)
176
#SCANF_LIB = $(SCANF_LIB_FLOAT)
177

  
178
MATH_LIB = -lm
179

  
180
#---------------- External Memory Options ----------------
181

  
182
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
183
# used for variables (.data/.bss) and heap (malloc()).
184
#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
185

  
186
# 64 KB of external RAM, starting after internal RAM (ATmega128!),
187
# only used for heap (malloc()).
188
#EXTMEMOPTS = -Wl,--defsym=__heap_start=0x801100,--defsym=__heap_end=0x80ffff
189

  
190
EXTMEMOPTS =
191

  
192
#---------------- Linker Options ----------------
193
#  -Wl,...:     tell GCC to pass this to linker.
194
#    -Map:      create map file
195
#    --cref:    add cross reference to  map file
196
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
197
LDFLAGS += $(EXTMEMOPTS)
198
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
199
ifdef USE_WIRELESS
200
	LDFLAGS += -lwireless
201
endif
202
LDFLAGS += -ldragonfly
203

  
204

  
205

  
206
#---------------- Programming Options (avrdude) ----------------
207

  
208
# Programming hardware: alf avr910 avrisp bascom bsd 
209
# dt006 pavr picoweb pony-stk200 sp12 stk200 stk500
210
#
211
# Type: avrdude -c ?
212
# to get a full listing.
213
#
214
AVRDUDE_PROGRAMMER = avrisp
215

  
216
# programmer connected to serial device
217

  
218
AVRDUDE_WRITE_FLASH = -b 57600 -U flash:w:$(TARGET).hex
219
#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
220

  
221

  
222
# Uncomment the following if you want avrdude's erase cycle counter.
223
# Note that this counter needs to be initialized first using -Yn,
224
# see avrdude manual.
225
#AVRDUDE_ERASE_COUNTER = -y
226

  
227
# Uncomment the following if you do /not/ wish a verification to be
228
# performed after programming the device.
229
#AVRDUDE_NO_VERIFY = -V
230

  
231
# Increase verbosity level.  Please use this when submitting bug
232
# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude> 
233
# to submit bug reports.
234
#AVRDUDE_VERBOSE = -v -v
235

  
236
AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
237
AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
238
AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
239
AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
240

  
241
#don't check for device signature
242
AVRDUDE_FLAGS += -F
243

  
244

  
245

  
246
#---------------- Debugging Options ----------------
247

  
248
# For simulavr only - target MCU frequency.
249
DEBUG_MFREQ = $(F_CPU)
250

  
251
# Set the DEBUG_UI to either gdb or insight.
252
# DEBUG_UI = gdb
253
DEBUG_UI = insight
254

  
255
# Set the debugging back-end to either avarice, simulavr.
256
DEBUG_BACKEND = avarice
257
#DEBUG_BACKEND = simulavr
258

  
259
# GDB Init Filename.
260
GDBINIT_FILE = __avr_gdbinit
261

  
262
# When using avarice settings for the JTAG
263
JTAG_DEV = /dev/com1
264

  
265
# Debugging port used to communicate between GDB / avarice / simulavr.
266
DEBUG_PORT = 4242
267

  
268
# Debugging host used to communicate between GDB / avarice / simulavr, normally
269
#     just set to localhost unless doing some sort of crazy debugging when 
270
#     avarice is running on a different computer.
271
DEBUG_HOST = localhost
272

  
273

  
274

  
275
#============================================================================
276

  
277

  
278
# Define programs and commands.
279
SHELL = sh
280
CC = avr-gcc
281
OBJCOPY = avr-objcopy
282
OBJDUMP = avr-objdump
283
SIZE = avr-size
284
NM = avr-nm
285
AVRDUDE = avrdude
286
REMOVE = rm -f
287
REMOVEDIR = rm -rf
288
COPY = cp
289
WINSHELL = cmd
290

  
291

  
292
# Define Messages
293
# English
294
MSG_ERRORS_NONE = Errors: none
295
MSG_BEGIN = -------- begin --------
296
MSG_END = --------  end  --------
297
MSG_SIZE_BEFORE = Size before: 
298
MSG_SIZE_AFTER = Size after:
299
MSG_COFF = Converting to AVR COFF:
300
MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
301
MSG_FLASH = Creating load file for Flash:
302
MSG_EEPROM = Creating load file for EEPROM:
303
MSG_EXTENDED_LISTING = Creating Extended Listing:
304
MSG_SYMBOL_TABLE = Creating Symbol Table:
305
MSG_LINKING = Linking:
306
MSG_COMPILING = Compiling:
307
MSG_ASSEMBLING = Assembling:
308
MSG_CLEANING = Cleaning project:
309

  
310

  
311

  
312

  
313
# Define all object files.
314
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 
315

  
316
# Define all listing files.
317
LST = $(SRC:.c=.lst) $(ASRC:.S=.lst) 
318

  
319

  
320
# Compiler flags to generate dependency files.
321
GENDEPFLAGS = -MD -MP -MF .dep/$(@F).d
322

  
323

  
324
# Combine all necessary flags and optional flags.
325
# Add target processor to flags.
326
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
327
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
328

  
329

  
330

  
331

  
332

  
333
# Default target.
334
all: begin gccversion sizebefore build sizeafter end
335

  
336
build: elf hex eep lss sym
337

  
338
elf: $(TARGET).elf
339
hex: $(TARGET).hex
340
eep: $(TARGET).eep
341
lss: $(TARGET).lss 
342
sym: $(TARGET).sym
343

  
344

  
345

  
346
# Eye candy.
347
# AVR Studio 3.x does not check make's exit code but relies on
348
# the following magic strings to be generated by the compile job.
349
begin:
350
	@echo
351
	@echo $(MSG_BEGIN)
352

  
353
end:
354
	@echo $(MSG_END)
355
	@echo
356

  
357

  
358
# Display size of file.
359
HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
360
ELFSIZE = $(SIZE) -A $(TARGET).elf
361
AVRMEM = avr-mem.sh $(TARGET).elf $(MCU)
362

  
363
sizebefore:
364
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
365
	$(AVRMEM) 2>/dev/null; echo; fi
366

  
367
sizeafter:
368
	@if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
369
	$(AVRMEM) 2>/dev/null; echo; fi
370

  
371

  
372

  
373
# Display compiler version information.
374
gccversion : 
375
	@$(CC) --version
376

  
377

  
378

  
379
# Program the device.  
380
program: $(TARGET).hex $(TARGET).eep
381
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
382

  
383

  
384
# Generate avr-gdb config/init file which does the following:
385
#     define the reset signal, load the target file, connect to target, and set 
386
#     a breakpoint at main().
387
gdb-config: 
388
	@$(REMOVE) $(GDBINIT_FILE)
389
	@echo define reset >> $(GDBINIT_FILE)
390
	@echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
391
	@echo end >> $(GDBINIT_FILE)
392
	@echo file $(TARGET).elf >> $(GDBINIT_FILE)
393
	@echo target remote $(DEBUG_HOST):$(DEBUG_PORT)  >> $(GDBINIT_FILE)
394
ifeq ($(DEBUG_BACKEND),simulavr)
395
	@echo load  >> $(GDBINIT_FILE)
396
endif	
397
	@echo break main >> $(GDBINIT_FILE)
398
	
399
debug: gdb-config $(TARGET).elf
400
ifeq ($(DEBUG_BACKEND), avarice)
401
	@echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
402
	@$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
403
	$(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
404
	@$(WINSHELL) /c pause
405
	
406
else
407
	@$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
408
	$(DEBUG_MFREQ) --port $(DEBUG_PORT)
409
endif
410
	@$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
411
	
412

  
413

  
414

  
415
# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
416
COFFCONVERT=$(OBJCOPY) --debugging \
417
--change-section-address .data-0x800000 \
418
--change-section-address .bss-0x800000 \
419
--change-section-address .noinit-0x800000 \
420
--change-section-address .eeprom-0x810000 
421

  
422

  
423
coff: $(TARGET).elf
424
	@echo
425
	@echo $(MSG_COFF) $(TARGET).cof
426
	$(COFFCONVERT) -O coff-avr $< $(TARGET).cof
427

  
428

  
429
extcoff: $(TARGET).elf
430
	@echo
431
	@echo $(MSG_EXTENDED_COFF) $(TARGET).cof
432
	$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
433

  
434

  
435

  
436
# Create final output files (.hex, .eep) from ELF output file.
437
%.hex: %.elf
438
	@echo
439
	@echo $(MSG_FLASH) $@
440
	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
441

  
442
%.eep: %.elf
443
	@echo
444
	@echo $(MSG_EEPROM) $@
445
	-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
446
	--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
447

  
448
# Create extended listing file from ELF output file.
449
%.lss: %.elf
450
	@echo
451
	@echo $(MSG_EXTENDED_LISTING) $@
452
	$(OBJDUMP) -h -S $< > $@
453

  
454
# Create a symbol table from ELF output file.
455
%.sym: %.elf
456
	@echo
457
	@echo $(MSG_SYMBOL_TABLE) $@
458
	$(NM) -n $< > $@
459

  
460

  
461

  
462
# Link: create ELF output file from object files.
463
.SECONDARY : $(TARGET).elf
464
.PRECIOUS : $(OBJ)
465
%.elf: $(OBJ)
466
	@echo
467
	@echo $(MSG_LINKING) $@
468
	$(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
469

  
470

  
471
# Compile: create object files from C source files.
472
%.o : %.c
473
	@echo
474
	@echo $(MSG_COMPILING) $<
475
	$(CC) -c $(ALL_CFLAGS) $< -o $@ 
476

  
477

  
478
# Compile: create assembler files from C source files.
479
%.s : %.c
480
	$(CC) -S $(ALL_CFLAGS) $< -o $@
481

  
482

  
483
# Assemble: create object files from assembler source files.
484
%.o : %.S
485
	@echo
486
	@echo $(MSG_ASSEMBLING) $<
487
	$(CC) -c $(ALL_ASFLAGS) $< -o $@
488

  
489
# Create preprocessed source for use in sending a bug report.
490
%.i : %.c
491
	$(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@ 
492

  
493

  
494
# Target: clean project.
495
clean: begin clean_list end
496

  
497
clean_list :
498
	@echo
499
	@echo $(MSG_CLEANING)
500
	$(REMOVE) $(TARGET).hex
501
	$(REMOVE) $(TARGET).eep
502
	$(REMOVE) $(TARGET).cof
503
	$(REMOVE) $(TARGET).elf
504
	$(REMOVE) $(TARGET).map
505
	$(REMOVE) $(TARGET).sym
506
	$(REMOVE) $(TARGET).lss
507
	$(REMOVE) $(OBJ)
508
	$(REMOVE) $(LST)
509
	$(REMOVE) $(SRC:.c=.s)
510
	$(REMOVE) $(SRC:.c=.d)
511
	$(REMOVEDIR) .dep
512

  
513

  
514

  
515
# Include the dependency files.
516
-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
517

  
518

  
519
# Listing of phony targets.
520
.PHONY : all begin finish end sizebefore sizeafter gccversion \
521
build elf hex eep lss sym coff extcoff \
522
clean clean_list program debug gdb-config
523

  
branches/autonomous_recharging/code/projects/autonomous_recharging/archs/ConstantCharging.c
22 22
#define SW0 PA6
23 23
#define HOMING_PIN PA7
24 24

  
25
#define DEBUG 0
25
//#define DEBUG 1
26 26

  
27 27
#define MAX_T 300
28 28
#define MIN_T 730
......
270 270
	TIMSK = (_BV(TOIE0)); //enable overflow interrupts
271 271
	
272 272
	TCCR1A = (_BV(COM1B1)|_BV(PWM1B)|_BV(COM1A1)|_BV(PWM1A)); //clear timer 1 on compare, set at 0x00. Fast PWM mode
273
	TCCR1B |= _BV(CS12)|_BV(CS10); //leave timer on and set compare to 0 to make output off	
273
	TCCR1B |= _BV(CS10); //leave timer on and set compare to 0 to make output off	
274 274
	
275 275
	//hack stuff so it will run in continuous mode
276 276
	TIMSK |= _BV(TOIE1); //enable overflow interrupt for timer 1
......
395 395
	int curr = 0;
396 396
	int meas_count = 0;
397 397
	int mod=0;
398
	sei();
399 398
	OCR1B = 0;
400 399
	
400
	PORTB &= ~(_BV(LED1)|_BV(LED2));
401

  
402
	
401 403
	while(status!=2)
402 404
	{
403 405
		mod=abs_time%4;
404 406
		
407
		PORTB ^= _BV(LED2);
408
		
405 409
		if(supply_voltage())
406 410
		  while(abs_time%4==mod);
407 411
		
408 412
    /* TIME TERMINATION */
409
		if(abs_time>500) //12000=25 minutes
413
		if(abs_time>12000) //12000=25 minutes
410 414
		{
411 415
			//SEND_DONE
412 416
			OCR1B=0;
......
426 430
      /* CONTACT */
427 431
			if(supply_voltage())
428 432
			{
433
				PORTB |= _BV(LED1);
429 434
				//curr = regulate_current(500);
430
				curr = get_avg_current();
435
				//+++curr = get_avg_current();
431 436
				
432 437
				if(status==0)
433 438
				{
......
445 450
      /* NO CONTACT */
446 451
			else
447 452
			{
453
				PORTB &= ~_BV(LED1);
448 454
				if(status==1)
449 455
				{
450 456
					status=0;
......
453 459
				}
454 460
				else
455 461
				{
456
          get_delay(); //reject the first reading
462
          /*get_delay(); //reject the first reading //homing import stuff, uncomment this!!!!!!
457 463
					data[0]=I2C_MSG_HOMING;
458 464
					data[1]=get_delay();
459
          i2c_putpacket(0x01, data, 2);
465
          i2c_putpacket(0x01, data, 2);*/
460 466
          
461 467
          data[0]='D';
462 468
				}
......
533 539
{
534 540
	new_second=0;
535 541
	char tempData[5];	//For i2c communication
536
	//test_board();
537 542
  
538 543
	setup();
539 544
	i2c_init();
......
710 715

  
711 716
ISR(TIMER1_OVF_vect)
712 717
{
713
	delay_ms(1); //wait a clock cycle so we know the ouput gets set (which happens at timer = 0)
718
	wait(5); //wait a bit so we know the ouput gets set (which happens at timer = 0)
714 719
	
715 720
	TCNT1 = 156; // start out at 156. Now OCR1B - 156 = duty cycle
716 721
}

Also available in: Unified diff