瀏覽代碼

Read_page_safe

jakob 5 年之前
父節點
當前提交
68bac99c8c

+ 7 - 7
Source/ASM_Source/global.inc

@@ -3,7 +3,7 @@
 .equ	main_r,			16
 .equ	usart_r,		17
 .equ	spi_r,			18
-.equ	timer1_r,		19
+.equ	timer2_r,		19
 
 
 .equ	frame,			21
@@ -22,11 +22,11 @@
 
 ;Konstanten-------------------------------------------------------------
 
-.equ	fuse_read,		0 							;Program-Mode		
-.equ	fuse_write,		1
+.equ	idle,			0 							;Program-Mode		
+.equ	prog_enable,	1
 .equ	page_read,		2
 .equ 	page_write,		3
-.equ	prog_read,		4
+.equ	prog_check,		4
 
 .equ	Baud,			0x0033						;USART-Baudr. 19.2k
 
@@ -46,6 +46,6 @@
 .equ	cmd_opt_hi,		0x0102	
 .equ	frame_cnt,		0x0103
 
-.equ	timer1_cnt,		0x0110
-.equ	timer1_bool,	0x0111
-.equ	timer1_MAX,		0x0112
+.equ	timer2_cnt,		0x0110
+.equ	timer2_bool,	0x0111
+.equ	timer2_MAX,		0x0112

+ 77 - 17
Source/ASM_Source/main.s

@@ -18,7 +18,7 @@ main:
 
 	call	usart_init;								;init USART
 
-	ldi		main_r, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)	
+	ldi		main_r, (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)	
 	out		DDRC, main_r							;init I/O
 	out 	PORTC, false
 
@@ -32,20 +32,38 @@ main:
 ;Mode Selection
 
 mode_select:
-	out		PORTC, false
-	sbi		PORTC, PC0								;Signal State
+	ldi		main_r, 1<<PC0 							;Signal State
+	out		PORTC, main_r						
 
 ;Receive Frame----------------------------------------------------------
+
+	ldi		timer2_r, (1<<CS22)|(1<<CS21)|(1<<CS20)	;set Prescaler
+	sts		TCCR2B, timer2_r						;x1024 (60Hz)
+	sts		timer2_bool, false						;reset Timer
+	ldi		timer2_r, 6 							;init Time 100ms
+	sts		timer2_MAX, timer2_r
+	ldi		timer2_r, 1<<TOIE2						;Timer2-OVF enable
+	sts		TIMSK2, timer2_r
+
 	ldi		X_l, lo8(cmd_ptr)						;set Command-Ptr
 	ldi		X_h, hi8(cmd_ptr)
 	lds		usart_r, UCSR0B							;activate Receiver
 	sbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
 	sts		UCSR0B, usart_r
 
+timeout_1:
+	lds		main_r, timer2_bool						;check for Timeout
+	cpse    main_r, true 
+	rjmp	.+8
+	ldi		X_l, lo8(cmd_ptr)						;reset Command-Ptr
+	ldi		X_h, hi8(cmd_ptr)		
+	sts		frame_cnt, false						;reset Frame cnt
+
 	lds		usart_r, frame_cnt
 	cpi		usart_r, 0x03							;check if Frame rec
-	brne	.-8
+	brne	timeout_1
 
+	sts		TIMSK2, false							;Timer2-OVF disable
 	lds		usart_r, UCSR0B							;disable Receiver
 	cbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
 	sts		UCSR0B, usart_r
@@ -56,15 +74,15 @@ mode_select:
 
 ;Select Mode------------------------------------------------------------
 
-	sbrc  	mode, fuse_read
-	rjmp	mode_select
-	sbrc  	mode, fuse_write
+	sbrc  	mode, idle
 	rjmp	mode_select
+	sbrc  	mode, prog_enable
+	call	mode_prog_enable
 	sbrc  	mode, page_read
 	call	mode_page_read
 	sbrc	mode, page_write
 	rjmp	mode_select
-	sbrc  	mode, prog_read
+	sbrc  	mode, prog_check
 	rjmp	mode_select
 
 ;Send Frame-------------------------------------------------------------
@@ -85,16 +103,12 @@ mode_select:
 	sts		UDR0, false								;clear UDR
 	sts		frame_cnt, false						;reset Frame cnt
 
-	sbi		PORTC, PC4								;Signal State
-
 	rjmp 	mode_select
 
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ;Cmd rebuild
 
 cmd_rebuild:
-	sbi		PORTC, PC1								;Signal State
-
 	lds 	main_r, cmd_mode						;set Mode
 	andi	main_r, nibble_lo
 	ldi		mode, 0x01
@@ -116,12 +130,42 @@ cmd_rebuild:
 
 	ret
 
+;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+;Enable Programming
+
+mode_prog_enable:
+	ldi		main_r, 1<<PC1							;Signal State		
+	out		PORTC, main_r							
+
+;Chip Erase------------------------------------------------------------
+
+
+;Programming enable Command--------------------------------------------
+
+	ldi		timer2_r, 1<<CS22						;set Prescaler
+	sts		TCCR2B, timer2_r						;x64 (1kHz)
+	sts		timer2_bool, false						;reset Timer
+	ldi		timer2_r, 250 							;init Time 250ms
+	sts		timer2_MAX, timer2_r
+	ldi		timer2_r, 1<<TOIE2						;Timer2-OVF enable
+	sts		TIMSK2, timer2_r
+
+	lds		main_r, timer2_bool						;wait for 250ms
+	cpse    main_r, true
+	rjmp	.-8
+
+	sts		TIMSK2, false							;Timer2-OVF disable
+
+	sts		cmd_mode, option 						;signal Prog enable
+
+	ret
+
 ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ;Read Page
 
 mode_page_read:
-
-	sbi		PORTC, PC2								;Signal State
+	ldi		main_r, 1<<PC2							;Signal State
+	out		PORTC, main_r
 
 ;Send Acknoledgement---------------------------------------------------
 
@@ -145,26 +189,42 @@ mode_page_read:
 
 ;Read Page-------------------------------------------------------------
 
+	ldi		timer2_r, (1<<CS22)|(1<<CS21)|(1<<CS20)	;set Prescaler
+	sts		TCCR2B, timer2_r						;x1024 (60Hz)
+	sts		timer2_bool, false						;reset Timer
+	ldi		timer2_r, 60 							;init Time 1s
+	sts		timer2_MAX, timer2_r
+	ldi		timer2_r, 1<<TOIE2						;Timer2-OVF enable
+	sts		TIMSK2, timer2_r
+
 	ldi		X_l, lo8(page_ptr)						;set Page-Ptr
 	ldi		X_h, hi8(page_ptr)
 	lds		usart_r, UCSR0B							;activate Receiver
 	sbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
 	sts		UCSR0B, usart_r
 
+timeout_2:
+	lds		main_r, timer2_bool						;check for Timeout
+	cpse    main_r, true
+	rjmp	.+12
+	lds		usart_r, UCSR0B							;disable Receiver
+	cbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
+	sts		UCSR0B, usart_r 
+	rjmp	mode_page_read
+
 	lds		usart_r, frame_cnt
 	mov		main_r, option
 	lsl		main_r
 	cp		usart_r, main_r							;check if Page rec
-	brne	.-12
+	brne	timeout_2
 
+	sts		TIMSK2, false							;Timer2-OVF disable
 	lds		usart_r, UCSR0B							;disable Receiver
 	cbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
 	sts		UCSR0B, usart_r
 	sts		UDR0, false								;clear UDR
 	sts		frame_cnt, false						;reset Frame cnt
 
-	sbi		PORTC, PC3								;Signal State
-
 ;Rebuild Page-----------------------------------------------------------
 
 	ldi		X_l, lo8(page_ptr)						;set Pointer

+ 3 - 3
Source/ASM_Source/makefile

@@ -1,7 +1,7 @@
 #Commands and Variables-------------------------------------------------
 as = avr-as -mmcu=avr5
 ld = avr-ld
-objs = main.o vectab.o usart.o timer1.o
+objs = main.o vectab.o usart.o timer2.o
 
 #Settings---------------------------------------------------------------
 .SILENT	:
@@ -26,8 +26,8 @@ vectab.o: vectab.s
 	$(as) vectab.s -o vectab.o
 usart.o : usart.s
 	$(as) usart.s -o usart.o
-timer1.o: timer1.s
-	$(as) timer1.s -o timer1.o
+timer2.o: timer2.s
+	$(as) timer2.s -o timer2.o
 
 #clear directory--------------------------------------------------------
 .PHONY	: clean

+ 43 - 36
Source/ASM_Source/prog.hex

@@ -1,40 +1,47 @@
 :100000000C9434000C9400000C9400000C9400003C
 :100010000C9400000C9400000C9400000C94000060
-:100020000C9400000C9400000C9400000C94000050
-:100030000C9400000C9426010C9400000C94000019
-:100040000C9400000C9400000C94EC000C94FB0049
-:100050000C940C010C9400000C9400000C94000013
+:100020000C9400000C945F010C9400000C940000F0
+:100030000C9400000C9400000C9400000C94000040
+:100040000C9400000C9400000C942B010C943A01C9
+:100050000C944B010C9400000C9400000C940000D4
 :100060000C9400000C9400000FEF0DBF08E00EBFD1
-:1000700099278FEF0E94D8000FE107B998B97894BB
-:1000800002C0FFCFF89498B9409AA0E0B1E0109177
-:10009000C10010691093C100109103011330E1F702
-:1000A0001091C1001F761093C1009093C6009093E9
-:1000B00003010E947C0060FDE6CF61FDE4CF62FD9C
-:1000C0000E94940063FDDFCF64FDDDCFA0E0B1E0CE
-:1000D0001091C10010621093C10010910301123001
-:1000E000E1F71091C10017791093C1009093C600F9
-:1000F00090930301449AC7CF419A009100010F7079
-:1001000061E0002319F0660F0A95FBCF7727009175
-:1001100001010F70702B009102010F700295702B7E
-:1001200011F40C9443000895429A70930001A0E0EA
-:10013000B1E01091C10010621093C1001091030151
-:100140001230E1F71091C10017791093C10090931C
-:10015000C60090930301A0E0B2E01091C1001069C5
-:100160001093C10010910301072F000F1017D1F752
-:100170001091C1001F761093C1009093C600909318
-:100180000301439AA0E0B2E0C0E0C395D2E0E0E012
-:10019000F2E00C911296188122960F701F70129542
-:1001A000012B01937A95A9F700E9009300010895C6
-:1001B0009093C6009093C0009093C1009093C200AA
-:1001C00010E01093C50013E31093C40016E01093E1
-:1001D000C2009093030108951F935091C600152FFC
-:1001E000107F103931F45D93109103011395109332
-:1001F00003011F9118951F935D915093C6001091B4
-:1002000003011395109303011091C1001F7D186421
-:100210001093C1001F9118951F931091C100177B77
-:1002200010621093C1001F911895909380009093D5
-:100230008100909382009093850090938400909326
-:100240006F00909310019093110108953F933091A6
-:100250001001339520911201321719F4332780933E
-:0A0260001101309310013F91189531
+:1000700099278FEF0E9417010FE307B998B9789479
+:1000800002C0FFCFF89401E008B937E03093B10027
+:100090009093110136E03093120131E030937000FB
+:1000A000A0E0B1E01091C10010691093C10000916F
+:1000B0001101081304C0A0E0B1E090930301109176
+:1000C00003011330A1F7909370001091C1001F76C7
+:1000D0001093C1009093C600909303010E94910079
+:1000E00060FDD1CF61FD0E94A80062FD0E94BE00AC
+:1000F00063FDC9CF64FDC7CFA0E0B1E01091C1009E
+:1001000010621093C100109103011230E1F71091B9
+:10011000C10017791093C1009093C600909303011A
+:10012000B2CF009100010F7061E0002319F0660F5B
+:100130000A95FBCF7727009101010F70702B00917A
+:1001400002010F700295702B11F40C944300089576
+:1001500002E008B934E03093B100909311013AEF16
+:100160003093120131E030937000009111010813B7
+:10017000FCCF9093700070930001089504E008B9DB
+:1001800070930001A0E0B1E01091C10010621093E3
+:10019000C100109103011230E1F71091C1001779ED
+:1001A0001093C1009093C6009093030137E0309301
+:1001B000B100909311013CE33093120131E0309390
+:1001C0007000A0E0B2E01091C10010691093C1006E
+:1001D00000911101081304C0A0E0B1E09093030165
+:1001E00010910301072F000F101791F790937000E3
+:1001F0001091C1001F761093C1009093C600909398
+:100200000301A0E0B2E0C0E0C395D2E0E0E0F2E09C
+:100210000C911296188122960F701F701295012B67
+:1002200001937A95A9F700E900930001089590934E
+:10023000C6009093C0009093C1009093C20010E05C
+:100240001093C50013E31093C40016E01093C2008E
+:100250009093030108951F935091C600152F107FAE
+:10026000103931F45D93109103011395109303013C
+:100270001F9118951F935D915093C6001091030133
+:100280001395109303011091C1001F7D1864109302
+:10029000C1001F9118951F931091C100177B106228
+:1002A0001093C1001F9118959093B0009093B100E6
+:1002B0009093B200909370009093100108953F9333
+:1002C0000F9330911001339520911201321719F4D8
+:1002D000809311013327309310010F913F911895AE
 :00000001FF

二進制
Source/ASM_Source/prog.o


+ 0 - 37
Source/ASM_Source/timer1.s

@@ -1,37 +0,0 @@
-;Incs and Defs----------------------------------------------------------
-
-.include "atm328p.inc"
-.include "global.inc"
-
-;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-;Timer-Reset
-
-.global timer1_reset
-timer1_reset:
-	sts		TCCR1A, false						;clear Registers
-	sts		TCCR1B, false
-	sts		TCCR1C, false
-	sts		TCNT1H, false
-	sts		TCNT1L, false
-	sts		TIMSK1, false
-	sts		timer1_cnt, false					;set Variables
-	sts		timer1_bool, false
-	ret
-
-
-;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-;Overflow-Interrupt
-
-.global timer1_OVF
-timer1_OVF:
-	push	timer1_r
-	lds		timer1_r, timer1_cnt				;Timer-Scaling
-	inc 	timer1_r
-	lds		spi_r, timer1_MAX							
-	cp		timer1_r, spi_r
-	brne	.+6
-	clr		timer1_r							;timed instructions
-	sts		timer1_bool, true
-	sts		timer1_cnt, timer1_r
-	pop		timer1_r
-	reti

+ 34 - 0
Source/ASM_Source/timer2.s

@@ -0,0 +1,34 @@
+;Incs and Defs----------------------------------------------------------
+
+.include "atm328p.inc"
+.include "global.inc"
+
+;Initialisierungen------------------------------------------------------
+
+.global timer2_init
+timer2_init:
+	sts		TCCR2A, false						;clear Registers
+	sts		TCCR2B, false
+	sts		TCNT2, false
+	sts		TIMSK2, false
+	sts		timer2_cnt, false					;init Variables			
+	ret
+
+
+;Interrupt-Handler------------------------------------------------------
+
+.global timer2_OVF
+timer2_OVF:
+	push	timer2_r
+	push	main_r
+	lds		timer2_r, timer2_cnt				;Timer-Scaling
+	inc 	timer2_r
+	lds		spi_r, timer2_MAX							
+	cp		timer2_r, spi_r
+	brne	.+6
+	sts		timer2_bool, true					;set Variable
+	clr 	timer2_r
+	sts		timer2_cnt, timer2_r
+	pop		main_r
+	pop		timer2_r
+	reti

+ 3 - 3
Source/ASM_Source/vectab.s

@@ -1,7 +1,7 @@
 ;Deklaration von Interrupt-Handlern-------------------------------------
 
 .global main
-.global timer1_OVF
+.global timer2_OVF
 .global usart_RXC
 .global	usart_UDRE
 .global usart_TXC
@@ -18,11 +18,11 @@ reset:	jmp		main			;Reset-Handler
 		jmp		reset			;WDog-Handler
 		jmp		reset			;TMR2_CMPA-Handler
 		jmp		reset			;TMR2_CMPB-Handler
-		jmp		reset 			;TMR2_OVF-Handler
+		jmp		timer2_OVF		;TMR2_OVF-Handler
 		jmp		reset			;TMR1_CAPT-Handler
         jmp     reset       	;TMR1_CMPA-Handler
         jmp     reset       	;TMR1_CMPB-Handler
-        jmp     timer1_OVF 	 	;TMR1_OVF-Handler
+        jmp     reset 	 	 	;TMR1_OVF-Handler
         jmp     reset       	;TMR0_CMPA-Handler
         jmp     reset       	;TMR0_CMPB-Handler
         jmp     reset			;TMR0_OVF-Handler

+ 48 - 0
Source/C_Source/code.hex

@@ -0,0 +1,48 @@
+:100000000C9434000C9400000C9400000C9400003C
+:100010000C9400000C9400000C9400000C94000060
+:100020000C9400000C945F010C9400000C940000F0
+:100030000C9400000C9400000C9400000C94000040
+:100040000C9400000C9400000C942B010C943A01C9
+:100050000C944B010C9400000C9400000C940000D4
+:100060000C9400000C9400000FEF0DBF08E00EBFD1
+:1000700099278FEF0E9417010FE307B998B9789479
+:1000800002C0FFCFF89401E008B937E03093B10027
+:100090009093110136E03093120131E030937000FB
+:1000A000A0E0B1E01091C10010691093C10000916F
+:1000B0001101081304C0A0E0B1E090930301109176
+:1000C00003011330A1F7909370001091C1001F76C7
+:1000D0001093C1009093C600909303010E94910079
+:1000E00060FDD1CF61FD0E94A80062FD0E94BE00AC
+:1000F00063FDC9CF64FDC7CFA0E0B1E01091C1009E
+:1001000010621093C100109103011230E1F71091B9
+:10011000C10017791093C1009093C600909303011A
+:10012000B2CF009100010F7061E0002319F0660F5B
+:100130000A95FBCF7727009101010F70702B00917A
+:1001400002010F700295702B11F40C944300089576
+:1001500002E008B934E03093B100909311013AEF16
+:100160003093120131E030937000009111010813B7
+:10017000FCCF9093700070930001089504E008B9DB
+:1001800070930001A0E0B1E01091C10010621093E3
+:10019000C100109103011230E1F71091C1001779ED
+:1001A0001093C1009093C6009093030137E0309301
+:1001B000B100909311013CE33093120131E0309390
+:1001C0007000A0E0B2E01091C10010691093C1006E
+:1001D00000911101081304C0A0E0B1E09093030165
+:1001E00010910301072F000F101791F790937000E3
+:1001F0001091C1001F761093C1009093C600909398
+:100200000301A0E0B2E0C0E0C395D2E0E0E0F2E09C
+:100210000C911296188122960F701F701295012B67
+:1002200001937A95A9F700E900930001089590934E
+:10023000C6009093C0009093C1009093C20010E05C
+:100240001093C50013E31093C40016E01093C2008E
+:100250009093030108951F935091C600152F107FAE
+:10026000103931F45D93109103011395109303013C
+:100270001F9118951F935D915093C6001091030133
+:100280001395109303011091C1001F7D1864109302
+:10029000C1001F9118951F931091C100177B106228
+:1002A0001093C1001F9118959093B0009093B100E6
+:1002B0009093B200909370009093100108953F9333
+:1002C0000F9330911001339520911201321719F4D8
+:1002D000809311013327309310010F913F911895AE
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+:00000001FF

+ 197 - 27
Source/C_Source/prog.c

@@ -1,8 +1,11 @@
 //Include Header-----------------------------------------------------
 #include"prog.h"
 
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
 //Main-Program
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
 
 int main(int argc, const char * argv[]){
 
@@ -43,15 +46,62 @@ int main(int argc, const char * argv[]){
 	cfsetspeed(termios_ptr, B19200);			//set Baudrate 19.2k
 	tcsetattr(USB, TCSANOW ,termios_ptr);
 
-//initializing Stream for Source-Code--------------------------------	
-	FILE * file_stream = fopen("test.hex", "r");
-	if(file_stream==NULL){
+//initializing Stream for Source-Code--------------------------------
+	if(argv[1]==NULL){
 		fprintf(stderr, "No File \n");
+		exit(EXIT_FAILURE);
+	}	
+	FILE * file_stream = fopen(argv[1], "r");
+	if(file_stream==NULL){
+		fprintf(stderr, "No Stream \n");
+		exit(EXIT_FAILURE);
 	}
 	int page_cnt = 0;
 	int skip;
 	int page_end = page_size;
 
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//Enable Programming Mode
+//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+	set_timer(0, 100000);							//setting Timer
+	pthread_err = pthread_create(&thread, NULL, 
+									&signal_thread, (void *)&signal);
+	if(pthread_err!=0){
+		error_handler(pthread_err, "Failed to create Thread");
+	}
+	unsigned char * cmd_ack_ptr = (unsigned char *)
+												malloc(sizeof(char));
+	char * frame_ptr = cmd_build(prog_enable, frame_mask);
+reset_1:
+	write(USB, frame_ptr, 3*sizeof(char));
+	while(true){
+		read(USB, cmd_ack_ptr, sizeof(char));
+		if(*cmd_ack_ptr==frame_mask){	
+			break;
+		}
+		if(!timer_state){
+			printf("\n");
+			printf("Connection Timeout \n");
+			printf("\n");
+			timer_state = true;
+			goto reset_1;
+		}
+	}
+	pthread_err = pthread_cancel(thread);
+	if(pthread_err!=0){
+		error_handler(pthread_err, "Failed to close Thread");
+	}
+	tcflush(USB, TCIOFLUSH);
+	printf("\n");
+	printf("Ready for Programming \n");
+	printf("\n");
+		for(int i=0; i<32; i++){
+			printf("-");
+		}
+		printf("\n");
+	free(cmd_ack_ptr);
+
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //Programming cycle
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -60,6 +110,7 @@ int main(int argc, const char * argv[]){
 	while(page_end==page_size){
 		skip=1;
 		page_end = page_get(file_stream, page_cnt);
+		printf("\n");
 		printf("Page %d: \n", page_cnt);
 		for(int i=0; i<page_end; i++, skip++){
 			printf("%02X", page_buf[i]);
@@ -73,55 +124,74 @@ int main(int argc, const char * argv[]){
 			printf("\n");
 		}
 		page_cnt++;
-		printf("Page %d Masked: \n", page_cnt-1);
 		unsigned char * page_ptr = page_mask(&page_buf[0], page_end);
-		skip=1;
-		for(int i=0; i<2*page_end; i++, skip++, page_ptr++){
-			printf("%02X", *page_ptr);
-			if(skip==16){
-				printf("\n");
-				skip=0;
-			}
-		}
-		printf("\n");
-		if(skip!=1){
-			printf("\n");
-		}
-		page_ptr = page_ptr-2*page_end;
-		printf("Page Ready \n");
 
 //Opening Connection to Programmer-----------------------------------
 		char * cmd_ack_ptr = (char *)malloc(sizeof(char));
-		char * frame_ptr = cmd_build(page_read, page_end);	
+		char * frame_ptr = cmd_build(page_read, page_end);
+		set_timer(0, 100000);						//setting Timer
+		pthread_err = pthread_create(&thread, NULL, 
+									&signal_thread, (void *)&signal);
+		if(pthread_err!=0){
+			error_handler(pthread_err, "Failed to create Thread");
+		}
+	reset_2:	
 		write(USB, frame_ptr, 3*sizeof(char));
 		while(true){
 			read(USB, cmd_ack_ptr, sizeof(char));
 			if(*cmd_ack_ptr==page_end){	
 				break;
 			}
+			if(!timer_state){
+				printf("\n");
+				printf("Connection Timeout \n");
+				printf("\n");
+				timer_state = true;
+				goto reset_2;
+			}
+		}
+		pthread_err = pthread_cancel(thread);
+		if(pthread_err!=0){
+			error_handler(pthread_err, "Failed to close Thread");
 		}
 		tcflush(USB, TCIOFLUSH);
-		printf("Acknowledged Page Send \n");
-		set_timer(0, 200);
+		printf("Ready to Send Page \n");
+		free(cmd_ack_ptr);
+
+//Sending Page-------------------------------------------------------
+		set_timer(1, 0);							//setting Timer
 		pthread_err = pthread_create(&thread, NULL, 
 									&signal_thread, (void *)&signal);
 		if(pthread_err!=0){
 			error_handler(pthread_err, "Failed to create Thread");
 		}
-		while(timer_state);
-
-//Sending Page-------------------------------------------------------									
+	reset_3:									
 		write(USB, page_ptr, 2*page_end*sizeof(char));
-		char * page_rec_ptr = (char *)malloc(sizeof(char));
+		unsigned char * page_rec_ptr = (unsigned char *)
+												malloc(sizeof(char));
 		while(true){
 			read(USB, page_rec_ptr, sizeof(char));
-			if(*page_rec_ptr==-112){					//Framemask
+			if(*page_rec_ptr==frame_mask){					//Framemask
 				break;
 			}
+			if(!timer_state){
+				printf("\n");
+				printf("Connection Timeout \n");
+				printf("\n");
+				timer_state = true;
+				goto reset_3;
+			}
+		}
+		pthread_err = pthread_cancel(thread);
+		if(pthread_err!=0){
+			error_handler(pthread_err, "Failed to close Thread");
 		}
+		tcflush(USB, TCIOFLUSH);
 		printf("Page Send Complete \n");	
+		free(page_rec_ptr);
 
 //Receiving Checksum-------------------------------------------------
+		printf("\n");
 		for(int i=0; i<32; i++){
 			printf("-");
 		}
@@ -136,6 +206,106 @@ int main(int argc, const char * argv[]){
 	return EXIT_SUCCESS;
 }
 
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
+//Sub-Programms
+/////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////
 
+//Signal Thread------------------------------------------------------
+void * signal_thread(void * arg_ptr){
+	sigset_t * signal_ptr = (sigset_t *)arg_ptr;
+	int signal_nr, signal_err;
+	while(true){
+		signal_err = sigwait(signal_ptr, &signal_nr);
+		if(signal_err!=0){
+			error_handler(signal_err, "Problem with Signal");
+		}
+		else if(signal_nr!=SIGALRM){
+			fprintf(stderr, "Wrong Signal \n");
+		}
+		timer_state = false;
+	}
+	return NULL;
+}
+
+//Set Timer----------------------------------------------------------
+void set_timer(int sec, int usec){
+	struct itimerval timer;
+	int timer_err, signal_err;
+	timer.it_interval.tv_sec = sec;
+	timer.it_interval.tv_usec = usec;
+	timer.it_value.tv_sec = sec;
+	timer.it_value.tv_usec = usec;
+	timer_err = setitimer(ITIMER_REAL, &timer, NULL);
+	if(timer_err!=0){
+		error_handler(timer_err, "Error setting Timer");
+	}
+	timer_state = true;
+}
 
+//Build Command------------------------------------------------------
+char * cmd_build(mode cmd_mode, char cmd_option){
+	cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t));
+	(*cmd_ptr).mode = frame_mask|cmd_mode;
+	(*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo);
+	(*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo);
+	char * frame_ptr = &((*cmd_ptr).mode);
+	return frame_ptr;
+}
+
+//Mask Page----------------------------------------------------------
+unsigned char * page_mask(char * page_build_ptr, int page_end){
+	unsigned char * page_mask_ptr = (unsigned char *)
+									malloc(2*page_end*sizeof(char));
+	for(int i=0; i<page_end; i++){
+		*page_mask_ptr = frame_mask|
+								((*page_build_ptr&nibble_hi)>>4);
+		*(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo);
+		page_mask_ptr = page_mask_ptr + 2;
+		page_build_ptr++;
+	}
+	return page_mask_ptr-2*page_end;
+}
 
+//Get Page----------------------------------------------------------
+int page_get(FILE * input_stream, int p_cnt){
+	int j = 0;									//init loc Variables
+	int c_cnt = 0;
+	if(p_cnt==0){								//check for Start
+		for(int k=0; k<9; k++){
+			page_buf[0] = fgetc(input_stream);
+		}
+	}
+	else{
+		c_cnt = 16;
+	}
+	while(j<page_size){							//get Char
+		page_buf[j] = fgetc(input_stream);
+		page_buf[j+1] = fgetc(input_stream);
+		if(page_buf[j]==0x25){
+			return j;
+		}	
+		if(c_cnt==16){							//check for Lineend
+			c_cnt = 0;
+			for(int k=0; k<11; k++){
+				page_buf[j] = fgetc(input_stream);
+			}
+		}
+		else{									//Convert to HEX
+			for(int m=0; m<2; m++){
+				if(page_buf[j+m]<0x3A&&page_buf[j+m]>0x2F){
+						page_buf[j+m] -= 0x30;
+				}
+				else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){
+						page_buf[j+m] -= 0x37;
+				}
+			}
+			page_buf[j] = ((page_buf[j]<<4)&nibble_hi)|
+										(page_buf[j+1]&nibble_lo);
+			c_cnt++;
+			j++;
+		}
+	}
+	return page_size;
+}

+ 3 - 114
Source/C_Source/prog.h

@@ -14,8 +14,8 @@
 
 //Enumerations-------------------------------------------------------
 typedef enum {false, true} bool; 
-typedef enum {fuse_read,
-		      fuse_write,
+typedef enum {idle,
+		      prog_enable,
 		      page_read,
 		  	  page_write,
 		  	  prog_check} mode;
@@ -47,119 +47,8 @@ char * page_build(char size);
 unsigned char * page_mask(char * page_build_ptr, int page_end);
 int page_get(FILE * input_stream, int page_pos);
 
-//Variables----------------------------------------------------------
+//Global Variables---------------------------------------------------
 char cmd_arr[3];
 bool timer_state;
 unsigned char page_buf[64];
 
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Signal Thread
-void * signal_thread(void * arg_ptr){
-	sigset_t * signal_ptr = (sigset_t *)arg_ptr;
-	int signal_nr, signal_err;
-	signal_err = sigwait(signal_ptr, &signal_nr);
-	if(signal_err!=0){
-		error_handler(signal_err, "Problem with Signal");
-	}
-	else if(signal_nr!=SIGALRM){
-		fprintf(stderr, "Wrong Signal \n");
-	}
-	timer_state = false;
-	return NULL;
-}
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Set Timer
-void set_timer(int sec, int usec){
-	struct itimerval timer;
-	int timer_err, signal_err;
-	timer.it_interval.tv_sec = sec;
-	timer.it_interval.tv_usec = usec;
-	timer.it_value.tv_sec = sec;
-	timer.it_value.tv_usec = usec;
-	timer_err = setitimer(ITIMER_REAL, &timer, NULL);
-	if(timer_err!=0){
-		error_handler(timer_err, "Error setting Timer");
-	}
-	timer_state = true;
-}
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Build Command
-char * cmd_build(mode cmd_mode, char cmd_option){
-	cmd_t * cmd_ptr = (cmd_t *)malloc(sizeof(cmd_t));
-	(*cmd_ptr).mode = frame_mask|cmd_mode;
-	(*cmd_ptr).opt_lo = frame_mask|(cmd_option&nibble_lo);
-	(*cmd_ptr).opt_hi = frame_mask|((cmd_option>>4)&nibble_lo);
-	char * frame_ptr = &((*cmd_ptr).mode);
-	return frame_ptr;
-}
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Build Page
-char * page_build(char size){
-	char page[size];
-	for(int i=0; i<size; i++){
-		page[i] = 0xFF;
-	}
-	char * page_ptr = &page[0];
-	return page_ptr;
-}
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Mask Page
-unsigned char * page_mask(char * page_build_ptr, int page_end){
-	unsigned char * page_mask_ptr = (unsigned char *)
-									malloc(2*page_end*sizeof(char));
-	for(int i=0; i<page_end; i++){
-		*page_mask_ptr = frame_mask|
-								((*page_build_ptr&nibble_hi)>>4);
-		*(page_mask_ptr+1) = frame_mask|(*page_build_ptr&nibble_lo);
-		page_mask_ptr = page_mask_ptr + 2;
-		page_build_ptr++;
-	}
-	return page_mask_ptr-2*page_end;
-}
-
-//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Get Page
-int page_get(FILE * input_stream, int p_cnt){
-	int j = 0;									//init loc Variables
-	int c_cnt = 0;
-	if(p_cnt==0){								//check for Start
-		for(int k=0; k<9; k++){
-			page_buf[0] = fgetc(input_stream);
-		}
-	}
-	else{
-		c_cnt = 16;
-	}
-	while(j<page_size){							//get Char
-		page_buf[j] = fgetc(input_stream);
-		page_buf[j+1] = fgetc(input_stream);
-		if(page_buf[j]==0x25){
-			return j;
-		}	
-		if(c_cnt==16){							//check for Lineend
-			c_cnt = 0;
-			for(int k=0; k<11; k++){
-				page_buf[j] = fgetc(input_stream);
-			}
-		}
-		else{									//Convert to HEX
-			for(int m=0; m<2; m++){
-				if(page_buf[j+m]<0x3A&&page_buf[j+m]>0x2F){
-						page_buf[j+m] -= 0x30;
-				}
-				else if(page_buf[j+m]<0x47&&page_buf[j+m]>0x40){
-						page_buf[j+m] -= 0x37;
-				}
-			}
-			page_buf[j] = ((page_buf[j]<<4)&nibble_hi)|
-										(page_buf[j+1]&nibble_lo);
-			c_cnt++;
-			j++;
-		}
-	}
-	return page_size;
-}

二進制
Source/C_Source/prog.o