/* * 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;} } } }
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; } } } }
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); //}// } } }
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); } } }
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); }