Звероящер (27.02.2014 11:11, просмотров: 11913)
Внезапно пересел на Keil и на 51-ый, вместо богоугодного AVR. В компиляторе обнаружил следующую хрень. В АВРе, в хидере на микраш есть описания регистров и их битовых полей. Поэтому для того, чтобы выставить те или иные поля я делал красиво и приятно, например так:
UCSR0B |= (1 << RXEN0)
ну или если сразу несколько бит
if (status & ((1 << FE0) | (1 << DOR0) | (1 << UPE0)))
return;
А в Кейле битовые поля объявляются как-то по дурацки:
SBIT (TF2H, SFR_TMR2CN, 7); // Timer 2 High-Byte Overflow Flag
SBIT (TF2L, SFR_TMR2CN, 6); // Timer 2 Low-Byte Overflow Flag
SBIT (TF2LEN, SFR_TMR2CN, 5); // Timer 2 Low-Byte Flag Enable
SBIT (TF2CEN, SFR_TMR2CN, 4); // Timer 2 Capture Enable
SBIT (T2SPLIT, SFR_TMR2CN, 3); // Timer 2 Split-Mode Enable
SBIT (TR2, SFR_TMR2CN, 2); // Timer2 Run Enable
Ну и понятно, что конструкция как в АВРе не работает.
Полез поглядеть, как в примерах сам Кейл показывает, а там блять
void TIMER0_Init (void)
{
TH0 = TIMER_RELOAD; // Init Timer0 High register
TL0 = TIMER_RELOAD; // Init Timer0 Low register
TMOD = 0x03; // Timer0 in two 8-bit mode
CKCON = 0x02; // Timer0 uses a 1:48 prescaler
ET0 = 1; // Timer0 interrupt enabled
ET1 = 1; // Timer1 interrupt enabled
TCON = 0x50; // Timer0 ON
// Timer 0 and 1 can be accessed on all SFR pages.
}
Вот кусок говна!
Придётся самому битовые поля переопределять что-ли?
Или в компилере где-то есть шаманский глюч, отключающий эту богомерзость?