Forum: Mikrocontroller und Digitale Elektronik Frage zum ADC am AtTiny45


von Michael (Gast)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

meine Frage bezieht sich auf die angehängten Dateien.

In der Tabelle aus dem Datasheet des Tiny45 steht unter "X00" "VCC used 
as voltage Reference, disconnected from PB0(AREF)".

Bedeutet für mich ich wähle diesen Modus und muss an AREF nichts 
anschließen.

Im AVR-Tutorial von Mikrocontroller steht allerdings -wie angemarkt- das 
ich immer (mindestens) einen 100nF Kondensator zwischen AREF und Ground 
schalten muss.

Jetzt meine Frage:
Wie soll ich das jetzt anschließen mit oder ohne Kondensator?
Bzw welche Schaltung benutzt ihr zum wandeln?

Viele Grüße
Michael

von VIA (Gast)


Lesenswert?

Michael schrieb:
> Bedeutet für mich ich wähle diesen Modus und muss an AREF nichts
> anschließen.

Würde ich auch so deuten.

-> Wenn der ADC nicht verwendet oder VCC als VREF verwendet wird, hat 
der ADC mit PORTB.0 nichts am Hut und kann anderweitig verwendet werden.

-> Wenn eine interne VREF (1.1V / 2.56V) verwendet wird, muss der 
AREF-Pin mit einem Kondensator beschaltet werden.

-> Wenn eine externe VREF über den AREF-Pin verwendet wird, muss dort 
sowieso die entsprechende Schaltung angeschlossen werden.


Michael schrieb:
> Bzw welche Schaltung benutzt ihr zum wandeln?

Meist eine externe Präzisions-Referenz, da uns die internen nicht genau 
genug sind.

von loko (Gast)


Lesenswert?

Michael schrieb:
> Bedeutet für mich ich wähle diesen Modus und muss an AREF nichts
> anschließen.

Ja.

> Im AVR-Tutorial von Mikrocontroller steht allerdings -wie angemarkt- das
> ich immer (mindestens) einen 100nF Kondensator zwischen AREF und Ground
> schalten muss.

Wo? Aber nicht für den Attiny45, oder?

von Michael (Gast)


Lesenswert?

loko schrieb:
> Wo? Aber nicht für den Attiny45, oder?

Steht hier http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC 
unter Punkt Referenzspannung AREF

von Walter S. (avatar)


Lesenswert?

VIA schrieb:
> -> Wenn eine interne VREF (1.1V / 2.56V) verwendet wird, muss der
> AREF-Pin mit einem Kondensator beschaltet werden.

nein!

von Walter S. (avatar)


Lesenswert?

Michael schrieb:
> loko schrieb:
>> Wo? Aber nicht für den Attiny45, oder?
>
> Steht hier http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
> unter Punkt Referenzspannung AREF

Aber nicht für den Attiny45, oder?

von THOR (Gast)


Lesenswert?

Michael schrieb:
> Hallo an alle,
>
> meine Frage bezieht sich auf die angehängten Dateien.
>
> In der Tabelle aus dem Datasheet des Tiny45 steht unter "X00" "VCC used
> as voltage Reference, disconnected from PB0(AREF)".
>
> Bedeutet für mich ich wähle diesen Modus und muss an AREF nichts
> anschließen.

Exakt, der hängt frei und Vcc wird intern als Referenz verwendet.

> Im AVR-Tutorial von Mikrocontroller steht allerdings -wie angemarkt- das
> ich immer (mindestens) einen 100nF Kondensator zwischen AREF und Ground
> schalten muss.

Nee, nicht immer. Aber er schadet nie und erspart dem Forum tausende 
Threads die sich alle auf das Fehlen dieses Kondensators zurückführen 
lassen.

> Jetzt meine Frage:
> Wie soll ich das jetzt anschließen mit oder ohne Kondensator?
> Bzw welche Schaltung benutzt ihr zum wandeln?

Was willst du wohin wandeln und wie oft pro Sekunde und warum. Ich hab 
sowohl schon 20kHz Audio als auch Gleichspannung von nem Potiabgriff 
durch den ADC gejagt.
Die Schaltung ist natürlich nicht jedesmal gleich.

von Michael (Gast)


Lesenswert?

@THOR
Okay dann hab ich des wohl richtig verstanden.

Bei mir geht es nur um einen Bewegungsmelder der bei Bewegung an seinem 
Datenpin zu wenig Volt ausgibt, sodass der µC es nicht als HIGH erkennt.

Also muss ich es selbst auswerten. Das ist weder Zeit noch wirklich 
Pegelkritisch, also kann mir auch ein relativ große Ungenauigkeit der 
Referenzspannung egal sein.

Vielen Dank an alle
Michael

von Michael (Gast)


Lesenswert?

Da das immernoch das selbe Problem betrifft füg ich es einfach mal hier 
an...

Ich habe mir das jetzt alles so zurecht gebaut wie ich es brauche (denke 
es sollte so klappen) aber in der Abfrage kommt leider nie ein "erfolg" 
raus

Könntet ihr mal drüber schauen ob ich irgend einen dummen Fehler im Code 
gemacht hab?
1
.include "tn45def.inc"  ; Definitionsdatei für den AtTiny45 einbinden
2
3
;------------------------------- Interruptvektortabelle --------------------------------
4
.org 0x0000
5
    rjmp RESET        ; Address 0x0000
6
    reti          ; Address 0x0001 (External Interrupt Request 0)
7
    reti          ; Address 0x0002 (Pin Change Interrupt Request 0)
8
    reti          ; Address 0x0003 (Timer/Counter1 Compare Match A)
9
    reti          ; Address 0x0004 (Timer/Counter1 Overflow)
10
    reti          ; Address 0x0005 (Timer/Counter0 Overflow)
11
    reti          ; Address 0x0006 (EEPROM Ready)
12
    reti          ; Address 0x0007 (Analog Comparator)
13
    rjmp ADC_ISR              ; Address 0x0008 (ADC Conversion Complete)
14
    reti          ; Address 0x0009 (Timer/Counter1 Compare Match B)
15
    rjmp TIMER0_COMPA_ISR                  ; Address 0x000A (Timer/Counter0 Compare Match A)
16
    reti          ; Address 0x000B (Timer/Counter0 Compare Match B)
17
    reti          ; Address 0x000C (Watchdog Time-out)
18
    reti          ; Address 0x000D (USI START)
19
    reti          ; Address 0x000E (USI Overflow)
20
21
;------------------------------------ Hauptprogramm ------------------------------------  
22
RESET:            ; Einstiegspunkt der Anwendung
23
    ;Stackpointer initialisieren
24
    ldi r16, HIGH(RAMEND)
25
    out SPH, r16
26
27
    ldi r16, LOW(RAMEND)
28
    out SPL, r16
29
30
    ; I/O Konfiguration
31
    sbi DDRB, DDB3              ; Pin-3(=Statusanzeige) als Ausgang
32
    sbi DDRB, DDB4              ; Pin-4(=Bewegungsanzeige) als Ausgang
33
34
    ldi r16, (1 << PORTB5) | (1 << PORTB1) | (1 << PORTB0)
35
    out PORTB, r16              ; Aktiviere bei allen unbenutzten Pins(=>Eingänge) die Pull-Up Widerstände
36
37
    ; ADC Konfiguration
38
    ldi r16, (1 << ADC1D)
39
    out DIDR0, r16              ; Deaktiviere die Digitale Signalabnahme an PB2
40
41
    ldi r16, (1 << ADLAR) | (1 << MUX0)
42
    out ADMUX, r16              ; ADC an PB2 und Ergebnis von links anordnen (8-Bit Auflösung)
43
44
    ldi r16, (1 << ADEN) | (1 << ADSC) | (1 << ADATE)| (1 << ADIE) | (1 << ADPS1) | (1 << ADPS0)
45
    out ADCSRA, r16              ; ADC-Prescaler => 8; ADC und zugehöriger Interrupt aktiviert
46
47
    ; Erfolgreiche Initialisierung
48
    sbi PORTB, PORTB3
49
    sei                    ; Aktiviere Interrupts Global
50
  loop:
51
    rjmp loop
52
53
TIMER0_COMPA_ISR:
54
    reti
55
ADC_ISR:
56
    push r16
57
    in r16, ADCH
58
    cpi r16, 50
59
    BRLT aus
60
  ein:
61
    sbi PORTB, PORTB4
62
    rjmp adc_ende
63
  aus:
64
    cbi PORTB, PORTB4
65
    rjmp adc_ende
66
  adc_ende:
67
    pop r16
68
    reti

Den Timer könnt ihr euch ja erstmal wegdenken das kommt später noch...

von c-hater (Gast)


Lesenswert?

Michael schrieb:

> Bei mir geht es nur um einen Bewegungsmelder der bei Bewegung an seinem
> Datenpin zu wenig Volt ausgibt, sodass der µC es nicht als HIGH erkennt.

Dann könnte man den Analog-Komparator einsetzen. U.a. für sowas ist der 
gedacht...

von Michael (Gast)


Lesenswert?

c-hater schrieb:
> Dann könnte man den Analog-Komparator einsetzen. U.a. für sowas ist der
> gedacht...

Oh danke für den Tipp den hatte ich bisher total außer Acht gelassen :D

von VIA (Gast)


Lesenswert?

Walter S. schrieb:
> VIA schrieb:
>> -> Wenn eine interne VREF (1.1V / 2.56V) verwendet wird, muss der
>> AREF-Pin mit einem Kondensator beschaltet werden.
>
> nein!


Erklärung wäre gut gewesen...

Okay, es "muss" nicht zwangsläufig ein Kondensator angeschlossen werden,
wenn die interne Referenz verwendet werden soll.

Bei interner Referenz von 1,1V hat der AREF-Pin scheinbar keine Funktion 
bzgl. Entkopplung ("disconnected from PB0")

Bei 2,56V int. Referenzspannung hat man die Option (REFS0 im 
ADMUX-Reg.), die VREF an PB0 zwecks Kondensator herauszuführen.

Ich würde es aber tun, wenn der Pin nicht unbedingt anderweitig 
verwendet werden muss:

"Optionally the internal 2.56V voltage reference may be decoupled by an 
external capacitor at the AREF pin to improve noise immunity."

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Michael schrieb:
> ADC_ISR:
>     push r16
>     in r16, ADCH
>     cpi r16, 50
>     BRLT aus
>   ein:
>     sbi PORTB, PORTB4
>     rjmp adc_ende
>   aus:
>     cbi PORTB, PORTB4
>     rjmp adc_ende
>   adc_ende:
>     pop r16
>     reti

Du musst in einer ISR auf Assembler Ebene auch immer das Statuswort 
sichern, weil sonst dein Hauptprogramm ins Schleudern kommt. Im Moment 
noch nicht wichtig, weil deine Hauptschleife leer ist, aber sobald da 
was passiert, zerstört dir die ISR den SREG Wert.
Also z.B.
1
ADC_ISR: IN r12,SREG
2
3
; lots of isr here
4
END_ISR: OUT SREG,r12
5
         reti
>     BRLT aus
Kann bei Vergleiche ohne Vorzeichen lustig sein und nicht das gewünschte 
Ergebnis bringen, Benutze lieber
1
      CPI r16,50     ; carry set if 50 > r16
2
      BRCS aus
Die richtige Funktion solltest du mit einem variablen Spannungswert and 
ADC1 prüfen können.

von c-hater (Gast)


Lesenswert?

Matthias S. schrieb:

> Du musst in einer ISR auf Assembler Ebene auch immer das Statuswort
> sichern, weil sonst dein Hauptprogramm ins Schleudern kommt.

Nein. Das gilt nur, wenn es überhaupt ein "Hauptprogramm" gibt. Wenn 
dieses nur aus:
1
main:
2
  rjmp main

besteht, dann entfällt eine solche Restriktion.

Und tatsächlich können die allermeisten Anwendungen problemlos komplett 
als ISRs implementiert werden. "Main" wird dann allenfalls benötigt, um 
geordnet schlafen zu gehen. Und das kann man dann so implementieren, 
dass keine Auswertung irgendwelcher SREG-Flags erforderlich ist. Damit 
entfällt dann in allen ISRs natürlich die Notwendigkeit zum sichern von 
SREG. Jedenfalls solange man alle ISRs vollständig "exklusiv" 
implementiert (was allerdings oft auch nicht möglich oder zumindest 
nicht optimal ist). Dann natürlich sieht die Sache gleich wieder anders 
aus, dann wird auch die Sicherung von SREG wieder Thema. Aber auch dann 
noch nicht zwingend in jeder ISR...

von Michael (Gast)


Lesenswert?

Bei den ISRs bin ich zwar anderer Meinung, da ich keine anderen 
Vergleiche im Hauptprogramm hab, die die SREG Benötigen, aber danke für 
den Hinweis mit BRCS, damit hats jetzt geklappt

DANKE !!

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

c-hater schrieb:
>> Du musst in einer ISR auf Assembler Ebene auch immer das Statuswort
>> sichern, weil sonst dein Hauptprogramm ins Schleudern kommt.
>
> Nein. Das gilt nur, wenn es überhaupt ein "Hauptprogramm" gibt.

Du hast ja auch wieder nur das zitiert, was dir gepasst hat. Lies 
einfach mal weiter:

Matthias S. schrieb:
> Im Moment
> noch nicht wichtig, weil deine Hauptschleife leer ist, aber sobald da
> was passiert, zerstört dir die ISR den SREG Wert.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das Sreg ist das Byte, wo die Status-Flags enthalten sind.
Wenn Du im ISR z.B. mit einem INC auf Null überläufst, wird Z gesetzt, 
sonst gelöscht.

Wenn Du im Hauptprogramm z.B. einen Test (TST Rd) hast, wird Z,N,V dort 
verändert.
Nun schlägt der Interrupt zu (zwischen Test und Prüfung) und verbiegt 
Dir die Flags.
Dein jetzt folgender Test im Hauptprogramm schlägt fehl oder macht Mist 
- und Keiner weiß, warum - kommt ja nur ab und zu vor ... man mag dann 
sogar die Mondphasen dafür verantwortlich machen :)

Selber nutze ich ein Register als itemp (Temp Interrupt, Register 
16-31), lese darin das Sreg ein und pushe Das auf den Stack, oder nehme 
ein eigenes Register und nenne es rSreg - wird auch nur in den ISR 
benutzt, um das Sreg zu sichern.

Zurück zu Deinem Programm:
Liegt das Signal am richtigen Pin an?
In der Versuchsschaltung gerne erst auch mit Vss und Vdd probieren, ob 
das Kerlchen überhaupt reagiert.

MfG

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.