Frage zum ADC am AtTiny45

Gast #4889499
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
Angehängte Dateien:
Gast #4889508
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.
Gast #4889539
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.
Gast #4889563
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
Gast #4889719
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...
Gast #4889745
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."
(Firma: matzetronics) #4889784
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.
Gast #4889841
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...
(Firma: matzetronics) #4890158
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.
#4890259
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren