;ADC3.asm, AD-Wandler mit Referenz 1,1 VDie spannende Frage ist nun, was läuft da in Bascom anders, und was kann man dagegen tun? Man muss dem Compiler einmal genauer auf die Finger schauen, indem das Ergebnis in Assembler analysiert wird. Das geht mithilfe des AVR Studio 4. Beim Kompilieren soll Bascom ein OBJ-File erzeugen.
.include "tn13def.inc"
.def A = r16
.def B = r17
.def Delay = r18
.def Count = r19
;Port B
.equ TXD = 1
.equ RXD = 2
rjmp Anfang
Anfang:
sbi ddrb,TXD ;Datenrichtung TXD
rcall AdcInit
Schleife:
rcall RdCOM
rcall RdADC
rcall WrCOM
rjmp Schleife
AdcInit:
ldi A,3 ;Clock / 4
out ADCSRA,A
sbi ADCSRA,ADEN ;AD einschalten
ret
RdADC:
out ADMUX,A
sbi ADMUX,ADLAR ;Left adjust
sbi ADMUX,REFS0 ;1,1 V Referenz
sbi ADCSRA,ADSC ;Wandlung starten
ADrdy:
sbic ADCSRA,ADSC
rjmp ADrdy
sbi ADCSRA,ADSC
ADrdyb:
sbic ADCSRA,ADSC
rjmp ADrdyb
in A,ADCH
ret
$regfile = "m32def.dat"
Dim Dd As Word
Config Adc = Single , Prescaler = 32 , Reference = Internal
Start Adc
Do
Dd = Getadc(3)
Loop
--- Test2.bas ------------------------------------------------------------------------------------
5: Config Adc = Single , Prescaler = 32 , Reference = Internal
+0000003D: E085 LDI R24,0x05 Load immediate
+0000003E: B986 OUT 0x06,R24 Out to I/O location
5: Config Adc = Single , Prescaler = 32 , Reference = Internal
+0000003F: EC80 LDI R24,0xC0 Load immediate
+00000040: B987 OUT 0x07,R24 Out to I/O location
6: Start Adc
+00000041: 9A37 SBI 0x06,7 Set bit in I/O register
10: Dd = Getadc(3)
+00000042: EC83 LDI R24,0xC3 Load immediate
+00000043: 6C80 ORI R24,0xC0 Logical OR with immediate , 1100 000 fest vorgegeben
10: Dd = Getadc(3)
+00000044: B987 OUT 0x07,R24 Out to I/O location , ins ADMUX-Register
+00000045: 940E0056 CALL 0x00000056 Call subroutine
+00000047: E6A0 LDI R26,0x60 Load immediate
10: Dd = Getadc(3)
+00000048: E0B0 LDI R27,0x00 Load immediate
+00000049: 938D ST X+,R24 Store indirect and postincrement
10: Dd = Getadc(3)
+0000004A: 939C ST X,R25 Store indirect
12: Loop
+0000004B: 940C0042 JMP 0x00000042 Jump
12: Loop
+0000004D: 9731 SBIW R30,0x01 Subtract immediate from word
+0000004E: F7F1 BRNE PC-0x01 Branch if not equal
12: Loop
+0000004F: 9508 RET Subroutine return
+00000050: 9468 SET Set T in SREG
12: Loop
+00000051: F862 BLD R6,2 Bit load from T to register
+00000052: 9508 RET Subroutine return
12: Loop
+00000053: 94E8 CLT Clear T in SREG
+00000054: F862 BLD R6,2 Bit load from T to register
12: Loop
+00000055: 9508 RET Subroutine return
+00000056: 9A36 SBI 0x06,6 Set bit in I/O register
12: Loop
+00000057: 9936 SBIC 0x06,6 Skip if bit in I/O register cleared
+00000058: CFFE RJMP PC-0x0001 Relative jump
12: Loop
+00000059: 9A36 SBI 0x06,6 Set bit in I/O register
+0000005A: 9936 SBIC 0x06,6 Skip if bit in I/O register cleared
12: Loop
+0000005B: CFFE RJMP PC-0x0001 Relative jump
+0000005C: B184 IN R24,0x04 In from I/O location
12: Loop
+0000005D: B195 IN R25,0x05 In from I/O location
+0000005E: 9508 RET Subroutine return
$regfile = "m32def.dat"
$hwstack = 32
$swstack = 64
$framesize = 64
$baud = 19200
$crystal = 11059200
Dim Dd As Word
Dim Ref As Byte
Declare Function Ad(byval C As Byte) As Word
Config Adc = Single , Prescaler = 32 , Reference = Avcc
Start Adc
Ref = 192 'Ref 2,56 V
Do
Dd = Ad(7)
Print Dd
Waitms 500
Loop
Function Ad(byval C As Byte) As Word
Local Dl As Byte
Local Dh As Byte
Local Dd3 As Word
C = C + Ref
Admux = C
Adcsr.6 = 1
Do
Loop Until Adcsr.6 = 0
Adcsr.6 = 1
Do
Loop Until Adcsr.6 = 0
Dl = Adcl
Dh = Adch
Dd3 = 256 * Dh
Dd3 = Dd3 + Dl
Ad = Dd3
End Function