Äääääähm LotadaC...... wo genau hast du diese Information gefunden?
Äääähhh... tja, da hab ich mich wohl zu weit aus dem Fenster gelehnt...
Laut Online-Hilfe soll die
Direktive (also mit "$") lediglich den Wert den die Compiler-Settings vorgeben überschreiben
Instruct the compiler to override the baud rate setting from the options menu.
Daß nebenbei Transmitter und Reciever aktiviert werden, steht da nicht.
Die Compilersettings selbst aktivieren beides logischerweise auch nicht selbst.
Hab das jetzt natürlich mal alles reassembliert, hier also die Richtigstellung...
- ein leeres Programm (leere Do-Loop) ohne Direktive setzt (wie zu erwarten) weder irgendwelche Werte in die Baudratenregister, noch werden Transmitter oder Reciever aktiviert. Somit bleiben die Beine I/Os.
- verwendet man in diesem Programm irgendwo "Print" oder(!) "Input", werden die Baudratenregister gesetzt (->Compilersettings) und Transmitter und(!) Reciever aktiviert. (außerdem kommt natürlich noch der "Print" bzw "Input"-Kram dazu)
- ein leeres Programm mit Direktive setzt die Baudratenregister und aktiviert Transmitter und(!) Reciever.
- die Baud-Instruktion (ohne "$") manipuliert nur die Baudratenregister
Anmerkung: bei der Manipulation wird das U2X-Bit berücksichtigt, wenn nötig.
Aus
CodeBox BascomAVR
$regfile = "m16adef.dat" 'ATmega 32
$crystal = 8000000 'Quarz: 8 MHz
$baud = 9600
$hwstack = 32 'hardware stack
$swstack = 10 'software stack
$framesize = 40 'frame space
Do
Loop
wird folgender Assemblercode (bzw äquivalenter Maschinencode) generiert, ich habe den mal kommentiert:
CodeBox Assembler
; ******************************************Interruptvektoren********************************
00000000 JMP 0x0000002A ;Jump
00000002 RETI ;Interrupt return
00000003 NOP ;No operation
00000004 RETI ;Interrupt return
00000005 NOP ;No operation
00000006 RETI ;Interrupt return
00000007 NOP ;No operation
00000008 RETI ;Interrupt return
00000009 NOP ;No operation
0000000A RETI ;Interrupt return
0000000B NOP ;No operation
0000000C RETI ;Interrupt return
0000000D NOP ;No operation
0000000E RETI ;Interrupt return
0000000F NOP ;No operation
00000010 RETI ;Interrupt return
00000011 NOP ;No operation
00000012 RETI ;Interrupt return
00000013 NOP ;No operation
00000014 RETI ;Interrupt return
00000015 NOP ;No operation
00000016 RETI ;Interrupt return
00000017 NOP ;No operation
00000018 RETI ;Interrupt return
00000019 NOP ;No operation
0000001A RETI ;Interrupt return
0000001B NOP ;No operation
0000001C RETI ;Interrupt return
0000001D NOP ;No operation
0000001E RETI ;Interrupt return
0000001F NOP ;No operation
00000020 RETI ;Interrupt return
00000021 NOP ;No operation
00000022 RETI ;Interrupt return
00000023 NOP ;No operation
00000024 RETI ;Interrupt return
00000025 NOP ;No operation
00000026 RETI ;Interrupt return
00000027 NOP ;No operation
00000028 RETI ;Interrupt return
00000029 NOP ;No operation
;*******************Reset-Einsprungspunkt****************************************
0000002A LDI R24,0x5F ;Load immediate
0000002B OUT 0x3D,R24 ;Out to I/O location ***Stackpointer setzen (SPL)
0000002C LDI R28,0x40 ;Load immediate ***R28=0x40
0000002D LDI R30,0x26 ;Load immediate ***R30=0x26
0000002E MOV R4,R30 ;Copy register ***R4=0x26
0000002F LDI R24,0x04 ;Load immediate
00000030 OUT 0x3E,R24 ;Out to I/O location ***Stackpointer setzen (SPH) -> RAMEND
00000031 LDI R29,0x04 ;Load immediate ***R29=0x04
00000032 LDI R31,0x04 ;Load immediate ***R31=0x04
00000033 MOV R5,R31 ;Copy register ***R5=0x04
00000034 WD<R ;Watchdog reset
00000035 IN R24,0x34 ;In from I/O location **R24=MCUCSR
00000036 MOV R0,R24 ;Copy register ***R0=MCUCSR
00000037 ANDI R24,0xF7 ;Logical AND with immediate
00000038 OUT 0x34,R24 ;Out to I/O location ***alle Reset-Flags ausser Watchdog löschen
00000039 LDI R24,0x18 ;Load immediate ***R24=0x18
0000003A CLR R25 ;Clear Register ***R25=0
0000003B OUT 0x21,R24 ;Out to I/O location ***unlock WatchdogEnableBit
0000003C OUT 0x21,R25 ;Out to I/O location ***Watchdog abschalten
0000003D LDI R30,0xFE ;Load immediate
0000003E LDI R31,0x03 ;Load immediate ***Z-Pointer -> 0x03FE
0000003F LDI R26,0x60 ;Load immediate
00000040 LDI R27,0x00 ;Load immediate ***X-Pointer -> 0x0060 (SRAMstart)
00000041 CLR R24 ;Clear Register ***R24=0
;*********Schleife mit dekrementierendem Z-Pointer als Schleifenzähler schreibt 0x00 an das Ziel des Z-Pointers, mit post-inkrement***
00000042 ST X+,R24 ;Store indirect and postincrement
00000043 SBIW R30,0x01 ;Subtract immediate from word
00000044 BRNE PC-0x02 ;Branch if not equal
;*********effektiv wird damit der gesamte SRAM (nach dem I/O-Space) gelöscht***
00000045 LDI R24,0x33 ;Load immediate
00000046 OUT 0x09,R24 ;Out to I/O location ***UBRRL=0x33
00000047 LDI R24,0x00 ;Load immediate
00000048 OUT 0x20,R24 ;Out to I/O location ***UBRRH=0x00
00000049 LDI R24,0x18 ;Load immediate
0000004A OUT 0x0A,R24 ;Out to I/O location ***setzt TXEN und RXEN in UCSRB <-------------- Transmitter und Reciever aktiviert
0000004B CLR R6 ;Clear Register *** R6=0
;******************Endlosschleife (leeres Hauptprogramm)******
0000004C JMP 0x0000004C ;Jump
;**************************Ende*******************************
;*********ZeitvernichtungsRoutine*****************************
0000004E SBIW R30,0x01 ;Subtract immediate from word
0000004F BRNE PC-0x01 ;Branch if not equal
00000050 RET ;Subroutine return
;*************************************************************
;****************Routine setzt R6.2 über das "T" *************
00000051 SET ;Set T in SREG
00000052 BLD R6,2 ;Bit load from T to register
00000053 RET ;Subroutine return
;*************************************************************
;****************Routine löscht R6.2 über das "T" ************
00000054 CLT Clear T in SREG
00000055 BLD R6,2 Bit load from T to register
00000056 RET Subroutine return
;*************************************************************
Ohne Baudratendirektive entfallen dann die Zeilen (Adressen) 0x0045..0x004A
Verwendet man den UART aus den Compilersettings heraus, stehen diese Zeilen erst hinter dem "CLR R6" (also vertauscht).