Forum: Mikrocontroller und Digitale Elektronik ATmega88PA: Analog Comparator will die interne referenz (bandgap) nicht nutzen


von igel (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

> sts     ACSR, akku

ACSR liegt im IO-Bereich -> out ACSR,akku

MfG Spess

von igel (Gast)


Lesenswert?

!!! V O L L T R E F F E R !!!

Endlich ... es funktioniert ...

spess53, Du bist der Größte !
1000 Dank für die Unterstützung !

Viele Grüße

Igel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.