Hallo liebe Community,
ich habe bereits kleine Programme in C geschrieben, aber hier komme ich
einfach nicht weiter; ich möchte den Umgang mit dem ADC des Attiny45
lernen und habe dazu ein Testprogramm geschrieben.
Der ADC soll im Freerunning Mode laufen und in der ISR eine Variable mit
dem Wert des Registers ADCH besetzt werden. Bei Sannungen über 2,5V soll
eine LED an PB0 ein-, unter 2,5V ausgeschaltet werden.
Im fertigen Steckbrett bleibt die LED aber einfach aus; ich habe bereits
die LED an Vcc gehängt, sie funktioniert, auch die an PB2 vom Poti
abgegriffene Spannung stimmt. Der Reset Pin liegt auf Vcc.
Ich gehe daher von einem Fehler im Code aus, finde ihn aber nicht.
Könnt ihr mir helfen?
[c]
#include <avr/io.h>
#include <avr/interrupt.h>
volatile int i = 0;
int main(void)
{
ADMUX |= (0<<REFS0) | (0<<REFS1) | (1<<ADLAR) | (1<<MUX0); //Vcc as
Vref, Value shifted to the left, PinB2 as ADC
ADCSRA |= (1<<ADEN) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS1); //enable
ADC, auto trigger mode, enable ADC interrupts, prescaler = 4
ADCSRA |= (1<<ADSC); //start Conversion
sei(); //allow global interrupts
DDRB = 0x01;
PORTB = 0x00;
while (1)
{
if(i < 128)
{
PORTB = 0x00;
}
else
{
PORTB = 0x01;
}
}
}
ISR(ADC_vect)
{
i = ADCH;
}
[c/]
Hi
ADCSRA:
Bit 5 – ADATE: ADC Auto Trigger Enable
When this bit is written to one, Auto Triggering of the ADC is enabled.
The ADC will start a conversion on a positive
edge of the selected trigger signal. The trigger source is selected by
setting the ADC Trigger Select bits, ADTS in
ADCSRB.
Du benutzt ADCSRB nicht, wo die Triggerquelle eingestellt werden müsste.
Wobei - Kommando zurück -
ADCSRB:
Bits 2:0 – ADTS[2:0]: ADC Auto Trigger Source
If ADATE in ADCSRA is written to one, the value of these bits selects
which source will trigger an ADC conversion.
If ADATE is cleared, the ADTS[2:0] settings will have no effect. A
conversion will be triggered by the rising edge of
the selected Interrupt Flag. Note that switching from a trigger source
that is cleared to a trigger source that is set,
will generate a positive edge on the trigger signal. If ADEN in ADCSRA
is set, this will start a conversion. Switching
to Free Running mode (ADTS[2:0]=0) will not cause a trigger event, even
if the ADC Interrupt Flag is set .
0-0-0 der Free-running-mode wäre, Der hier gewünscht ist.
Sollte also doch passen.
Wird der Interrupt denn laufend ausgelöst?
(Scheint ja nicht so, sonst müsste ja der an PB2 gemessene Wert
übernommen werden).
Lasse im Interrupt das PotoB hochzählen - dann hast Du zumindest 256
Interrupts Zeit, irgendwas zu sehen.
MfG
Dank dir für die Antwort!
Ich verstehe leider nicht ganz, was du mit PotoB hochzählen meinst, und
wie ich dann von außen erkennen könnte, ob der Interrupt ausgelöst
wurde.
Hi
PotoB sollte PortB heißen :/
Ich meine damit, daß Du im Interrupt eine Zahl hochzählen lässt und
Diese auf PortB ausgibst - dadurch 'läuft das Port voll' - der oberste
Pin wackelt mit 127tel des Interrupt-Takt - die LEDs sollten merklich
unterschiedlich hell leuchten bzw. es sollte erst Mal mehr als eine LED
leuchten.
Da schon Meldungen kamen, daß der Code lauffähig ist, vll. doch nur der
Programmer Schuld, daß Es bei Dir nicht so will.
MfG
Danke für eure Antworten, ich habe in der Zwischenzeit mal ein einfaches
Testprogramm geschrieben, welches PortB auf High schaltet, und auch da
hat sich nichts getan. Ihr habt also Recht, es liegt am Programmer oder
am MC. Seltsam, da sich der MC durchaus bei Anschluss an den PC auslesen
lässt. Aber nun weiß ich zumindest, dass mit dem Programm alles stimmt,
danke nochmals für's Testen!
Ich habe bereits neue Attinys bestellt, da dies mein letzter war, und
werde es dann mit den neuen probieren. Ich hätte das viel früher machen
müssen, habe aber den Wald vor lauter Bäumen nicht gesehen...
Freundliche Grüße!
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang