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.
Sicher, dass die Verdrahtung stimmt, auch das Programmiergerät abgezogen? Das Programm sieht eigentlich gut aus.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.