Exemplo n.º 1
0
/* 
 * if buffer empty then Underflow-LED on, else read buffer
 */
void TIM8_UP_TIM13_IRQHandler(void)
{
	TIM8->SR = ~(1 << 0);
	
	interruptCounter++;			
	
	if((isrbuf->isEmpty)){
		setLED(UNDERFLOWLED);
	}
	else {
		resetLED(UNDERFLOWLED);
		
		//read Buffer
		DAC->DHR12R1 = isrbuf->data[indexISR];
	
		indexISR += 1;
		
		// read Buffer complet. reset index back to 0 and switch Buffer
		if(indexISR >= BUFFER_SIZE){ 
			indexISR = 0;
			
			//switch Buffer
			isrbuf->isEmpty = 1;
			if(isrbuf == &buf1){ isrbuf = &buf2;}
			else{isrbuf = &buf1;}
		}
	}	
}
Exemplo n.º 2
0
void TIM8_UP_TIM13_IRQHandler(void) {

    TIM8->SR = ~(1 << 0);	//Interrupt zurücknehmen
    interrupt_Counter++;    //zaehle Interrupts


    if(irsInBuffer->isEmpty) {
        setLED(UNDERFLOW_LED);  //warte bis buffer gelesen werden kann
    } else {
        resetLED(UNDERFLOW_LED);

        //DAC werte skallieren N = a + b*N-stuetz
        DAC->DHR12R1 = ((a + amplitude * irsInBuffer->data[idx_ISR]) >> FIXPOINT_ARITH);    //den aktuellen index an dem Data-Holding-Register
        DAC->DHR12R2 = ((a + amplitude * irsInBuffer->data[idx_ISR+1]) >> FIXPOINT_ARITH);	//den naechsten index an dem Data-Holding-Register

        //skalierter PWM wert
        pwmVal = (irsInBuffer->data[idx_ISR] + OFFSET)/SCALE_PWM;	 //-> (buf->data + 32768)/17.0
        //The active capture/compare register contains the value to be compared to the counter
        TIM8->CCR2 = pwmVal;

        pwmVal = (irsInBuffer->data[idx_ISR+1] + OFFSET)/SCALE_PWM;
        TIM8->CCR3 = pwmVal;

        idx_ISR += 2;

        if(idx_ISR >= BUF_SIZE) {
            idx_ISR = 0;
            irsInBuffer->isEmpty = 1;

            if(irsInBuffer == &buf1) {
                irsInBuffer = &buf2;
            } else {
                irsInBuffer = &buf1;
            }
        }
    }
}
Exemplo n.º 3
0
int main(void)
{
	char interruptFlag=0 , answerReceivedFlag = 0 ;
	char i ;
	uint16_t ret , rssivalue;
	
	int dataLength ;
	unsigned char baseStationNumber;
	uint8_t temp =0;
	//_delay_ms(5000);
	micro_Initialize();
	resetGlobalIntrrupt();
	ResetSearchArray();
	//while(1)
	//{
		//DDRB = 0xFF;
		//PORTB =0xFF;
	//}
	
	transceiver.setMode(TRANSCEIVER_MODE_RECEIVER);
	for (i=0;i<3 ;i++)
	{
		setLED(i);
		_delay_ms(50);
		resetLED(i);
		_delay_ms(50);
	}
	
	_delay_ms(100);
	if( (PIND & 0x04) >> 2)
	setLED(0);

	_delay_ms(100);
	setLED(0);
	setGlobalIntrrupt();
	
	baseStationNumber =0;
	//eeprom_write_byte(&test_index2 , test_index2);
	//
	//temp = eeprom_is_ready();
	////eeprom_write_byte(0x5,(uint8_t)0xA4);
	////eeprom_write_byte(&test_index2 , 0x9E);
	////test_index2	= 0x4D;
	//temp = eeprom_read_byte(&test_index2);
	////temp = eeprom_read_byte(&test_index2);
	//while(1)
	//{
	////serial.putChar(0x5A);
	//if (serialRxDataBuffer.getFifoFullLength() > 0)
	//{
	//ret = serialRxDataBuffer.readByte() ;
	//if (temp == ret)
	//{
	//;
	//}
	//else
	//eeprom_update_byte(&test_index2 , ret);
	//}
	//
	////temp = 0;
	////if ( temp == test_index2)
	////;
	////else
	//////test_index2 = temp;
	//serial.putChar(temp);
	////serial.putChar(test_index2);
	//}
	 minimumSearchBaseStationIndex =-1; 
	 maximumSearchBaseStationIndex =-1;
	 automaticSearchModeFlag = 0;	 
	while (1)
	{

		processSerialReceivedBytes();
		
		if ((serialTxDataBuffer.getFifoFullLength() > 0 ) )
			if (serial.isSerialTxEmpty())
				serial.putChar(serialTxDataBuffer.readByte());
				
		if(commandRecievedFlag)
			ToggleLED(0);
		if (transceiver.isReceiver())
		{
			
			if (transceiver.isPreambleDetected())
			{
				rssivalue = transceiver.adfReadback(RSSI_READBACK);
				//rssivalue = 0x34E5;
			}
			
			if (transceiver.getFifoFullLength() > PACKET_LENGTH - 1  )
			{
				
				transceiver.readReceivedPacket(receivedPacket);
				resetLED(2);
				
				if (packetProcessor.extractData(receivedPacket , dataLength))
				{			
					ToggleLED(1);
					StationInfoStructure* structPtr = (StationInfoStructure*) receivedPacket;
					structPtr->rssiCenterStation = rssivalue ;
					receivedDataProcess(receivedPacket , dataLength);
					answerReceivedFlag = 1;
				}
				
			}
			else if ((timeoutCounter > 2500) || answerReceivedFlag )   //timeout counter must be bigger than 1889 for baudrate 9600;
			{
				if(!commandRecievedFlag)
				{
					if (automaticSearchModeFlag)
					{
						if ( !answerReceivedFlag)
						{
							;//serialTxDataBuffer.writeString("$CMD" , sizeof("$CMD"));
							//serialTxDataBuffer.writeByte(0);
						}
						
						sendAlliveSerialData();

						if (searchdelaycounterL <= 0 && searchdelaycounterH <= 0)
						{
							ToggleLED(1);
							int nextindex = -1;
							for (int i = searchindex+1; i <= searchpointer; i++)
							{
								//serial.getChar(searchingarray[i]);
								if (searchingarray[i] != -1)
								{
									nextindex = i;
									break;
								}
							}
							if (nextindex != -1)
							{
								searchindex = nextindex;
								//serial.putChar('X');
								//serial.putChar(searchindex);
								//serial.putChar(searchingarray[searchindex]);
								madeGetStatusCommandBaseOnMACAddress(searchingarray[searchindex]);
							}
							else
							{
								searchindex = -1;
								searchdelaycounterH = searchdelaymaxH;
								searchdelaycounterL = searchdelaymaxL;
							}
														
							commandRecievedFlag = 1;
						}
						else
						{
							//if (searchdelaycounter > -1)
								//searchdelaycounter--;
							//else
								//searchdelaycounter = searchdelaymax;
							//if (searchdelaycounterH == 0)
							ToggleLED(2);
						}
						
					}
					 
				}
				else
				{
					if ( !answerReceivedFlag)
					{
						;//serialTxDataBuffer.writeString("$CMD" , sizeof("$CMD"));
						//serialTxDataBuffer.writeByte(0);
					}
					
				}

				answerReceivedFlag = 0;
				timeoutCounter =0;
				
				if (commandRecievedFlag)
				{
					interruptFlag = resetAndStoreIntrruptFlag();
					transceiver.changeMode();
					
					packetProcessor.createPacket(commandArray , commandArray[MAXIMUM_NUMBER_OF_DATA] , commandPacket);
					transceiver.writePacket(commandPacket);
					commandRecievedFlag	= 0;
					restoreIntrrupt(interruptFlag);
				}
				else
					sendAlliveSerialData();
			}
			else
			{
				;//_delay_us(10);
				
				
			}
		}
		else
		{
			setLED(2);
			if (transceiver.getFifoFullLength() == 0 )
				transceiver.changeMode();	
				//{
					//packetProcessor.createPacket((char *)commandRecievedFlag , 1 , commandPacket);
					//transceiver.writePacket(commandPacket);	
				//}//

		}
		
	}
}
Exemplo n.º 4
0
int main(void) {
	RCC_ClocksTypeDef RCC_Clocks;
	
	/* default value with 440 Hz delta fi and Amplitude 1.0V*/
	d_phi = D_PHI_440HZ;
	b = AMPLITUDE_B_HIGH;
	
    initCEP_Board();
	initTimer_Dac();	
		
	msecs = 0;
	
	
	RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
	
	TFT_cursor_off();
	
	//Mark buffer as empty
	buf1.isEmpty = 1;
	buf2.isEmpty = 1;
	
	bgbuf  = &buf1;
	isrbuf = &buf1;
   
	TFT_cls();
	TFT_puts("CEP4");
	TFT_gotoxy(1, 2);
	TFT_puts("Besnik & Burim Mulici");
	TFT_gotoxy(1,5);
	TFT_puts("msecs: ");
	TFT_gotoxy(1,6);
	TFT_puts("Interrupts: ");	
	TFT_gotoxy(1,7);
	TFT_puts("delta_P: ");
	TFT_gotoxy(1,8);
	TFT_puts("Frequenz:  440");
	TFT_gotoxy(1,9);
	TFT_puts("Form:    Sinus");	

	
    while (1) {
		
		read_buttons();
	
		//slow down display output
		if(msecCountVar <= msecCounter) {						 
			msecCountVar++;
		} else {
			msecCountVar = 0;
		}
		
		//Display output
		if((output ==1) && (msecCountVar == msecCounter)){		
			ITM->PORT[11].u32 = 0;
			
			TFT_gotoxy(1,5);
			TFT_puts("msecs: ");
			sprintf(msecbuf, "%d" , msecs);
			TFT_puts(msecbuf);	
			
			TFT_gotoxy(1,6);
			TFT_puts("Interrupts: ");
			sprintf(interruptbuf, "%d", interruptCounter);
			TFT_puts(interruptbuf);
			
			TFT_gotoxy(1,7);
			TFT_puts("delta_P: ");
			sprintf(d_phi_buf, "%d", d_phi);
			TFT_puts(d_phi_buf);
			
			ITM->PORT[11].u32 = 1;
		}
		
		//Buffer empty? If yes fill it and Wait-LED off, else Wait-LED on
		if(bgbuf->isEmpty){										
			
			resetLED(WAITING);
			ITM->PORT[12].u32 = 0;
			fill_Buf(bgbuf);
			ITM->PORT[12].u32 = 1;
						
			if(bgbuf == &buf1) { bgbuf = &buf2;} 
			else{ bgbuf = &buf1;}
			
		} else {
			setLED(WAITING);
		}			       
    }
}
Exemplo n.º 5
0
void labor6(void) {
    run = 1;
    syncword_address =0;
    spi_address = 0;
    pwmVal = 0;
    HMP3Decoder mp3dec;
    bytesLeft = 0;
    bytesTilSyncWord = 0;
    decodeRetVal = 0;
    errorCounter = 0;
    idx_ISR = 0;
    mainBuf_empty = 1;
    interrupt_Counter = 0;
    mseczaehlvar = 0;

    RCC_ClocksTypeDef RCC_Clocks;
    msec = 0;
    int i = 0;

    //Amplitude 1.0V (b_big)
    amplitude = b_big;

    spi_setup();
    setup_TIM8_DAC_PWM();
    mp3dec = MP3InitDecoder();

    //SysTick end of count event each 10ms
    RCC_GetClocksFreq(&RCC_Clocks);
    SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);

    TFT_cursor_off();

    buf1.isEmpty = 1;
    buf2.isEmpty = 1;

    mp3OutBuffer = &buf1;		//start with buf1
    irsInBuffer = &buf1;

    TFT_cls();
    TFT_gotoxy(1,1);
    TFT_puts("Frequenz:   5000");

    while(B1 != 0 && B2 != 0) {}

    do {
        //Check Buttons
        read_buttons();
        //ausgabe
        print_display();

        //wenn der mainBuf leer ist, muss der durch readSPI mit mp3-daten gefuellt werden
        if (mainBuf_empty) {

            do {

                //Shift bytes to the beginning
                /**
                * Bsp:  mainBufSize = 10
                * 			readBytes = 7 --> bytesLeft = 3
                * 			for(){
                * 				mainBuffer[0] = mainBuffer[(10-3)+0]	idx[0] = idx[7]
                * 				mainBuffer[1] = mainBuffer[(10-3)+1]	idx[1] = ide[8] ...
                */
                for(i = 0; i < bytesLeft; i++) {															//die ungelesene bytes am anfang stellen
                    mainBuf[i] = mainBuf[(MAINBUF_SIZE - bytesLeft) + i];
                }

                //Reads size-bytes from current_SPI_Address and writes them into the given array ((mainBuffer + nBytesLeft))
                //also nach diesem aufruf, ist der mainBuf voll und spiadresse muss verschoben werden
                spiFlashMemRead(SPI_MEM_WORK, spi_address, (mainBuf + bytesLeft),  MAINBUF_SIZE - bytesLeft);

                //nach sync word in dem mainBuf suchen
                bytesTilSyncWord = MP3FindSyncWord(mainBuf, MAINBUF_SIZE);


                if (bytesTilSyncWord == 0) {	//falls guelltige date gleich am anfang liegen
                    spi_address =  spi_address + (MAINBUF_SIZE - bytesLeft);
                } else if (bytesTilSyncWord < 0) {//fehler, kein sync word gefunden
                    run = 0;
                } else if (bytesTilSyncWord > 0) {//falls skip word an der n-te adresse gefunden wurde, verschiebe ich die spiadresse um n, damit ich beim naechsten durchlauf vom flash nur die guelltige daten lese (also muell ueberspringen)
                    spi_address = (spi_address - bytesLeft )+ bytesTilSyncWord;
                }

                bytesLeft = 0;		//MUSS DAS HIER NICHT AUSSERHALB DER WHILE ?? DAMIT DIE NBYTES NICHT VERLOREN GEHEN
            } while(bytesTilSyncWord != 0 && run);

            mainBuf_empty = 0; //mainBuf ist voll
        }


        if (run) {	//wenn kein fehler

            //wenn der mp3OutBuf voll ist ODER der MainBuf leer ist, dann warten (WAITING-LED) anschalten
            if (!mp3OutBuffer->isEmpty || mainBuf_empty) {
                setLED(WAITING_LED);
            } else {
                resetLED(WAITING_LED);

                bytesLeft = MAINBUF_SIZE;																					//in nBytesLeft steht wieviele daten aus dem MainBuf noch in dem mp3OutBuf uebertragen werden muessen
                ptrMainBuf = mainBuf;																			//mainBufPointer soll auf MainBuff zeigen, obwohl es bei der initialisierung schon gemacht wurde !!

                /**
                	* para1: decoder instance
                	*	para2: buffer aus dem die daten decodet werden sollen
                	* para3: (input) --> anzahl gueltige bytes, die gelesen werden sollen,
                	* 			 (output)--> input - gelesene bytes, also die bytes die noch gelesen werden muessen
                	* para4: der buffer in dem geschrieben werden soll, der pointer wird geupdatet (bis wo der voll geschrieben wurde)
                	*/

                //nach diesem aufruf ist der mp3OutBuf auf jeden fall voll
                decodeRetVal = MP3Decode(mp3dec, &ptrMainBuf, &bytesLeft, mp3OutBuffer->data, 0);		//decodeResult -->(0 means no error, < 0 means error)


                mainBuf_empty = 1;																									//der mainBuf ist nicht komplett voll

                if (decodeRetVal < 0) {
                    errorCounter++;
                } else {
                    errorCounter = 0;
                }

                if (errorCounter > 2) {																							//fehler beim decode aufgetreten
                    run = 0;
                } else {
                    mp3OutBuffer->isEmpty = 0;																			//der mp3OutBuffer wurde voll geschrieben, bereit fuer die ISR
                    if(mp3OutBuffer == &buf1) {																			//buffer ist voll, also wechseln
                        mp3OutBuffer = &buf2;
                    } else if (mp3OutBuffer == &buf2) {
                        mp3OutBuffer = &buf1;
                    }
                }
            }
        }

    } while (run);

    MP3FreeDecoder(mp3dec);

}