Forum: Mikrocontroller und Digitale Elektronik [gelöst] Starten des ADC bei AVR (ATtiny45) seltsam


von Lenny G. (e_lenny)


Lesenswert?

Hi,

ich habe ein seltsames Problem beim Starten des ADC bei meinem ATtiny45. 
Nach dem Einschalten starte ich eine Wandlung und will dann einen 
Dummy-Read machen, wie es auch im mikrocontroller.net-Tutorial 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe) 
beschrieben ist.
Zwischen PB1 und PB2 hängen 2 antiparallele LEDs. Mit PORTB = 1 leuchtet 
LED1, mit PORTB = 2 leuchtet LED2.
1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
4
int main(void)
5
{
6
  DDRB = 0b00000011;
7
  PORTB = 2;                             // kritische Zeile
8
9
  ADMUX   = (1 << MUX1) | (1 << MUX0);   // V_CC als Referenz (A_REF nicht verbunden), PB3 als Input
10
  ADCSRA  = (1 << ADPS2) | (1 << ADPS1); // Prescaler auf 64 setzen (ergibt Samplerate von 125 kHz)
11
  ADCSRA |= (1 << ADEN);                 // ADC einschalten
12
  ADCSRA |= (1 << ADSC);                 // Wandlung starten
13
14
  while (ADCSRA & (1<<ADSC));            // warten, bis Wandlung beendet (ADSC zurückgesetzt)
15
  (void) ADC;                            // Dummy-Read
16
17
  PORTB = 1;                             // LED1 anschalten
18
  while(1);
19
}

Jetzt das Seltsame: Ohne die kritische Zeile leuchtet keine LED, der 
Controller bleibt in der ADC-Warteschleife hängen. Setzt man in der 
kritischen Zeile PORTB auf Werte wie 0, 4, 8 oder 16, passiert dasselbe. 
Setze ich PORTB allings auf 1, 2, 3, 5 oder irgendeinen Wert, bei dem 
PB1 oder PB2 auf 1 gesetzt werden, funktioniert alles wie gewünscht und 
am Ende leuchtet brav die LED1.
Die Wandlung funktioniert also nur, wenn mindestens einer der 
Ausgangspins auf 1 gesetzt wird! Hat einer von euch dafür eine 
Erklärung?

Fuses sind E:FE, H:DF, L:E2.
Makefile:
1
PROGRAMMER = avrisp2
2
CPU_GCC = attiny45
3
CPU_DUDE = t45
4
5
F_CPU = 8000000
6
7
CDEFS = -DF_CPU=$(F_CPU)
8
CFLAGS = -mmcu=$(CPU_GCC) $(CDEFS) -Wall -Os -DSTARTERKIT
9
10
.phony: clean
11
12
all: fftest.hex
13
14
program: fftest.hex
15
  avrdude -c $(PROGRAMMER) -P usb -p $(CPU_DUDE) -U flash:w:fftest.hex
16
17
clean:
18
  rm *.o *.elf *.hex
19
20
fftest.hex: fftest.c
21
  avr-gcc $(CFLAGS) -c fftest.c -o fftest.o
22
  avr-gcc $(CFLAGS) fftest.o -o fftest.elf
23
  avr-objcopy -R .eeprom -O ihex fftest.elf fftest.hex

Ich bin µC-Anfänger, also seid lieb zu mir. :D

von der alte Hanns (Gast)


Lesenswert?

>Zwischen PB1 und PB2 hängen 2 antiparallele LEDs. Mit PORTB = 1 leuchtet
>LED1, mit PORTB = 2 leuchtet LED2.

Zwischen? Dann leuchtet LED1 bei PB2=1 und PB1=0, d.h. PORTB=4, sowie 
LED2 bei PB2=0 und PB1=1, d.h. PORTB=2 (oder umgekehrt).

(Ohne dass ich jetzt den ganzen Rest des Textes lesen&verstehen will).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lenny G. schrieb:
> Zwischen PB1 und PB2 hängen 2 antiparallele LEDs. Mit PORTB = 1 leuchtet
> LED1, mit PORTB = 2 leuchtet LED2.

 Wenn es PB1 und PB2 sind, was hat die 1 da zu suchen ?
 Mit 1 schaltest du PB.0

von Thomas E. (thomase)


Lesenswert?

Lenny G. schrieb:
> ich habe ein seltsames Problem beim Starten des ADC bei meinem ATtiny45.
Seltsame Probleme sitzen immer vor dem PC.

Lenny G. schrieb:
> Ich bin µC-Anfänger, also seid lieb zu mir. :D
Nein.

Was soll das?
Lenny G. schrieb:
>   PORTB = 2;

Warum schreibst du hier nicht "PORTB = (1 << PB2);"?

Genauso wie hier:

Lenny G. schrieb:
> PORTB = 1;                             // LED1 anschalten

Dann passiert dir auch so ein Scheiss nicht:

Marc Vesely schrieb:
> Wenn es PB1 und PB2 sind, was hat die 1 da zu suchen ?
>  Mit 1 schaltest du PB.0

oder hier:
> DDRB = 0b00000011;
Das betrifft auch PB0 und PB1.

mfg.

von Lenny G. (e_lenny)


Lesenswert?

Meine Güte, zerreißt euch doch nicht gleich das Maul, nur weil ich mich 
vertippt habe!
Die LEDs hängen selbstverständlich zwischen PB0 und PB1, nicht zwischen 
PB1 und PB2 ...

Also, vllt hat jemand freundlichere (und hilfreichere) Ratschläge zu dem 
Problem?

von c-hater (Gast)


Lesenswert?

Lenny G. schrieb:

> Also, vllt hat jemand freundlichere (und hilfreichere) Ratschläge zu dem
> Problem?

Das Problem dürfte mit der Stromversorgung der Controllers 
zusammenhängen.

Vermutlich klappt es auch, wenn du einfach eine zusätzliche LED zwischen 
VCC und GND betreibst und dann wird auch deine "kritische" Zeile nicht 
mehr kritisch sein.

Wenn das so ist, dann darfst du hier den Schaltplan veröffentlichen, der 
zeigt, wie du derzeit deinen Controller betreibst. Der dürfte einiges 
Potential für Verbesserungsvorschläge enthalten.

von Dirk K. (dekoepi)


Lesenswert?

100nF Abblockkondensator hast du eingelötet?

Außerdem solltest du für die PORTB-Zuweisung dieselbe Notation verwenden 
wie in deinem Richtungsregister. Dann siehst du sofort, warum deine 
"wild gewählten Zufallszahlen" auch komische Ergebnisse liefern.

Die LEDs sollten jeweils leuchten, wenn du:
PORTB = 0b00000010;
oder
PORTB = 0b00000001;

entsprechend Dezimal 1 oder 2 setzt. Vorwiderstände korrekt berechnet 
mit der Versorgungsspannung und Durchlassspannung? Wenn zuwenig Strom 
ankommt, kann die LED nicht leuchten. Sind die heile, beim Test direkt 
mit Vorwiderstand und Speisung sind beide LEDs auch heil?

von Lenny G. (e_lenny)


Angehängte Dateien:

Lesenswert?

Die zusätzliche LED zwischen V_CC und GND hat nicht geholfen. Ich 
betreibe die Schaltung über USB, ein 100-nF-Ceramic sitzt direkt am 
V_CC-Pin des Controllers.

Dirk K. schrieb:
> Außerdem solltest du für die PORTB-Zuweisung dieselbe Notation verwenden
> wie in deinem Richtungsregister. Dann siehst du sofort, warum deine
> "wild gewählten Zufallszahlen" auch komische Ergebnisse liefern.
Keine Ahnung, was du damit meinst. Es sollte doch kein Problem sein, 
wenn ich schreibe
1
DDRB = 0b00000011;
2
PORTB = 1;
Wäre mir neu, dass man das einheitlich machen muss. Die Zahlen sind auch 
keineswegs zufällig, die Systematik ist oben erklärt.

Der Schaltplan zeigt dir die Vorwiderstände. Wie bereits gesagt, mit der 
kritischen Zeile drin funktioniert es ja, die LEDs sind nicht kaputt.

Allerdings tritt das Problem nicht auf, wenn ich den Controller auf dem 
Breadboard betreibe und bis auf die LEDs die restliche Beschaltung 
weglasse. Ich probiere mal noch etwas rum ...

von Adi Positas (Gast)


Lesenswert?

Lenny schrieb:
>Meine Güte, zerreißt euch doch nicht gleich das Maul, nur weil ich mich
>vertippt habe!

Das ist hier die Regel, weil das mittlerweile ein Haifischbecken 
geworden ist.

Überlies die unsachlichen Beiträge, antworte nicht darauf, sonst ist der
Thread in NullkommaNichts von Mist geflutet und Du bekommst keine
brauchbare Antwort mehr.

Adi

von Lenny G. (e_lenny)


Lesenswert?

Hatte den Thread schon wieder ganz vergessen, sorry.

Das Problem war der Pull-up am Reset-Pin. Ich wollte mit einem 470k 
(siehe Schematic oben) besonders sparsam sein ... eine Größenordnung 
kleiner hat das Problem gelöst.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lenny G. schrieb:
> Das Problem war der Pull-up am Reset-Pin. Ich wollte mit einem 470k
> (siehe Schematic oben) besonders sparsam sein ... eine Größenordnung
> kleiner hat das Problem gelöst.

 Ähem.
 Sehr unwahrscheinlich, aber wenn du es so sagst...

von Lenny G. (e_lenny)


Lesenswert?

Ja, kein Plan, was soll ich sagen? Das war wirklich das einzige, was ich 
geändert habe (Pull-up rausgelötet, anderen rein) und es ging alles wie 
gewünscht ...

von Myxo M. (myxom)


Lesenswert?

Danke Lenny für dein Feedback.

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.