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
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.
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?
loko schrieb: > Wo? Aber nicht für den Attiny45, oder? Steht hier http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC unter Punkt Referenzspannung AREF
VIA schrieb: > -> Wenn eine interne VREF (1.1V / 2.56V) verwendet wird, muss der > AREF-Pin mit einem Kondensator beschaltet werden. nein!
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?
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.
@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
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...
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...
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
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."
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.
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...
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 !!
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.