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