Hallo zusammen,
ich habe nun schon einige Stunden versucht, den Analog-Comparator meines
ATmega88PA mit der Bandgap-Referenz (1.1V) zu verkuppeln - leider ohne
Erfolg.
Zwar vergleicht der Comparator korrekt die Spannungen an AIN1 mit AIN0,
aber er nutzt dabei das externen Beinchen (PD6) anstatt AIN0 mit der
internen Bandgap zu verschalten.
Und was mich am meisten erstaunt:
Auf einem ATmega8 funktioniert es!
Sollte ich einem Hardware-Bug im ATmega88 aufgesessen sein?
Oder habe ich einfach nur einen banalen/kapitalen "Bock" geschossen?
Bitte seid so nett und schaut einmal über den Code.
Die beiden Code-Alternativen (für Atmega88 bzw. Atmega8) findet Ihr
jeweils zwischen BEGIN...END - Kommentaren im Code.
Danke schon einmal an jeden, der ein Auge in den Code
riskiert/investiert.
Viele Grüße
Igel
------------------------------------------------
1 | .list
|
2 | .include "m88PAdef.inc" ; define processor type
|
3 | ;.include "m8def.inc" ; define processor type
|
4 |
|
5 | ; program was tested on ATmega8 and ATmega88PA
|
6 |
|
7 | .equ XTAL = 1000000 ; microprocessor's clock frequency
|
8 | .def akku = r16
|
9 |
|
10 |
|
11 | rjmp init
|
12 |
|
13 |
|
14 | ;-------------------------------------------------------------------
|
15 | ; Initialization
|
16 | ;-------------------------------------------------------------------
|
17 |
|
18 | init:
|
19 |
|
20 |
|
21 | ; Configure a few ports to act as output-ports
|
22 | sbi DDRB, DDB5
|
23 | cbi PORTB, PB5
|
24 |
|
25 |
|
26 |
|
27 | ; Configuration of the ATmega's internal analog comparator:
|
28 | ; Connect AIN1 (=PD7) to the negativ input channel of the analog comparator
|
29 | ; and connect the positive input channel to the internal bandgap reference
|
30 |
|
31 | ldi akku, 0
|
32 | out DDRD, akku
|
33 | out PORTD,akku
|
34 |
|
35 | /*
|
36 | ; BEGIN (Code for ATmega8)
|
37 | cbi ACSR, ACD
|
38 | sbi ACSR, ACBG
|
39 |
|
40 | in akku, SFIOR
|
41 | cbr akku, ACME
|
42 | out SFIOR, akku
|
43 | ; END (Code for ATmega8)
|
44 | */
|
45 |
|
46 |
|
47 |
|
48 | ; BEGIN (Code for ATmega88)
|
49 | lds akku, ACSR
|
50 | cbr akku, (1<<ACD) ; ACD=0 : Analog Comparator is enabled
|
51 | sbr akku, (1<<ACBG) ; ACBG=1: Analog Comparator Bandgap Select
|
52 | sts ACSR, akku
|
53 | sts OCR0A, akku
|
54 |
|
55 | lds akku, ADCSRB ; clear ACME-Bit in Register ADCSRB
|
56 | cbr akku, (1<<ACME)
|
57 | sts ADCSRB, akku
|
58 |
|
59 | lds akku, DIDR1
|
60 | sbr akku, (1<<AIN1D)
|
61 | sbr akku, (1<<AIN0D)
|
62 | sts DIDR1, akku
|
63 | ; END (Code for ATmega88)
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 | main:
|
70 |
|
71 | in akku, ACSR ; read ACSR Register which contains ACO-Bit
|
72 | ; the ACO-Bit represents the output of the
|
73 | ; analog Comparator
|
74 |
|
75 | sbrs akku, ACO ; skip (if) bit (in) register (is) set
|
76 | cbi PORTB, PB5 ; switch off LED on PB5 if ACO=0
|
77 |
|
78 | sbrc akku, ACO ; skip (if) bit (in) register (is) cleared
|
79 | sbi PORTB, PB5 ; switch on LED on PB5 if ACO=1
|
80 |
|
81 | rjmp main
|