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)18Vcc
4
AN(Sonar)-ADC3(PB3)27(PB2),
5
POTI-ADC2(PB4)___36___(PB1),LED
6
GND45(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
intmain(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
intadc=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
return0;
64
}
Wo liegt der fehler? Danke für jede hilfe!
Grüße
Alex
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
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
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! :)
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
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!
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.
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
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.
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
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
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
@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.
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
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.
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.
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
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
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
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?
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
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
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