Bascom Version 1.11.8.1 and 1.11.8.3

Ich habe beim Projekt Bascom Datalogger mit dem Butterfly vier Bugs im Zusammenhang mit den Registern des ATmega169 festgestellt.

' Config Spi = ...
' Config Clock = Soft
' Powersave
' Clockdivison

Diese sind alle im Quelltext dokumentiert.
siehe https://www.roboternetz.de/phpBB2/viewtopic.php?t=23231

anbei die vier Code-Ausschnitte mit den Workarounds

' Config Spi = ...
Code:
'!!!there is a bug in Bascom SPI I/O-Routine with "Config Spi ..."
'M169: Bascom checks a wrong Register, not the SPI Interrupt Flag SPSR.SPIF
'Config Spi = Hard , Interrupt = Off , Master = Yes , Polarity = High , Phase = 1 , Clockrate = 4 , Noss = 1

'SPI double speed settings
Spsr = &B00000001
'Enable SPI in Master mode, mode 3, Fosc/4
Spcr = &B01011100
' Config Clock = Soft
Code:
'!!!Bascom BUG in Timer-Interrupt
'M169: the Bascom-Statement "Config Clock = Soft" set the false Interrupt Timer0
'you can correct this Bascom-ERROR with two extra code lines:
'     Timsk0.toie0 = 0      'Disable Timer0 Overflow Interrupt
'     Timsk2.toie2 = 1      'Enable Timer2 - Timer/Counter2 Interrupt

'...but we use Async Timer with Bascom-Softclock as workaround
'its easy to extend the SUB _soft_clock (mcs.lbx)  -> "$external _soft_clock"
Config Clock = User                                         'Async, Timer2-Interrupt,
'don't use the alternative "Clock = Soft,GOSUB = SECTIC" its stress the hwstack with extra 30 Byte (Push/Pop)

'...schnipp...

'*********ISR Timer2 - Async **************************************************
'---------------------------------------------------------------
'Interrupt:  Isr_softclock
'Call from:  Interrupt Vector Timer2
'Forward to: Bascom internal ISR _Soft_Clock
'Purpose:    increment RTC: clock and date
'            external 32kHz Oscillator (Async Modus)
'Result:     _sec, _min, _hour, _day, _month, _year
'---------------------------------------------------------------
$external _soft_clock
Const _sectic = 0                                           'Compilerstatement for CONFIG CLOCK = USER , GOSUB <> SECTIC

Isr_softclock:
$asm
   PUSH   R24                                               'save used registers
   IN r24, SREG
   PUSH R24

   LDI    R24, 1
   sts    {Timer_Key_Event},R24                             'variable for detect a new second

   'If _sec = 0 Then Incr Powersavetimer
   LDS     R24, {_sec}                                      'Load direct from data space
   CPI     R24,0                                            'Compare with immediate
   BRNE    no_timer_incr                                    'Branch if not equal
   LDS     R24, {Powersavetimer}
   SUBI    R24,&HFF                                         'incr Auto Power Down timer one minute
   sts {Powersavetimer},R24

No_timer_incr:
   POP R24                                                  'get content of SREG
   !OUT SREG, R24
   POP R24

   'internal Bascom ISR-Routine: Softclock
   JMP    _SOFT_CLOCK                                       'original RETI
$end Asm
Return                                                      'unused dummy RETI

' Powersave
Code:
      '***SLEEP***
      ldi     r24, 7                                        'PowerSave Modus
      !Out Smcr , R24
      Enable Interrupts
      sleep
' Clockdivison
Code:
$crystal = 1000000                                          'only Bascom internal
'now set register Clkpr to 1 Mhz
'RTFM: First, set first *only* Clock Prescaler Change Enable...
Clkpr = &H80                                                'Clkpce
LDI     R24,&B0011                                          'Clkps1&Clkps0
STS     Clkpr,R24                                           '...then (max. 4 Clocks!) prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz