コード例 #1
0
ファイル: bus.c プロジェクト: busmaster/homebus
/*-----------------------------------------------------------------------------
* send bus telegram
*/
uint8_t BusSend(TBusTelegram *pMsg) {

   uint8_t ch;
   uint8_t checkSum = CHECKSUM_START;

   ch = STX;
   SioWrite(ch);
   checkSum += ch;

   ch = pMsg->senderAddr;
   TransmitCharProt(ch);
   checkSum += ch;

   ch = pMsg->type;
   TransmitCharProt(ch);
   checkSum += ch;

   switch(pMsg->type) {
      case eBusDevStartup:
         break;
      case eBusDevRespUpdEnter:
         ch = pMsg->msg.devBus.receiverAddr;
         TransmitCharProt(ch);
         checkSum += ch;
         break;
      case eBusDevRespUpdData:
         ch = pMsg->msg.devBus.receiverAddr;
         TransmitCharProt(ch);
         checkSum += ch;
         /* first the low byte */
         ch = pMsg->msg.devBus.x.devResp.updData.wordAddr & 0xff;
         TransmitCharProt(ch);
         checkSum += ch;
         /* the high byte */
         ch = pMsg->msg.devBus.x.devResp.updData.wordAddr >> 8;
         TransmitCharProt(ch);
         checkSum += ch;
         break;
      case eBusDevRespUpdTerm:
         ch = pMsg->msg.devBus.receiverAddr;
         TransmitCharProt(ch);
         checkSum += ch;
         ch = pMsg->msg.devBus.x.devResp.updTerm.success;
         TransmitCharProt(ch);
         checkSum += ch;
         break;
      default:
         break;
   }
   TransmitCharProt(checkSum);
   SioReadFlush();

   return BUS_SEND_OK;
}
コード例 #2
0
ファイル: main.c プロジェクト: haslhoferm/homebus
/*-----------------------------------------------------------------------------
*  program start
*/
int main(void) {

   UINT8   ret;  
   UINT16  flashWordAddr;    
   UINT16  sum;

   cli();
   MCUSR = 0;
   wdt_disable();

   /* get oscillator correction value from EEPROM */
   EEAR = OSCCAL_CORR;
   /* Start eeprom read by writing EERE */
   EECR |= (1 << EERE);
   /* read data */
   OSCCAL += EEDR;

   /* get modul adress from EEPROM */
   EEAR = MODUL_ADDRESS;
   /* Start eeprom read by writing EERE */
   EECR |= (1 << EERE);
   /* read data */
   sMyAddr = EEDR;

   /* configure pins to input with pull up */
   PORTB = 0b11111111;
   DDRB =  0b00000000;

   PORTC = 0b11111111;
   DDRC =  0b00000000;

   PORTD = 0b11111111;
   DDRD =  0b00100010;

   /* configure Timer 0 */
   /* prescaler clk/64 -> Interrupt period 256/1000000 * 64 = 16.384 ms */
   TCCR0B = 3 << CS00; 
   TIMSK0 = 1 << TOIE0;

   SioInit();
   spRxBusMsg = BusMsgBufGet();

   /* Enable change of Interrupt Vectors */
   MCUCR = (1 << IVCE);
   /* Move interrupts to Boot Flash section */
   MCUCR = (1 << IVSEL);

   /* Prüfsumme der Applikation berechnen */
   sum = 0;
   for (flashWordAddr = 0; flashWordAddr < (MAX_FIRMWARE_SIZE / 2); flashWordAddr += CHECKSUM_BLOCK_SIZE) {
      sum += FlashSum(flashWordAddr, (UINT8)CHECKSUM_BLOCK_SIZE);
   }

   if (sum != FLASH_CHECKSUM) {
      /* Fehler */
      sFwuState = WAIT_FOR_UPD_ENTER;      
   }
   sei();
      
   /* Startup-Msg senden */
   sTxBusMsg.type = eBusDevStartup;  
   sTxBusMsg.senderAddr = MY_ADDR; 
   BusSend(&sTxBusMsg);  
   SioReadFlush();
 
   /* Hauptschleife */
   while (1) {   
      ret = BusCheck();
      ProcessBus(ret);
      /* Mit timeout auf Request zum Firmwareupdate warten  */
      if (sFwuState == WAIT_FOR_UPD_ENTER_TIMEOUT) {
         if (gTimeS8 >= 4) {
            /* Application starten */
            break;
         }
      } 
   } 
            
   cli();
   
   /* Enable change of Interrupt Vectors */
   MCUCR = (1 << IVCE);
   /* Move interrupts to application section */
   MCUCR = (0 << IVSEL);

   /* jump to application */
   ApplicationEntry();
   
   /* never reach this */
   return 0;
} 
コード例 #3
0
ファイル: main.c プロジェクト: haslhoferm/homebus
/*-----------------------------------------------------------------------------
*  Programstart
*/
int main(void) {

   UINT8   ret;  
   UINT16  flashWordAddr;    
   UINT16  sum;

   /* get oscillator correction value from EEPROM */
   EEAR = OSCCAL_CORR;
   /* Start eeprom read by writing EERE */
   EECR |= (1 << EERE);
   /* read data */
   OSCCAL += EEDR;

   /* get modul adress from EEPROM */
   EEAR = MODUL_ADDRESS;
   /* Start eeprom read by writing EERE */
   EECR |= (1 << EERE);
   /* read data */
   sMyAddr = EEDR;

   /* Portpins für Schaltereingänge mit Pullup konfigurieren */
   /* nicht benutzte Pin aus Ausgang Low*/
   PORTC = 0x03;
   DDRC = 0x3C;             
   
   PORTB = 0x38;
   DDRB = 0xC7;
   
   PORTD = 0x01;
   DDRD = 0xFE;

   /* configure Timer 0 */
   /* prescaler clk/64 -> Interrupt period 256/1000000 * 64 = 16.384 ms */
   TCCR0 = 3 << CS00; 
   TIMSK = 1 << TOIE0;

   SioInit();
   spRxBusMsg = BusMsgBufGet();

   /* Umschaltung der Interruptvektor-Tabelle */
   GICR = (1 << IVCE);
   /* In Bootbereich verschieben */
   GICR = (1 << IVSEL);

   /* Prüfsumme der Applikation berechnen */
   sum = 0;
   for (flashWordAddr = 0; flashWordAddr < (MAX_FIRMWARE_SIZE / 2); flashWordAddr += CHECKSUM_BLOCK_SIZE) {
      sum += FlashSum(flashWordAddr, (UINT8)CHECKSUM_BLOCK_SIZE);
   }

   if (sum != FLASH_CHECKSUM) {
      /* Fehler */
      sFwuState = WAIT_FOR_UPD_ENTER;      
   }

   sei();
                          
   /* Startup-Msg senden */
   sTxBusMsg.type = eBusDevStartup;  
   sTxBusMsg.senderAddr = MY_ADDR; 
   BusSend(&sTxBusMsg);  
   SioReadFlush();
   
   /* Hauptschleife */
   while (1) {   
      ret = BusCheck();
      ProcessBus(ret);
      /* Mit timeout auf Request zum Firmwareupdate warten  */
      if (sFwuState == WAIT_FOR_UPD_ENTER_TIMEOUT) {
         if (gTimeS8 >= 4) {
            /* Application starten */
            break;
         }
      } 
   } 
            
   cli();
   /* Umschaltung der Interruptvektor-Tabelle */
   GICR = (1 << IVCE);
   /* In Applikationsbereich verschieben */
   GICR = (0 << IVSEL);
   
   /* zur Applikation springen */       
   ApplicationEntry();
   /* hier kommen wir nicht her!!*/
   return 0;
}