Errata 'De taal C en de Xmega'

Eerste druk, 2014

  • Op pagina 84: staat in het derde grijze blok:
    for ( sum-0,i=0; i<n; sum+=i,i++) ;
    dit moet zijn:
    for ( sum=0,i=0; i<n; sum+=i,i++) ;
  • In figuur 15.1 op pagina 200 zijn in het schema twee pinnummers niet correct. De pinnummers 40 (RESET/PDI) en 42 (PDI) moeten respectievelijk 35 en 34 zijn.
    verbetering schema 15.1
    Dit geldt voor alle schema's met de Xmega, dus ook voor de figuren: 15.11, 17.3, 17.17, 18.15, 18.19, 19.17, 20.8, 21.5, 22.11, 22.15, 23.7, 23.14 en H.1.
  • In code 17.8 op bladzijde 262 wordt poort D gebruikt en in de bijbehorende tekst en in figuur 17.15 wordt poort B. In code 17.8 moet regel 27 aangepast worden:
      PORTB.DIRSET = 0x0F;
    
    en het statement op regel 40 en 41 moet als volgt aangepast worden:
          PORTB.OUT = (PORTB.OUT & 0xF0) |
                                   ( (~_BV(i) & 0x0F);
    
    Overigens is bij poort B de bitmaskering overbodig. Poort B heeft bij de Xmega128a4u slechts vier ingangen. Dus dit kan ook worden vervangen door:
          PORTB.OUT = (~_BV(i) & 0x0F;
    
    of door:
          PORTB.OUT = ~_BV(i);
    
  • Op bladzijde 307 moet de laatste toewijzing aan ADCA.CTRLB in de inzet midden op de pagina vervangen worden door:
      ...
      ADCA.CTRLB  =  ADC_RESOLUTION_12BIT_gc;         // 12 bits conversion
      ADCA.CTRLB |= !ADC_CONMODE_bm;                  // unsigned
      ADCA.CTRLB |= !ADC_FREERUN_bm;                  // no free run
    
  • Op bladzijde 298 staat dat ΔV gelijk is aan 0.05 VCC, dat moet zijn gelijk aan 0.05 Vref. Op bladzijde 308 is ΔV wel correct weergegeven.
  • In code 19.7 moet voor regel 26 aan de functie init_adc deze toekenning toegevoegd worden:
     ADCA.CTRLA       = ADC_ENABLE_bm;
    
  • In code 23.7 moet regel 5 van functie init_ac worden gewijzigd in:
     PORTA.DIRCLR      = PIN2_bm | PIN1_bm;    // PA2 and PA1 are inputs
    
    In code 23.8 moet regel 6 van functie init_ac worden gewijzigd in:
     PORTA.DIRCLR      = PIN2_bm;              // PA2 is input
    
    In code 23.10 moet regel 3 van functie init_ac worden gewijzigd in:
     PORTA.DIRCLR      = PIN2_bm;
    
  • In tabel 16.3 zijn de adressen bij nummer 91, 92 en 93 niet correct. Deze adresse zijn:
      91  0x016C  USARTD1_RXC_vect  UART D1 reception complete interrupt
      92  0x0170  USARTD1_DRE_vect  UART D1 data register empty interrupt
      93  0x0174  USARTD1_TXC_vect  UART D1 transmission complete interrupt
    
  • In figuur 16.4 moet adres 000090 worden gewijzid in 00008a.
  • In figuur 16.4 is de syntax van de assembly op een paar plaatsen verkeerd:
            +.64  moet .+64  zijn
            +.100 moet .+100 zijn
            -.538 moet .-538 zijn
  • Bij de notitie in de marge van pagina 224 moet staan: "In code 16.1 is pin 3 van poort B ..."
  • In paragraaf 17.6 op pagina 259 staat: "Het RAM-geheugen van de Xmega is ongeveer 32 kB groot.". Dit is niet correct. Dit moet zijn: "Het RAM-geheugen van de Xmega is ongeveer 8 kB groot.".
  • Bij code 23.20 is regel 3 overbodig.
  • Bij code 23.21 is regel 3 overbodig.
  • Bij code 23.22 is regel 3 overbodig.
  • Bij code 23.23 is regel 4 overbodig.
  • Bij code 23.24 is regel 3 overbodig.
  • Bij code 23.26 is regel 4 overbodig.
  • In code 22.14 moet regel 19 worden gewijzigd in:
        if ( TCC0.CCA <= (1000 - STEP) ) TCC0.CCABUF = TCC0.CCA + STEP;
    
  • In code 22.14 moet regel 23 worden gewijzigd in:
        if ( TCC0.CCA <= (500 - STEP) )  TCC0.CCABUF = TCC0.CCA - STEP;
    
  • In code 22.18 moet regel 6 worden gewijzigd in:
      TCC1.INTCTRLA = TC_OVFINTLVL_LO_gc;       // enables overflow interrupt
    
  • In code 22.18 moet regel 12 worden gewijzigd in:
      TCC1.INTCTRLA = TC_OVFINTLVL_OFF_gc;      // disables overflow interrupt
    
  • De functie i2c_read uit code 21.8 werkt wel bij 2 MHz correct, maar niet bij 32 MHz. Dit i2c_read werkt wel correct:
    uint8_t i2c_read(TWI_t *twi, uint8_t ack)
    {
      uint8_t data;
    
      while( ! (twi->MASTER.STATUS & TWI_MASTER_RIF_bm) );                       // wait until received
      data = twi->MASTER.DATA;                                                   // read data
      twi->MASTER.CTRLC = ((ack==I2C_ACK) ? TWI_MASTER_CMD_RECVTRANS_gc :        // send ack (go on) or
                                   TWI_MASTER_ACKACT_bm|TWI_MASTER_CMD_STOP_gc); //     nack (and stop)
    
      if (ack==I2C_NACK) {
        while( ! (twi->MASTER.STATUS & TWI_MASTER_BUSSTATE_IDLE_gc) );
      }
    
      return data;
    }
  • Op pagina 432 staat in de voorlaatste alinea:
    Op adres 256 staat de waarde 0.
    dit moet zijn:
    Op adres 255 staat de waarde 0.
  • Op pagina 259 staat bovenaan:
    Het RAM-geheugen van de Xmega is ongeveer 32 kB groot.
    dit moet zijn:
    Het RAM-geheugen van de Xmega is ongeveer 8 KB groot.
  • De titel van code 23.22:
    De functie AutoCalibration32M, die de interne 2 MHz oscillator verbetert.
    moet zijn:
    De functie AutoCalibration2M, die de interne 2 MHz oscillator verbetert.
  • Op pagina 384 staat in het grijze blok:
      ISR(TIMER0_OVF_vect)
    
    moet zijn:
      ISR(TCC0_OVF_vect)
    
  • Op pagina 384 staat in het grijze blok:
    In de oneindige lus wordt getest of een van de ingangen 0 en 1 van poort~A laag is.
    moet zijn:
    In de oneindige lus wordt getest of een van de ingangen 0 en 1 van poort~B laag is.
  • Zowel regel 10 in code 17.3 als regel 11 in code 17.4:
      bar = (bar << 1) & 0x0001;
    
    moet zijn:
      bar = (bar << 1) | 0x0001;
    
  • Op pagina 210 staat in de laatste regel van de eerste alinea:
    Op regel 10 worden bit 2 en 3 weer laag gemaakt.
    moet zijn:
    Op regel 12 worden bit 2 en 3 weer laag gemaakt.
  • Regel 29 in code 15.10:
      PORTE.DIRCLR   = PIN2_bm;            // output pin led
    
    moet zijn:
      PORTE.DIRSET   = PIN2_bm;            // output pin led
    
  • Regel 22 in code 22.16:
      uint8_t c;
    
    moet zijn:
      uint16_t c;
    
  • Regel 5 in code 23.24:
      while(!(OSC.STATUS & OSC_RC32K_bm));      // Wait for oscillator is ready
    
    moet zijn:
      while(!(OSC.STATUS & OSC_RC32KRDY_bm));      // Wait for oscillator is ready
    
  • In tabel 21.2 is de vierde regel:
      SCK        1(XCK)   5(XCK)   7    7
    
    dit moet zijn:
      SCK        1(XCK)   5(XCK)   7    5
    
  • Op pagina 355 staat in de tweede alinea:
    ... via signaal SD0 een databit naar binnen en via SDO een databit naar buiten.
    moet zijn:
    ... via signaal SDI een databit naar binnen en via SD0 een databit naar buiten.
  • De titel van code 22.3 is:
    Een PWM-signaal met een duty-cycle van 20% met de single-slope-modus.
    dit moet zijn:
    Een PWM-signaal met een duty-cycle van 80% met de single-slope-modus.