Forum: Mikrocontroller und Digitale Elektronik ATTiny13A ADC - Was ist falsch im Code?


von Alex (Gast)


Lesenswert?

Hallo Community,
ich habe ein kleines Board mit einem ATTiny13, dessen ADC3 ich gerne 
verwenden würde. nun bin ich noch nicht allzu erfahren mit den ATMega 
ADC und frage mich nun, was im Code falsch ist.

Ziel sollte sein:
- ADC enablen und starten, Auto-Trigger ein, ADC-wert linksbündig, damit 
ich nur ADCH auslesen muss.Vref = Vin
- ADMUX auf ADC3 (PB3)
- Analog-Digitalwandlung im Free-Running-Mode

ADC-Wert = Vin/Vref * 1024.
Wenn ich nun nur ADCH verwende ist durch Verzicht auf die letzen beiden 
Bits
ADC = Vin/Vref * 256 oder nicht?

Überprüfen wollte ich das ganze durch die kleine if-Abfrage:
Ich möchte den PB3 per Hand (draht) auf high setzen  (dann sollte der 
ADC wert ja weit über der Schwelle von 128 sein) - dann soll die LED 
leuchten. Tut sie aber nicht.
Vertausche ich die inhalte der if/else bedingung leuchtet sie 
durchgängig, ich lande also immer in der else schleife.
1
Pinbelegung
2
           ==============          === 
3
          (PB5)   1   8   Vcc                    
4
  AN (Sonar)-ADC3  (PB3)   2   7   (PB2), 
5
  POTI    -ADC2  (PB4)___3   6___(PB1), LED
6
                      GND   4   5   (PB0), PWM (OC0A)
7
            
8
            */
9
10
11
#include <stdbool.h>
12
#include <stdlib.h>
13
#include <stdint.h>
14
15
#include <avr/io.h>
16
#include <avr/interrupt.h>  
17
18
#define F_CPU 9.6E6        
19
#include <util/delay.h>    
20
21
22
23
int main(void) 
24
{        
25
  
26
  DDRB  = 0b11100111;   
27
    PORTB = 0b11100000;
28
29
 
30
31
  // ADMUX auf ACDC3 stellen (Bit1:0 = 11), für ADC2: 10; VCC als Referenz, Bit 5: ADLAR = 1 linksbündig - nur aus ADCH ablesen
32
  ADMUX = 0b00100011;
33
34
  // ADC Control and Status Register A: Bit7=1: ADC Enable | Bit 6=1: ADC Start Conversion 
35
  // Bit 5=1: Auto Trigger Enable | Bit4=1: ADC Interrupt Flag | Bit 3:=1: ADC Interrupt Enable
36
  ADCSRA= 0b11100000;
37
38
  // DCSRB Control and Status Register B - Bi2:1 = 000: Free Running
39
  ADCSRB= 0b00000000;
40
41
  int adc =0;
42
                            
43
   while (1)
44
  {
45
    
46
    adc = ADCH;
47
48
    if (adc>128)
49
    {
50
      PORTB = 0b11100011;
51
      _delay_ms(400);
52
53
    }
54
    else
55
    {
56
      PORTB = 0b11100000;
57
      _delay_ms(400);
58
    }
59
    
60
61
  }
62
                                              
63
  return 0;                        
64
}

Wo liegt der fehler? Danke für jede hilfe!

Grüße

Alex

von Juergen G. (jup)


Lesenswert?

Dein AVR wird mit diesem Code nicht laufen.

Bit 3:=1: ADC Interrupt Enable

Wenn Du den Interrupt aktivierst musst Du auch die notwendige ISR dafuer 
schreiben.
Machst Du das nicht rebootet dein AVR staendig.

Ju

von Alex (Gast)


Lesenswert?

Hallo Jürgen,
es muss doch möglich sein den Tiny im FreeRunning Modus ADCWandeln zu 
lassen ohne eigens Interrupt-Routinen dazu zu schreiben oder sehe ich 
das falsch?

Was müsste denn in der Routine stehen?
Ich bin momentan an der Stelle noch aufgeschmissen..

Ich will ja lediglich immer mal wieder aktuelle ADCWerte aus dem ADCH 
holen und damit arbeiten... muss ich dann jedes mal das ADC Start 
Conversion Bit setzen - würde das gehen?

Viele Grüße

Alex

von Spess53 (Gast)


Lesenswert?

Hi

Mit 9,6MHz ADC-Takt wirst du kaum brauchbare Ergebnisse erzielen.

MfG Spess

von Alex (Gast)


Lesenswert?

Hallo Spess - Also den Prescaler ADPS vom ADC auf max (128)?

Mir würde sehr helfen was ich konkret ändern soll - oder ein 
Codebeispiel für den Tiny13 mit funktionierendem ADC... zu viele 
Möglichkeiten für mich hier! :)

von Alex (Gast)


Lesenswert?

kann mir niemand weiterhelfen?

Bisher habe ich aus den Antworten für mich nur herausgelesen:

1. 9,6MHz ist zu schnell. Wenn ich den maximalen ADC Prescaler (128) 
ansetze - geht das dann?
2. ADC Interrupt Enable (Bit3 im ADCSRA) benötigt eine Interruptroutine, 
sonst startet der µC ständig neu. Nun habe ich das bit ja extra nicht 
gesetzt, weil ich gehofft habe, der free-running-mode im ADCSRB erledigt 
das für mich...

weitere tips wären großartig!
Grüße

von Nico (nico123)


Lesenswert?

Warum liest Du dir denn nicht mal das Kapitel vom ADC im Datenblatt 
durch, da werden alle deine Fragen erklärt?!

von Norbert (Gast)


Lesenswert?

Alex schrieb:
> 1. 9,6MHz ist zu schnell. Wenn ich den maximalen ADC Prescaler (128)
> ansetze - geht das dann?

Einfach mal 9,6MHz durch 128 teilen und im Datenblatt überprüfen ob du 
damit im gültigen Bereich landen würdest.

> 2. ADC Interrupt Enable (Bit3 im ADCSRA) benötigt eine Interruptroutine,
> sonst startet der µC ständig neu. Nun habe ich das bit ja extra nicht
> gesetzt, weil ich gehofft habe, der free-running-mode im ADCSRB erledigt
> das für mich...

Du brauchst nur dann eine ISR wenn du das "ADC Interrupt Enable" Bit 
gesetzt hast.

Hast du nicht, also brauchst du nicht!

von Alex (Gast)


Lesenswert?

Hallo Norbert, dankesehr!
Habe den Prescaler auf 128 gesetzt, was einen ADC Tackt von 75kHz 
ergibt. Ist nach Datenblatt zulässig sind 50-200kHz - und:
Es scheint zu funktionieren!
Herzlichen Dank! :)

Nico ... schrieb:
> Warum liest Du dir denn nicht mal das Kapitel vom ADC im Datenblatt
> durch, da werden alle deine Fragen erklärt?!

Ja, so ist das ja immer. Eigentlich brauch man ja immer nur ein Buch, da 
steht nämlich alles drin. Wieso gibts dann eigentlich Schule und Unis?
Grade wenn man neu in einem Thema ist gilt es doch bei Inhalten Spreu 
vom Weizen zu trennen, da helfen einem solche Beiträge dann nicht.

von Cyblord -. (cyblord)


Lesenswert?

Alex schrieb:

> Ja, so ist das ja immer. Eigentlich brauch man ja immer nur ein Buch, da
> steht nämlich alles drin. Wieso gibts dann eigentlich Schule und Unis?
> Grade wenn man neu in einem Thema ist gilt es doch bei Inhalten Spreu
> vom Weizen zu trennen, da helfen einem solche Beiträge dann nicht.

Das Datenblatt ist deine Bibel. Da gibts keine Spreu, nur Weizen. Und da 
drinn steht alles schön in Prosa. Also komm uns doch jetzt nicht mit so 
nem Quatsch. Niemand muss auf ne Uni um einen AVR zu programmieren, aber 
lesen sollte man halt können. Und es nervt, wenn im Datenblatt alles 
ausführlich steht aber dann trotzdem genau diese Fragen hier gestellt 
werden. Dann soll also der hilfsbereite Leser hier selbst ins Datenblatt 
gucken damit du es nicht musst?

gruß cyblord

von Alex (Gast)


Lesenswert?

ach schade, irgendwie immer das selbe problem. ich habe mir das 
komplette kapitel des AVR zum ADC doch durchgelesen! woher sonst hätte 
ich denn die register soweit wie ich sie nun belegt hab setzen können?
Trotzdem weiß man - wenn man es noch nie getan hat - zB nicht, ob im 
Prosatext des ADC ...

"Using the ADC Interrupt Flag as a trigger source makes the ADC start a 
new conversion as soon as the ongoing conversion has finished. The ADC 
then operates in Free Running mode, constantly sampling and updating the 
ADC Data Register."

... bedeutet, dass man die interrupts enable bits setzen muss für den 
free-running mode! so sieht es nämlich aus, wenn man das liest - 
faktisch ist es aber nicht so, wie ich jetzt herausgefunden habe (danke 
eben auch an die hilfsbereiten Leser, die mir dann etwas zum flag 
geschrieben haben!).

Ob es dann ausreicht die Bits für den Trigger Select im ADCSRB zu setzen 
- oder eben auch noch interrupts zu enablen (könnte ja sein dass der 
free running mode so funktioniert, siehe text oben)- das weiß man nur, 
wenn man es eben weiß.

Ich behaupte ja auch gar nicht, dass man (ich) nichts ÜBERliest. Auch 
dann helfen kommentare, wie zB die zum ClockSpeed.

Deshalb erspar mir doch bitte DEINEN quatsch. hier wird immer sofort so 
getan, als ob man der hirnloseste und faulste typ wär der alles erledigt 
bekommen will ohne selbst einen finger krumm zu machen. die attitüde 
stinkt.

Egal, - Closed - für mich, danke an alle, die trotz meiner unglaublichen 
faulheit trotzdem geholfen haben - die haben mir nämlich WIRKLICH 
geholfen.

von Cyblord -. (cyblord)


Lesenswert?

Alex schrieb:

> "Using the ADC Interrupt Flag as a trigger source makes the ADC start a
> new conversion as soon as the ongoing conversion has finished. The ADC
> then operates in Free Running mode, constantly sampling and updating the
> ADC Data Register."
>
> ... bedeutet, dass man die interrupts enable bits setzen muss für den
> free-running mode! so sieht es nämlich aus, wenn man das liest -
> faktisch ist es aber nicht so, wie ich jetzt herausgefunden habe (danke
> eben auch an die hilfsbereiten Leser, die mir dann etwas zum flag
> geschrieben haben!).

Wieso sieht das SO aus? Das steht doch alles haarklein da.
Es gibt ein Interrupt-FLAG (ADIF) und ein Interrupt-Enable-Bit (ADIE). 
Der Free-Running-Mode wird durch das FLAG getriggert, so wies oben halt 
auch steht. Damit aber auch wirklich eine ISR angesprungen wird, muss 
das Interrupt Enable Flag gesetzt sein. Und falls dann gar keine ISR 
vorhanden ist, dann ist essig. Aber beide Bits sind unabängig und tun 
andere Dinge. Wenn du also WIRKLICH gelesen hättest, dann wüsstest du 
dass das Flag immer gesetzt wird, unabhängig ob das Interrupt Enable Bit 
gesetzt ist.

Dein Problem ist halt auch, du phantasierst dir was zusammen was da gar 
nicht steht.


gruß cyblord

von Juergen G. (jup)


Lesenswert?

cyblord ---- schrieb:
> Dein Problem ist halt auch, du phantasierst dir was zusammen was da gar
> nicht steht.

Wenn man tagtaeglich Datenblaetter liest, kann man vielleicht nicht 
verstehen das es Leute gibt die mit dem normalen Schulenglisch Probleme 
bei der Iterpretation eines Technischen Datenblattes haben.

Also cyblord, mal ein bisschen mehr Wuerde zeigen.

@Alex
Freut mich das Du es hinbekommen hast.

Die ADC-ISR zusammen mit gesetztem ADIE kannst Du zBsp dazu benutzten um 
zu wissen wann ein neuer Wert im ADCH steht, und nur in der ADC-ISR 
schreibst Du dann den Wert aus ADCH in Deine adc Variable.

Ju

von Cyblord -. (cyblord)


Lesenswert?

Juergen G. schrieb:

> Also cyblord, mal ein bisschen mehr Wuerde zeigen.
Wie darf ich das verstehen?

Aber solange das schimpfen auf die unverständlichen Datenblätter 
würdevoll ist...

gruß cyblord

von Juergen G. (jup)


Lesenswert?

@cyblord
Da ist geschimpft worden, da hast Du vollkommen Recht.
Aber ueber Deinen Post.

Da hat niemand ueber die Datenblaetter geschimpft.

Da gab es weiter oben jemanden der Datenblaetter als Prosa bezeichnet 
hat, und jemanden der darauf geantwortet hat das er die Datenblaetter 
nicht als Prosa empfindet.

Wo ist da ueber Datenblaetter geschimpft worden.

von Cyblord -. (cyblord)


Lesenswert?

Juergen G. schrieb:
> Wo ist da ueber Datenblaetter geschimpft worden.

Hier z.B.:

> bedeutet, dass man die interrupts enable bits setzen muss für den
> free-running mode! so sieht es nämlich aus, wenn man das liest -
> faktisch ist es aber nicht so

Das Datenblatt muss schuld sein, wenn der Leser es nicht versteht.
So kommt das rüber. Und Fakt ist nunmal, der TE kapiert das Datenblatt, 
trotz lesen, nicht. Und das hab ich gesagt. Mehr nicht. Aber so ists 
leider.

> Da gab es weiter oben jemanden der Datenblaetter als Prosa bezeichnet
Nö, ich hab gesagt, da stehen Beschreibungen in Prosa drinne. Und auch 
das ist nunmal ein Fakt, oder willst du das jetzt bestreiten? Da stehen 
ganz normale Texte drinne, die man halt lesen muss. Das war meine 
Aussage.


gruß cyblord

von Juergen G. (jup)


Lesenswert?

Interpretationssache!

von Norbert (Gast)


Lesenswert?

Wir, die wir täglich Datenblätter lesen, geht das 
Verstehen/Interpretieren der dort zweifellos reichlich vorhandenen 
Informationen sehr einfach von der Hand.

Wenn aber jemand viellecht gerade mit der µC Programmierung anfängt, 
können einen diese Datenblätter Inhalts- und auch Mengenmäßig 
erschlagen.

Wenn aus der Fragestellung des OP und seiner bereits geleisteter 
Vorarbeit hervorgeht, das er sich durchaus mit dem Thema beschäftigt 
hat, sehe ich keinen Grund warum wir nicht mit ein oder zwei kurzen Tips 
mal aushelfen.

Manchmal ist ja das Problem - wie hier auch - schon zu 99% gelöst und es 
braucht nur einen winzigen Stubser in die richtige Richtung.

von Eumel (Gast)


Lesenswert?

Norbert hat recht. Der Threadersteller ist offensichtlich nicht faul 
sondern tut sich am Anfang noch etwas schwer. Da muss man nicht maulen 
sondern kann helfen. Wenn man nicht helfen will sollte man sich einfach 
raushalten.

von Alex (Gast)


Lesenswert?

Juergen G. schrieb:
> Die ADC-ISR zusammen mit gesetztem ADIE kannst Du zBsp dazu benutzten um
> zu wissen wann ein neuer Wert im ADCH steht, und nur in der ADC-ISR
> schreibst Du dann den Wert aus ADCH in Deine adc Variable.

Hallo Jürgen,
vielen Dank für die Info, das erklärt mir einiges und bringt mich gleich 
auf eine Idee...! :)

Und danke für das "backup" der anderen. ich würde mir einfach wünschen, 
dass leute, die fragen wie meine "aufregen" sich einfach nicht zu wort 
melden, das erspart (mindestens) zwei leuten einen höheren blutdruck und 
zeit. tatsächlich war es nämlich nicht meine (bewusste oder unbewusste) 
Absicht deine Zeit und Laune zu beanspruchen cyblord - sondern nur die 
von denen, die halt gerade lust und nachsicht haben zu helfen.


zu der sache mit dem schulenglisch:
Sicherlich ist das ein Punkt, in dem man Nachsicht zeigen kann.
Aber auch zum tatsächlichen Inhalt (mein Englisch ist eigentlich um 
einiges besser als Schul-Englisch):

Ich meine das ganze wäre sinngemäß einigermaßen richtig übersetzt mit

"Using the ADC Interrupt Flag as a trigger source makes the ADC start a
new conversion as soon as the ongoing conversion has finished. The ADC
then operates in Free Running mode, constantly sampling and updating the
ADC Data Register."
============
"benutzt man den ADC Interrupt Flag als Trigger-Source führt das dazu, 
dass der ADC nach einer laufenden Wandlung direkt eine neue startet. Der 
ADC arbeitet dann im Free-Running-Modus, in dem er durchgägnig sampled 
und das ADC Daten-Register neu beschreibt."

ich verstehe jetzt (mit dem hier erhaltenen vorwissen!), dass man das 
auch so deuten kann, dass man einen zweiten freerunning mode erzeugen 
kann, indem man die triggersource eben auf den interrupt flag setzt. 
dass das aber nicht der selbe free-running mode ist, wie ich ihn 
bekomme, wenn ich eben die TS-Bits auf "000 (=free running)" setze und 
die interrupts beiseite lasse, geht daraus aber nicht direkt hervor! 
Wenn doch: Bitte zeigen und erklären (aus dem grund dass ich dann 
offensichtlich doch noch ordentlich an meinem englisch feilen kann)...

In dem sinne (daher eigentlich mein ganzes Geschreibe) nochmal: Ich 
finde es hilft allen, ein bisschen Nachsicht walten zu lassen - 
vielleicht schon deshalb weil man nur durch die eigene perspektive (und 
eigenem Kontext wie Vowissen) menschen unrecht tun kann und sich dann 
noch (umsonst) aufregt... und ob die zeit dann besser investiert ist 
weiß ich nicht.

Herzlichen Dank an alle für die hilfe!
Grüße

von Cyblord -. (cyblord)


Lesenswert?

Alex schrieb:

> "Using the ADC Interrupt Flag as a trigger source makes the ADC start a
> new conversion as soon as the ongoing conversion has finished. The ADC
> then operates in Free Running mode, constantly sampling and updating the
> ADC Data Register."
> ich verstehe jetzt (mit dem hier erhaltenen vorwissen!), dass man das
> auch so deuten kann, dass man einen zweiten freerunning mode erzeugen
> kann, indem man die triggersource eben auf den interrupt flag setzt.
> dass das aber nicht der selbe free-running mode ist, wie ich ihn
> bekomme, wenn ich eben die TS-Bits auf "000 (=free running)" setze und
> die interrupts beiseite lasse, geht daraus aber nicht direkt hervor!
> Wenn doch: Bitte zeigen und erklären (aus dem grund dass ich dann
> offensichtlich doch noch ordentlich an meinem englisch feilen kann)...

Es gibt nur einen Free-Running-Mode. Woher kommt bei dir denn nun ein 
Zweiter? ADTS=0=Free-Running-Mode setzt die Trigger-Source des ADC, auf 
das ADIF-Bit. Darum wird er sofort nach jeder Messung wieder getriggert 
und misst ständig. Nen anderen Free-Running-Mode gibts nicht und wird 
auch nirgends im Datenblatt erwähnt. Es wird allerdings mehrmals 
derselbe im Datenblatt erwähnt. In dem Text oben, wird dir erklärt, wie 
der Free-Running-Mode funktioniert. Damit du weißt, warum er tut was er 
tut, wenn du ADTS=0 einstellst (und ADATE setzt). Die Bezeichnung 
"Free-Running-Mode" ist also im Grunde nur eine Verbildlichung für "ADC 
Trigger Source = ADIF-Bit".

Aber genau das meine ich, du liest dauernd irgendwas was da nicht steht.




gruß cyblord

von chris (Gast)


Lesenswert?

Hier ist ein funktionierendes Beispiel für den Attiny13 ADC:
http://www.hobby-roboter.de/forum/viewtopic.php?f=5&t=137&p=547

von Alex (Gast)


Lesenswert?

@chris:
Dankesehr! :)

von Beobachter (Gast)


Lesenswert?

Gibt es eigentlich hier im Forum eine Filterfunktion mit der man alle 
Beiträge von cyblord einfach ausblenden kann?

von Buna-Pelzer (Gast)


Lesenswert?

Beobachter schrieb:
>Gibt es eigentlich hier im Forum eine Filterfunktion mit der man alle
>Beiträge von cyblord einfach ausblenden kann?

Es gibt eine Möglichkeit:
Beitrag "Re: neues Design?"

mit Firefox.

Damit kann man sich wunderbar Schwätzer vom Leib halten.

Gruß
Buna-Pelzer

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

Nun ist nichts passiert seit diesem Thread - und ich bin mit meiner IP 
auf der Foren-Spamliste gelandet.

Was davon ist jetzt richtig:
1. Meine Frage war zu dumm und gilt deshalb als Spam oder
2. Man sollte cyblord nicht wiedersprechen?

von Cyblord -. (cyblord)


Lesenswert?

Alex V. l. schrieb:
> Was davon ist jetzt richtig:

> 2. Man sollte cyblord nicht wiedersprechen?
Das gilt sowieso.

Aber mal ehrlich, ich habe versucht dir den Free-Running-Mode zu 
erklären. Wo jetzt dein Problem mit mir liegt weiß ich nicht. Ich kann 
dir den Mode ja schlecht vortanzen.

gruß cyblord

von Alex V. (bastel_alex) Benutzerseite


Lesenswert?

cyblord ---- schrieb:
> Das gilt sowieso.
:D

gar kein persönliches problem, es gab nur die zwei möglichkeiten die mir 
eingefallen sind!
Also dann wohl 1.? ;-)

Grüße

Alex

von Juergen G. (jup)


Lesenswert?

Ich haeng mich da noch mal rein.
Das eigentliche Problem ist ja geloest, daraus ist aber ein weiteres 
hervorgegangen.

Ich verweise hier noch mal auf den Post von Norbert

Norbert schrieb:
> Wir, die wir täglich Datenblätter lesen, geht das
> Verstehen/Interpretieren der dort zweifellos reichlich vorhandenen
> Informationen sehr einfach von der Hand.
>
> Wenn aber jemand viellecht gerade mit der µC Programmierung anfängt,
> können einen diese Datenblätter Inhalts- und auch Mengenmäßig
> erschlagen.
>
> Wenn aus der Fragestellung des OP und seiner bereits geleisteter
> Vorarbeit hervorgeht, das er sich durchaus mit dem Thema beschäftigt
> hat, sehe ich keinen Grund warum wir nicht mit ein oder zwei kurzen Tips
> mal aushelfen.
>
> Manchmal ist ja das Problem - wie hier auch - schon zu 99% gelöst und es
> braucht nur einen winzigen Stubser in die richtige Richtung.

Full ACK on that.

Da braucht keiner tanzen, aber vielleicht ein bisschen Empathy.

@Alex,
Wenn Du auf der Spam Liste gelanded bist, dann schreib das doch einem 
Mod.
Die sollten wissen was da zu tun ist und koenne vielleicht erklaeren 
warum Du da gelandet bist.
Ich jedenfalls bin nicht der Meinung, das dieser Thread dazu reicht 
jemanden auf die Spam Liste zu setzten.

Ju

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.