2 Commits 2015a4352f ... 22883f9971

Autore SHA1 Messaggio Data
  jakob 22883f9971 Comm_Prob 5 anni fa
  jakob ded38d1c5c Comm_Prob 5 anni fa

+ 37 - 9
Source/ASM_Source/main.s

@@ -33,10 +33,7 @@ main:
 
 mode_select:
 
-	in 		main_r, PORTC							;toggle PC0
-	ldi		usart_r, 1<<PC0
-	eor		main_r, usart_r
-	out		PORTC, main_r
+	sbi		PORTC, PC0								;Signal State
 
 ;Receive Frame----------------------------------------------------------
 	ldi		X_l, lo8(cmd_ptr)						;set Command-Ptr
@@ -88,7 +85,7 @@ mode_select:
 	sts		UDR0, false								;clear UDR
 	sts		frame_cnt, false						;reset Frame cnt
 
-	sbi		PORTC, PC1								;read Page complete
+	sbi		PORTC, PC4								;Signal State
 
 	rjmp 	mode_select
 
@@ -96,6 +93,8 @@ 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
@@ -122,6 +121,8 @@ cmd_rebuild:
 
 mode_page_read:
 
+	sbi		PORTC, PC2								;Signal State
+
 ;Send Acknoledgement---------------------------------------------------
 
 	sts		cmd_mode, option 						;verify Mode
@@ -144,7 +145,7 @@ mode_page_read:
 	sts		UDR0, false								;clear UDR
 	sts		frame_cnt, false						;reset Frame cnt
 
-;Read Page--------------------------------------------------------------
+;Read Page-------------------------------------------------------------
 
 	ldi		X_l, lo8(page_ptr)						;set Page-Ptr
 	ldi		X_h, hi8(page_ptr)
@@ -153,8 +154,10 @@ mode_page_read:
 	sts		UCSR0B, usart_r
 
 	lds		usart_r, frame_cnt
-	cp		usart_r, option							;check if Page rec
-	brne	.-8
+	mov		main_r, option
+	lsl		main_r
+	cp		usart_r, main_r							;check if Page rec
+	brne	.-12
 
 	lds		usart_r, UCSR0B							;disable Receiver
 	cbr 	usart_r, (1<<RXEN0)|(1<<RXCIE0)
@@ -162,8 +165,33 @@ mode_page_read:
 	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
+	ldi		X_h, hi8(page_ptr)						;for Rebuild
+	ldi		Y_l, lo8(page_ptr)
+	inc 	Y_l
+	ldi		Y_h, hi8(page_ptr)
+	ldi		Z_l, lo8(page_ptr)
+	ldi		Z_h, hi8(page_ptr)
+
+page_rebuild:
+	ld 		main_r, X 								;Remove Mask and
+	adiw	X_l, 2									;reconstruct Bytes
+	ld 		usart_r, Y
+	adiw 	Y_l, 2
+	andi	main_r, nibble_lo
+	andi	usart_r, nibble_lo
+	swap	usart_r
+	or 		main_r, usart_r
+	st 		Z+, main_r	
+	dec		option
+	brne 	page_rebuild
+
 	ldi		main_r, frame_mask						;signal Page rec
-	sts		cmd_mode, main_r 						
+	sts		cmd_mode, main_r 						;by sending mask
 	sts 	cmd_opt_lo, main_r
 	sts 	cmd_opt_hi, main_r
 

+ 36 - 33
Source/ASM_Source/prog.hex

@@ -1,38 +1,41 @@
 :100000000C9434000C9400000C9400000C9400003C
 :100010000C9400000C9400000C9400000C94000060
 :100020000C9400000C9400000C9400000C94000050
-:100030000C9400000C9419010C9400000C94000026
-:100040000C9400000C9400000C94DF000C94EE0063
-:100050000C94FF000C9400000C9400000C94000021
+:100030000C9400000C942D010C9400000C94000012
+:100040000C9400000C9400000C94F3000C9402013A
+:100050000C9413010C9400000C9400000C9400000C
 :100060000C9400000C9400000FEF0DBF08E00EBFD1
-:1000700099278FEF0E94CB000FE107B998B97894C8
-:1000800002C0FFCFF89408B111E0012708B9A0E041
-:10009000B1E01091C10010691093C10010910301EB
-:1000A0001330E1F71091C1001F761093C1009093B7
-:1000B000C600909303010E947E0060FDE4CF61FDC5
-:1000C000E2CF62FD0E94950063FDDDCF64FDDBCFD2
-:1000D000A0E0B1E01091C10010621093C100109136
-:1000E00003011430E1F71091C10017791093C1009A
-:1000F0009093C60090930301419AC5CF00910001EF
-:100100000F7061E0002319F0660F0A95FBCF772787
-:10011000009101010F70702B009102010F70029588
-:10012000702B11F40C9443000895709300017093A8
-:10013000010170930201A0E0B1E01091C1001062D2
-:100140001093C100109103011430E1F71091C10028
-:1001500017791093C1009093C60090930301A0E01B
-:10016000B2E01091C10010691093C1001091030119
-:100170001717E1F71091C1001F761093C1009093FB
-:10018000C6009093030100E9009300010093010170
-:100190000093020108959093C6009093C00090933D
-:1001A000C1009093C20010E01093C50013E31093B8
-:1001B000C40016E01093C2009093030108951F93AA
-:1001C0005091C600152F107F103931F45D931091B6
-:1001D00003011395109303011F9118951F935D91CF
-:1001E0005093C600109103011395109303011091D1
-:1001F000C1001F7D18641093C1001F9118951F93B3
-:100200001091C100177B10621093C1001F911895C7
-:10021000909380009093810090938200909385004A
-:100220009093840090936F0090931001909311012C
-:1002300008953F93309110013395209112013217A8
-:1002400019F4332780931101309310013F911895D1
+:1000700099278FEF0E94DF000FE107B998B97894B4
+:1000800002C0FFCFF894409AA0E0B1E01091C10007
+:1000900010691093C100109103011330E1F7109122
+:1000A000C1001F761093C1009093C6009093030186
+:1000B0000E947B0060FDE7CF61FDE5CF62FD0E94FD
+:1000C000930063FDE0CF64FDDECFA0E0B1E01091CE
+:1000D000C10010621093C100109103011430E1F7C8
+:1000E0001091C10017791093C1009093C6009093AE
+:1000F0000301449AC8CF419A009100010F7061E05A
+:10010000002319F0660F0A95FBCF772700910101B4
+:100110000F70702B009102010F700295702B11F47B
+:100120000C9443000895429A70930001709301016A
+:1001300070930201A0E0B1E01091C1001062109331
+:10014000C100109103011430E1F71091C10017793B
+:100150001093C1009093C60090930301A0E0B2E019
+:100160001091C10010691093C10010910301072F75
+:10017000000F1017D1F71091C1001F761093C10026
+:100180009093C60090930301439AA0E0B2E0C0E0D0
+:10019000C395D2E0E0E0F2E00C911296188122962D
+:1001A0000F701F701295012B01937A95A9F700E942
+:1001B00000930001009301010093020108959093C0
+:1001C000C6009093C0009093C1009093C20010E0CD
+:1001D0001093C50013E31093C40016E01093C200FF
+:1001E0009093030108951F935091C600152F107F1F
+:1001F000103931F45D9310910301139510930301AD
+:100200001F9118951F935D915093C60010910301A3
+:100210001395109303011091C1001F7D1864109372
+:10022000C1001F9118951F931091C100177B106298
+:100230001093C1001F9118959093800090938100B6
+:1002400090938200909385009093840090936F0028
+:10025000909310019093110108953F9330911001F4
+:10026000339520911201321719F43327809311012D
+:08027000309310013F91189535
 :00000001FF

BIN
Source/ASM_Source/prog.o


BIN
Source/C_Source/a.out


+ 49 - 17
Source/C_Source/prog.c

@@ -6,13 +6,39 @@
 
 int main(int argc, const char * argv[]){
 
-	delay(100);		//delete me!!
+//Setting up Timer-Signal--------------------------------------------
+	sigset_t signal;
+	pthread_t thread;
+	int signal_err, pthread_err;
+	signal_err = sigemptyset(&signal);
+	if(signal_err!=0){
+		error_handler(signal_err, "Not a valid Signal");
+	}
+	signal_err = sigaddset(&signal, SIGALRM);
+	if(signal_err!=0){
+		error_handler(signal_err, "Not a valid Signal");
+	}
+	pthread_err = pthread_sigmask(SIG_BLOCK, &signal, NULL);
+	if(pthread_err!=0){
+		error_handler(pthread_err, "Error changing Signal-Mask");
+	}	
+
+//Loading Page-------------------------------------------------------
+	FILE * file_stream = fopen("test.hex", "r");
+	if(file_stream==NULL){
+		fprintf(stderr, "No File \n");
+	}
+	char * page_get_ptr = page_get(file_stream);
+	for(int i=0; i<page_size; i++){
+		printf("%02X \n", *page_get_ptr);
+		page_get_ptr++;
+	}
 
 //initializing USART at USB_PORT-------------------------------------
 	int USB = open("/dev/ttyACM3", O_RDWR|O_NOCTTY|O_NONBLOCK);
-	if(isatty(USB)==0){
-		printf("ERROR: No File Descriptor! \n");
-		return 0;
+	int USB_err = isatty(USB);
+	if(USB_err!=1){
+		error_handler(USB_err, "No File Descriptor");
 	}
 	struct termios * termios_ptr = (struct termios *)
 									malloc(sizeof(struct termios));
@@ -21,34 +47,40 @@ int main(int argc, const char * argv[]){
 	(*termios_ptr).c_cflag = CS8|CREAD;			//set Size, enable RX 
 	(*termios_ptr).c_lflag = 0;
 	(*termios_ptr).c_cc[VMIN] = 0;				//set min Characters
-//	(*termios_ptr).c_cc[VTIME] = 0.01;			//Timeout after 1ms
 	cfsetspeed(termios_ptr, B19200);			//set Baudrate 19.2k
 	tcsetattr(USB, TCSANOW ,termios_ptr);
 
 //Get Command--------------------------------------------------------
 	char cmd_check = 0;
 	char * frame_ptr;
-	char * data_ptr = (char *)malloc(3*sizeof(char));
-	frame_ptr = cmd_build(page_read, page_size);	
+	char * cmd_ack_ptr = (char *)malloc(3*sizeof(char));
+	frame_ptr = cmd_build(page_read, (char)page_size);	
 	write(USB, frame_ptr, 3*sizeof(char));
 	while(cmd_check<3){
-		read(USB, data_ptr, sizeof(char));
+		read(USB, cmd_ack_ptr, sizeof(char));
 		tcflush(USB, TCIFLUSH);
-//		printf("%d \n", *data_ptr);
-		if(*data_ptr==page_size){
+		if(*cmd_ack_ptr==page_size){
 			cmd_check++;
 		}
 	}
-	printf("Read Acknoledgement \n");
+	tcflush(USB, TCIOFLUSH);
+	set_timer(0, 1000);
+	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);
+	printf("Page Read acknoledged \n");
+	char * cmd_done_ptr = (char *)malloc(sizeof(char));
 	cmd_check = 0;
-	char * page_ptr = page_build(page_size+2); 
-	write(USB, page_ptr, (page_size+2)*sizeof(char));
+	char * page_ptr = page_mask(page_build(page_size)); 
+	write(USB, page_ptr, 2*page_size*sizeof(char));
 	while(cmd_check<3){
-		read(USB, data_ptr, sizeof(char));
+		read(USB, cmd_done_ptr, sizeof(char));
 		tcflush(USB, TCIFLUSH);
-		printf("%d \n", *data_ptr);
-		if(*data_ptr==frame_mask){
-			cmd_check++;
+		if(*cmd_done_ptr==frame_mask){
+			break;
 		}
 	}
 	printf("Page Read Complete \n");

+ 98 - 12
Source/C_Source/prog.h

@@ -1,13 +1,16 @@
 //Inculde Header Files-----------------------------------------------
 #include<stdlib.h>
 #include<stdio.h>
-#include<time.h>
+#include<errno.h>
+#include<sys/time.h>
 #include<unistd.h>
 #include<termios.h>
 #include<sys/types.h>
 #include<sys/stat.h>
 #include<fcntl.h>
 #include<sys/resource.h>
+#include<pthread.h>
+#include<signal.h>
 
 //Enumerations-------------------------------------------------------
 typedef enum {false, true} bool; 
@@ -21,6 +24,7 @@ typedef enum {fuse_read,
 #define nibble_lo 0x0F
 #define nibble_hi 0xF0
 #define frame_mask 0x90
+#define page_size 64
 
 //Structs------------------------------------------------------------
 typedef struct {
@@ -29,14 +33,56 @@ typedef struct {
 	char opt_hi;
 } cmd_t;
 
+//Makros-------------------------------------------------------------
+#define error_handler(err_no, err_str) 	\
+					errno = err_no;		\
+					perror(err_str);	\
+					exit(EXIT_FAILURE);
+
 //Protoypes----------------------------------------------------------
+void * signal_thread(void * arg_ptr);
+void set_timer(int sec, int usec);
 char * cmd_build(mode cmd_mode, char cmd_option);
 char * page_build(char size);
-void delay(int delay_time);
+char * page_mask(char * page_build_ptr);
+char * page_get(FILE * input_stream);
 
 //Variables----------------------------------------------------------
 char cmd_arr[3];
-char page_size = 0x40;
+bool timer_state;
+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
@@ -49,22 +95,62 @@ char * cmd_build(mode cmd_mode, char cmd_option){
 	return frame_ptr;
 }
 
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-//Delay in ms
-void delay(int delay_time){
-	clock_t time1 = clock();
-	while(((clock()-time1)/CLOCKS_PER_SEC)*1000
-			 							< (clock_t)delay_time);
-}
-
 //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 //Build Page
 char * page_build(char size){
 	char page[size];
 	for(int i=0; i<size; i++){
-		page[i] = 0x9F;
+		page[i] = 0xFF;
 	}
 	char * page_ptr = &page[0];
 	return page_ptr;
 }
 
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//Mask Page
+char * page_mask(char * page_build_ptr){
+	char page[2*page_size];
+	char * page_mask_ptr = &page[0];
+	for(int i=0; i<page_size; i++){
+		*page_mask_ptr = frame_mask|(*page_build_ptr&nibble_lo);
+		*(page_mask_ptr+1) = frame_mask|
+									((*page_build_ptr&nibble_hi)>>4);
+		page_mask_ptr = page_mask_ptr + 2;
+	}
+	page_mask_ptr = &page[0];
+	return page_mask_ptr;
+}
+
+//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+//Get Page
+char * page_get(FILE * input_stream){
+	int count = 7;
+	char * page_buf_ptr = (char*)malloc(page_size*sizeof(char));
+	for(int i=0; i<page_size; ){
+		*page_buf_ptr = fgetc(input_stream);
+		*(page_buf_ptr+1) = fgetc(input_stream);
+		if(count>6){
+			if(*page_buf_ptr==0x3A){
+				count=0;
+			}
+			else{
+				for(int j=0; j<2; j++){
+					if(*(page_buf_ptr+j)<0x39){
+						*(page_buf_ptr+j)=*(page_buf_ptr+j)-0x30;
+					}
+					else{
+						*(page_buf_ptr+j)=*(page_buf_ptr+j)-0x37;
+					}
+				}
+				*page_buf_ptr = ((*page_buf_ptr<<4)&nibble_hi)|
+									((*page_buf_ptr+1)&nibble_lo);
+				i++;
+				page_buf_ptr++;
+			}
+		}
+		else{
+			count++;
+		}
+	}
+	return page_buf_ptr-page_size;
+}

BIN
Source/C_Source/prog.o


+ 15 - 0
Source/C_Source/test.hex

@@ -0,0 +1,15 @@
+:100000000C9434000C9400000C9400000C9400003C
+:100010000C9400000C9400000C9400000C94000060
+:100020000C9400000C9400000C9400000C94000050
+:100030000C9400000C945C000C9400000C940000E4
+:100040000C9400000C9400000C9400000C94000030
+:100050000C9400000C9400000C9400000C94000020
+:100060000C9400000C9400000FEF0DBF08E00EBFD1
+:1000700010E02FEF27B90E943F007894FFCF0F9335
+:100080001093800002E0009381001093820001E051
+:1000900000936F001093000101E0009301010F91A4
+:1000A00008950F930091010108B9000F06FD01E0CA
+:1000B000009301010F9108950F93009100010395A2
+:1000C000033019F40E9451000027009300010F91A2
+:0200D000189581
+:00000001FF