Hey Allerseits,
hat eventuell einer von euch eine Idee, warum ich immer 0 vom ADC
zurückbekomme? (OSZI und Multimeter zeigen 0.08V direkt am pin PB4 =>
ADC-Wert sollte also 80 sein...)
1
/*
2
* InPlugV1_ATTINY13.c
3
*
4
* Created: 21.10.2012 13:08:11
5
* Author: Roland Blank
6
*/
7
8
9
10
// Definitionen
11
#define F_CPU 9600000 // Frequenze des Controllers
// Den ADC initialisieren und einen sog. Dummyreadout machen
72
ADCSRA|=(1<<ADSC);
73
while(ADCSRA&(1<<ADSC));
74
75
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
76
// und dann Durchschnittswert ausrechnen.
77
for(i=0;i<3;i++){
78
// Eine Wandlung
79
ADCSRA|=(1<<ADSC);
80
// Auf Ergebnis warten...
81
while(ADCSRA&(1<<ADSC));
82
83
result+=ADCW;
84
}
85
86
// ADC wieder deaktivieren
87
ADCSRA&=~(1<<ADEN);
88
89
result/=3;
90
91
returnresult;
92
}
Könnte es ein Problem sein, dass ich Debugwire aktive habe und den
Controller mittels ICE3 + SPI/Debugwire programmiere/debugge?
Vielen Dank für eueren reichhaltigen Erfahrungsschatz :D
Gruß
Roland
@Eumel: Die erste Convertierung wird jeweils nicht ausgewertet, dass
Problem kann also nicht hier liegen...
@katastrophenheinz: Ja, die interne Referenz soll 1,1V sein...
Hi,
Das hilft die jetzt auch nur bedingt weiter:
Bei mir läuft dein Code. Hab ich zwar nicht auf nem ATtiny ausprobiert,
sondern mit nem ATmega. Kommt genau das raus, was rauskommen soll. Der
erste Wert weicht gering von den beiden folgenden ab, das liegt m.E.
daran, dass die Wartezeit nach ADEN=1 zu kurz ist.
Zurück zu deinem Problem: Gibts beim ATtiny vllt. noch irgendein
Register, mit dem man den ADC global anfeuern muss ?
Hi,
ich würde nochmal folgendes ausprobieren:
1) in readADC zuerst ADMUX schreiben, dann ADCSRA ( so stehts im manual
)
2) während der Initialisierung den digitalen Modus von PB4 komplett zu
deaktivieren: DIDR0 = ( 1 << ADC2D )
3) Prescaler höher setzen, z.b auf Maximum.
4) nach dem Setzen von ADEN noch mal eine ms warten.
Hi, debugwire: ich denke nicht, da nur die pins miso Mosi sck und Reset
über den 6-poligen Stecker verbunden werden. Pb4 vom attiny13 ist keiner
davon. Nutzt du debugwire, um durch den Code zu Steppen? Ich habe keine
ahnung, wie sich der Adc verhält, wenn man da mit debugwire durchsteppt.
In welcher Umgebung rennt dein attiny? Irgendein protoboard? Pb4 evtl
davon belegt?
hast du die möglichkeit, mit nem anderen atmel Controller, der einen
Uart hat, zu testen?
Hat den Vorteil, dass man nicht nur auf blinkende LEDs starren, sondern
auch mal Text/Werte ausgeben und interaktiv testen kann. Wenn das dann
funzt, dann auf den attiny bringen. Das adc Zeug kann man fast ohne
Anpassung von Typ zu Typ übertragen.
Warum?
Wenn dein Programm z.B. Erst Channel 1 und dann Channel 2 auslesen soll
ließt zu bei der zweiten Wandlung Channel 3 statt 2 aus. Du setz das
ADMUX Register nie zurück, durch "=" statt "|=" wird das Register genau
auf den Wert gesetzt und nicht mit einem möglicherweise falschen Inhalt
verodert.
Positiver Effekt, durch das weggelassene verodern schneller+weniger
Programmspeicher
1
// Jetzt 3x die analoge Spannung and Kanal channel auslesen
2
// und dann Durchschnittswert ausrechnen.
3
for(i=0;i<3;i++){
4
// Eine Wandlung
5
ADCSRA|=(1<<ADSC);
6
// Auf Ergebnis warten...
7
while(ADCSRA&(1<<ADSC));
8
9
result+=ADCW;
10
}
11
12
13
result/=3;
Such dir lieber ne 2^n zahl aus 2,4,8,16,... Teilen im µC ist immer
langwierig und Programmspeicher intensiv bei einer 2^n Zahl ist es eine
einfache Shift-Operation, die geht fix und kostet kaum Speicher.
Wie sich Debugwire auf den adc auswirkt kann ich dir nicht sagen, aber
setzt doch einfach nen Breakpoint nach der ADC-Funktion und schau dir
das Ergebnis an dann sollte es keine Probleme geben.
Gruß Matthias
@Katastrophenheinz: Es ist ein selbsterstelltes Board, welches sehr
klein ist. Mehr als ein OSZI und zwei LEDS steht mir leider nicht zur
Verfügung.
@Matthias: Danke für die Tips, ich habe sie gleich in meinen Code
einfließen lassen. Leider lösen sie auch nicht das Problem.
Ich werde heute mal einen anderen Attiny13A verlöten, vielleicht hat nur
er defekt.
Kann es Schaltungstechnik noch einen Fehler geben, selbst wenn ich
direkt an PB4 mein Signal per OSZI messen kann?
OK, hab das Problem gefunden. Der Controller scheint defekt zu sein.
Nachdem ich einen Neuen eingebaut habe, hat es sofort funktioniert :D
Vielen Dank noch einmal für eure Hilfe!!!