Hallo, Ich möchte gerne ein Poti in den Atmega8a an PC0 (ADC0) einlesen. Und, wenn dieses funktioniert, an PD0 ab einen bestimmten Wert eine Led einschalten.Da ich anfänger bin stellt mich dieses aber vor eine grosse Herrausforderung. -mein erstes Problem ist, das ADATE bit bleibt schwarz (da es warscheinlich anders benannt werden muß)jetzt zeigt er mir natürlich Fehler beim übersetzen an. Wie muss das beim Atmega8A richtig heissen. -Fehler gerade gefunden ADATE Atmega32 ADFR Atmega8 - Aber wie kann ich jetzt mit dem Poti etwas umsetzem zb. wert 800 led an PD0 an wäre um eure hilfe sehr dankbar /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { PORTC = ADCH; } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADATE) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
:
Verschoben durch User
Hallo, ich würde hiemit gerne ein Poti an ADC0 auslesen und an PD0 ein led bei einem Wert von 800 einschalten und bei 1000 wieder aus. könnte mir bitte jemand zeigen oder tips geben wie ich das mit nachfolgenden Code umzusetzen ist? wäre euch sehr dankbar grüsse huber atmega8a avr studio 6.0 mk2 programmer /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { PORTC = ADCH; } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Das hat mit "PC-Programmierung" nichts zu tun. Nein, Du musst keinen neuen Thread eröffnen.
Huber M. schrieb: > wäre euch sehr dankbar Google kaputt? Hilf dir selbst. z.B. http://www.electronicsplanet.ch/mikrocontroller/source-code/ATmega8/ATmega8-ADC-index.htm Gleich das erste Beispiel passt gut zu deinen Anforderungen.
nein Google ist nicht kaputt. Ich würde es mir gerne mit meinen Code weiter erstellen. Um es besser zu lernen bzw. verstehen. der Code ist ja ganz anders geschrieben. ichI bräuchte bei mir den weiteren richtigen Ansatz.
:
Bearbeitet durch User
> > Was hast du an AREF angeschlossen? > Das poti aussen AREF,den anderen GND, potipin an ADC0
Hi
>Das poti aussen AREF,den anderen GND, potipin an ADC0
Gibt es diesen Satz auch in verständlichem Deutsch?
MfG Spess
Sorry ich versuchs nochmal. Also an POTI-pin n habe ich AREF. Am Schleifer ADC0 und an POTI-pin h habe ich GND angeschlossen.
:
Bearbeitet durch User
Hi Bei REFS1/0 = 00 muss eine Referenzspannung an AREF gelegt werden. MfG Spess
Zeige mal bitte Deine Schaltung und den verwendeten Code ... sonst kann Dir hier keiner helfen (Glaskugeln alle in Reparatur :-) )
Ok, das heißt ich schließe Poti-pin n , an die 5V der Versorgungsspannung (oder an AVCC?) und den Schleifer an AREF und Poti-pin h an GND ?
hier ist er noch mal Hallo, ich würde hiemit gerne ein Poti an ADC0 auslesen und an PD0 ein led bei einem Wert von 800 einschalten und bei 1000 wieder aus. könnte mir bitte jemand zeigen oder tips geben wie ich das mit nachfolgenden Code umzusetzen ist? wäre euch sehr dankbar grüsse huber atmega8a avr studio 6.0 mk2 programmer /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { PORTC = ADCH; } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Hi >Ok, das heißt ich schließe Poti-pin n , an die 5V der >Versorgungsspannung (oder an AVCC?) und den Schleifer an AREF und >Poti-pin h an GND ? Das hört sich wirr an. Mach einen Schaltplan. Dann wissen alle was du meinst. MfG Spess
Huber M. schrieb: > Hoffe das genügt auf die schnelle Lese Dir erstmal das hier durch: https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
Hi Damit kannst maximal eine veränderbare Referenzspannung einstellen, aber nichts messen. Mein Vorschlag: Du stellst mit REFS1/0= 01 AREF auf VCC (Kondensator an AREF nicht vergessen). Dann das Poti mit einem Ende an VCC, das andere Ende an GND. Den Schleifer dann an deinen ADC-Eingang. MfG Spess
> > Lese Dir erstmal das hier durch: > > https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC Genau das ist der Grund warum ich hier um hilfe bitte. Um eine für euch einfache Grundbeschaltung bei mir am atmega8a zum laufen zu bringen. Um diese u.a. im Tutorial dann besser nachvollziehen zu können. das heißt ich will ein Poti am pin(PC0(ADC0) im Freerunning Mode mit ISR anschließen. Und die ISR soll mir dann bei einem bestimmten Wert zb PD0 High or Low schalten dazu habe ich auch schon folgendes geschrieben und mir fehlt noch grundsätzlich wie ich das in der ISR umsetze. zb. if (PINC <800) { PORTD |= (1<<PD0) } und den Spannungsteiler (POTI) müsste ich ja dann in ADC0 einlesen /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { PORTC = ADCH; } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Hi >> https://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC >Genau das ist der Grund warum ich hier um hilfe bitte. Um eine für euch >einfache Grundbeschaltung bei mir am atmega8a zum laufen zu bringen. Um >diese u.a. im Tutorial dann besser nachvollziehen zu können. Und was verstehst du an der dort gezeigten Grundschaltung ('Beschaltung von AREF') nicht? MfG Spess
also, das ist ja eigentlich sogar genau das was ich in meinem Code geschrieben habe oder, so wie ich das verstehe? An PC0 Poti einlesen, mit externer Referrenz spannung. Jetzt kann ich das Poti an PC0 einlesen, aber da ich noch nicht so fortgeschritten bin um mir den Wert 0-1023 auf einem LCD anzeigen zu lassen. Würde ich gerne an PD0, bei einem wert zb. < 800 den Ausgang Auf High schalten, um zu sehen das da irgendwas funktioniert was ich drauf gespielt habe. Da ist eigentlich mein Hauptproblem wie ich das in der ISR umsetze. Kurz gesagt will ich am Poti drehen und sehen das sich etwas verändert zb. LED an PD0 an. mir ist natürlich bewusst das ich PD0 noch als ausgang festlegen muss, aber wie ich dann in der ISR weiter machen soll komm ich nicht drauf zb. if (PC0 < 800) PD0, an , else (PC0 > 800) PD0 aus. der Weg dorthin macht mir probleme.
Huber M. schrieb: > Kurz gesagt will ich am Poti drehen und sehen das sich etwas verändert > zb. LED an PD0 an. mir ist natürlich bewusst das ich PD0 noch als > ausgang festlegen muss, aber wie ich dann in der ISR weiter machen soll > komm ich nicht drauf zb. if (PC0 < 800) PD0, an , else (PC0 > 800) PD0 > aus. der Weg dorthin macht mir probleme.
1 | uint16_t val16; |
2 | |
3 | val16 = ADC; |
4 | if ( (val16 >= 800) && (val16 <= 1000) ) |
5 | {
|
6 | PORTD |= 0x01; |
7 | }
|
8 | else
|
9 | {
|
10 | PORTD &= ~0x01; |
11 | }
|
Ok, danke der Code sieht jetzt bei mir wie nachfolgend aus. Bringt mir jetzt aber beim kompileren einen Fehler. das er irgendwie ADMUX nicht mehr kennt. was habe ich denn hier nicht beachtet ? /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >= 800) && (val16 <= 1000) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes DDRD = (1<<PD0) //Ausgang PD0 LED //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Huber M. schrieb: > Ok, danke der Code sieht jetzt bei mir wie nachfolgend aus. Ja und bitte du auch die C-Formatierung beachten wie sie unter "Antwort schreiben" jedes mal angemahnt wird.
Danke das hätte ich wirklich selber sehen müssen. Compilieren und flashen funktioniert jetzt auch. Aber die Funktion bleibt aus. Vielleicht verstehe ich in diesem Fall das Poti anschliessen doch falsch. Oben im Bild mal mein Aufbau.Und nachfolgend der dazugehörige Code der aufgespielt ist. /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >= 800) && (val16 <= 1000) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes DDRD = (1<<PD0) ; //Ausgang PD0 LED //ADC konfiguration ADMUX |= (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Hi Wenn ich dein Bild richtig verstanden habe ist einerseites der AREF-Pin unbeschaltet aber im Programm als Referenzspannung die Spannung am AREF-Pin ausgewählt. Das passt nicht zusammen. MfG Spess
Dann steckst du bitte noch 100nF Kondensatoren direkt am Chip: * Von VCC nach GND * von AVCC nach GND * von AREF nach GND und ADMUX mal so initialisieren:
1 | ADMUX = (1 << REFS0) | (1 << ADLAR); |
Nochwas zu AREF. AREF ist nicht belastbar. Man kann ohne externen Buffer kein Poti oder sowas an AREF zapfen, ohne das die Spannung deutlich zusammenbricht. Hey, ausserdem sehe ich gerade, das du AVCC gar nicht angeschlossen hast - böser Fehler. AVCC muss mit an VCC, am besten über eine Drossel der 10µH - 100µH Klasse.
:
Bearbeitet durch User
Ok, ist das jetzt die im tutorial beschriebene Mindestbeschaltung? Die Drossel kann ich mir allerdings erst am Montag besorgen. ich habe jetzt derweilen einen Widerstand eingebaut, oder doch einfach nur ne Brücke? Code wie nachfolgend überspielt und wie im bild verdrahtet, funktion bleibt immer noch aus /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >= 800) && (val16 <= 1000) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes DDRD = (1<<PD0) ; //Ausgang PD0 LED //ADC konfiguration ADMUX |= (1 << REFS0) | (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Wenn ich das im Foto richtig sehe, hast du AVCC (Pin 20) jetzt mit GND verbunden, das muss aber an +5V, also VCC. Widerstand ist schlecht, nimm lieber die Brücke.
:
Bearbeitet durch User
also ich habe jetz ne brücke von (pin 20) nach (pin7) VCC gesteckt siehe bild, und nachfolgenden code aber ohne funktion. ps den grauen draht vom Poti der im bild an + geht. Habe ich von + entfernt und nachträglich mit AREF verbunden /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >= 800) && (val16 <= 1000) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRC = 0b1111111; //Ausgabe des ADC-Meßwertes DDRD = (1<<PD0) ; //Ausgang PD0 LED //ADC konfiguration ADMUX |= (1 << REFS0) | (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
:
Bearbeitet durch User
Ich glaube, die portc-pins als ausgang zu konfigurieren, hilft deinem vorhaben auch nicht so richtig nach vorn. Lass die portc-pins mal auf eingang.
Gcc schrieb: > Ich glaube, die portc-pins als ausgang zu konfigurieren, hilft deinem > vorhaben auch nicht so richtig nach vorn. Lass die portc-pins mal auf > eingang. stimmt, abgeändert, keine Funktion. jetzt weiß ich nicht mehr weiter. /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >= 800) && (val16 <= 1000) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRC = 0b0000000; //Eingang des ADC-Meßwertes DDRD = (1<<PD0) ; //Ausgang PD0 LED //ADC konfiguration ADMUX |= (1 << REFS0) | (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Lass mal zu anfang die led blinken, um sicherzustellen, dass der teil funzt:
1 | #include <avr/io.h> |
2 | #include <avr/interrupt.h> |
3 | #define F_CPU 8000000
|
4 | #include <util/delay.h> |
5 | |
6 | ISR(ADC_vect) |
7 | {
|
8 | uint16_t val16; |
9 | |
10 | val16 = ADC; |
11 | if ( (val16 >= 800) && (val16 <= 1000) ) |
12 | {
|
13 | PORTD |= 0x01; |
14 | }
|
15 | else
|
16 | {
|
17 | PORTD &= ~0x01; |
18 | }
|
19 | }
|
20 | int main(void) |
21 | {
|
22 | |
23 | DDRD = (1<<PD0) ; //Ausgang PD0 LED |
24 | |
25 | // blink
|
26 | PORTD |= 0x01; |
27 | _delay_ms(500); |
28 | PORTD &= ~0x01; |
29 | _delay_ms(500); |
30 | PORTD |= 0x01; |
31 | |
32 | |
33 | |
34 | //ADC konfiguration
|
35 | |
36 | ADMUX |= (1 << REFS0) | (1<<ADLAR); |
37 | ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |
38 | |(1<<ADPS1); |
39 | sei(); |
40 | |
41 | |
42 | while(1) |
43 | {
|
44 | |
45 | }
|
46 | |
47 | }
|
Du brauchst den adc raw-wert eher rechtsbündig, dh 0...1023, daher muss ADLAR bit 0 sein. Und dann ändere mal die grenzen in der if abfrage, ob ein oder aus auf die mitte des bereiches, dh wenn val16>511 dann on, sonst off
Genaugenommen sollte die led 2 mal aufleuchten und dann eingescaltet bleiben oder wieder verlöschen, wenn du den code genauso kopiert hast...
Hi Wenn ADLAR gesetzt ist, dann bewegt sich der ADC-Wert zwischen 0 und 255. Also entweder ADLAR löschen oger diee Schwellwerte durch 4 teilen. MfG spess
an Spess: Ich hätte gedacht zwischen 0 und 65472, d.h. bei ganz vorsichtigem Drehen im unteren Bereich hätte er mal etwas sehen sollen.
@spess: ich bin der meinung, bei adlar=1 sinds nach wie vor 10 bit, jedoch linksbündig im adc-register. Wenn er nur adch auslesen würde, dann hättest du recht, aber er liest ja das gesamte 16bit register
Also sie leuchtet ein zwei sec. auf geht aus, blitzt einmal kurz, dann bleibt sie aus. Sie sollte aber 500ms aufleuchte, dann wieder ausgehen, dann dauerhaft leuchten richtig ? ps der graue draht vom poti ist einstweilen auf AREF verlegt. ich benütze ATMEL studio 6.0 und den MK2 programmer original und Atmega8a
Led verhält sich richtig, an, aus, an und dann wird sie in der isr vom adc sofort wieder ausgeschaltet. Dh der code funktioniert. Irgendwas an deiner schaltung ist faul.
also aus unerklärlichen gründen klpt es jetzt mit dem Poti die LED ein zu schalten. Habe es noch einmal auf gespielt es geht voerst mal. habt schon mal herzlichen Dank
habe mich wohl zu früh gefreut, egal welchen Wert ich in der if Anweisung eingebe. Schaltet sie immer an der gleichen Stellung am Poti ein.
Huber M. schrieb: > ps der graue draht vom poti ist einstweilen auf AREF verlegt. Wie oben schon gesagt, darfst du AREF nicht belasten. Klemm die äusseren Enden des Potis wieder auf +5V und Masse. Schleifer geht auf ADC0.
Hallo, mal wieder :-) also ich habe jetzt vom Poti den Schleifer an PC0. Die beiden äusseren ,den einen auf +5 und und den anderen auf Masse. Und die kondensator wie beschrieben gesteckt. jetzt wäre es doch so, wenn das Poti die linke Stellung hat, wäre es doch nach der Wandlung null. Und in der rechten Stellung 1023 ? wenn ich jetzt die Werte if ( (val16 >=1000) && (val16 <= 1100) ) dann sollte die LED eher in der rechten Stellung angehen oder ? wenn ich jetzt die Werte if ( (val16 >=100) && (val16 <= 200) ) dann sollte die LED eher in der linken Stellung angehen oder ? oder habe ich einen kompletten Denkfehler. Denn es scheint das sie immer nur an der gleichen position mit minimalen abweichungen angeht. /* * Analog_Dgital_Umsetzer.c * * Created: 09.09.2016 18:10:19 * Author: HUBER */ #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 8000000 #include <util/delay.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if ( (val16 >=1000) && (val16 <= 1100) ) { PORTD |= 0x01; } else { PORTD &= ~0x01; } } int main(void) { DDRD = (1<<PD0) ; //Ausgang PD0 LED // blink PORTD |= 0x01; _delay_ms(500); PORTD &= ~0x01; _delay_ms(500); PORTD |= 0x01; //ADC konfiguration ADMUX |= (1 << REFS0) | (1<<ADLAR); ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE) | (1<<ADPS2) |(1<<ADPS1); sei(); while(1) { } }
Huber M. schrieb: > Denn es scheint das sie immer > nur an der gleichen position mit minimalen abweichungen angeht. Ist schon mehrfach geschrieben worden - und Du hast Dir den Link auf das Tutorial wohl immer noch nicht angeschaut. Wenn Du ADLAR auf 1 setzt wird das Ergebnis Linksbündig in die Register geschrieben. Dann macht es keinen Sinn, mit einer 16-Bit-Variablen zuzugreifen - bzw. die Werte sind dann deutlich höher, wie erwartet. Schau Dir das Tutorial an - da ist es gut beschrieben.
> Ist schon mehrfach geschrieben worden - und Du hast Dir den Link auf das > Tutorial wohl immer noch nicht angeschaut. das Stimmt nicht, ich habe es mir sogar ausgedruckt. Und es steht ja direkt da ADLAR 0 rechtsbündig. Und ADLAR 1 Linksbündid. Und das kann ich im ADMUX Register einstellen.Das heisst dann ich soll das ADLAR bit wieder auss dem Code löschen ? Und schon gehts, sollte wohl mal ne pause machen.
:
Bearbeitet durch User
Huber M. schrieb: > Das heisst dann ich soll das ADLAR bit > wieder auss dem Code löschen ? Wenn Du Werte zwischen 0 und 1023 "sehen" willst - ja.
Hi >wenn ich jetzt die Werte if ( (val16 >=1000) && (val16 <= 1100) ) dann >sollte die LED eher in der rechten Stellung angehen oder ? Wenn du ADLAR setzt und den 16-Bit Wert von ADC ausliest bekommst du folgende Werte: 0 Poti am masseseitigen Ende 64 128 192 .. 65408 65472 Poti am VCC-seitigen Ende Bei ADLAR = 0 liest du ADC als 0 Poti am masseseitigen Ende 1 2 ... 1022 1023 Poti am VCC-seitigen Ende ADLAR= 1 macht eigentlich nur Sinn wenn man die 10-Bit Auflösung des ADC nicht braucht und mit den 8 Bit aus ADCH auskommt. Dann liest du ADCH als 0 Poti am masseseitigen Ende 1 2 ... 254 255 Poti am VCC-seitigen Ende Wenn du in deinem Programm ADLAR=0 setzt kannst du mit Vergleichswerten im Bereich 0...1023 rechnen. MfG Spess
Danke für die ausführliche Erklärung. Jetzt würde ich es noch gerne auf einen Attiny24a testen. Und habe folgendes dazu umgewandelt. Danach wollte ich es kompilieren, prommt einen fehler habe ich hier ein bit zu setzen vergessen ? wäre nett wenn ihr mir dabei auch noch helfen würdet /* * Analog_Dgital_Umsetzer für Attiny24A.c * im Freerunningmode mit interner Referenzspannung * * Created: 09.09.2016 18:10:19 * Author: HUBER * *Verkabelung.: * * Poti VCC/GND Schleifer auf PC0 (ADC0) * */ #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL #include <util/delay.h> ISR(ADC_vect) { uint16_t val16; val16 = ADC; if (val16 >=500) { PORTB |= (1<<PB0); } else { PORTB &= ~(1<<PB0); } } int main(void) { DDRB = (1<<PB0) ; //Ausgang PB0 LED // blink PORTB |= 0x01; _delay_ms(250); PORTB &= ~0x01; _delay_ms(250); //ADC konfiguration ADMUX |= //REFS1 REFS0 Voltage Reference Selection //0 0 VCC used as analog reference, disconnected from PA0 AREF ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1); ADCSRB |= //kein bit Freerunningmode sei(); while(1) { } }
Huber M. schrieb: > Jetzt würde ich es noch gerne auf einen Attiny24a testen. Kannst du jetzt bitte endlich deinen Code so posten wie es sich gehört, nämlich in den eckigen C-Klammern wie es bei jedem "Antwort schreiben" Dialog angezeigt und gefordert wird? Jetzt sag nicht du hast das noch nicht gesehen ..... Kannst du das jetzt bittääääähhhhhh machen?
1 | Analog_Dgital_Umsetzer für Attiny24A.c |
2 | * im Freerunningmode mit interner Referenzspannung |
3 | *
|
4 | * Created: 09.09.2016 18:10:19 |
5 | * Author: HUBER |
6 | *
|
7 | *Verkabelung.: |
8 | *
|
9 | * Poti VCC/GND Schleifer auf PC0 (ADC0) |
10 | *
|
11 | */
|
12 | |
13 | |
14 | |
15 | #include <avr/io.h> |
16 | #include <avr/interrupt.h> |
17 | #define F_CPU 1000000UL
|
18 | #include <util/delay.h> |
19 | |
20 | ISR(ADC_vect) |
21 | {
|
22 | uint16_t val16; |
23 | |
24 | val16 = ADC; |
25 | if (val16 >=500) |
26 | {
|
27 | PORTB |= (1<<PB0); |
28 | }
|
29 | else
|
30 | {
|
31 | PORTB &= ~(1<<PB0); |
32 | }
|
33 | }
|
34 | int main(void) |
35 | {
|
36 | |
37 | DDRB = (1<<PB0) ; //Ausgang PB0 LED |
38 | |
39 | // blink
|
40 | PORTB |= 0x01; |
41 | _delay_ms(250); |
42 | PORTB &= ~0x01; |
43 | _delay_ms(250); |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | //ADC konfiguration
|
50 | |
51 | ADMUX |= //REFS1 REFS0 Voltage Reference Selection |
52 | //0 0 VCC used as analog reference, disconnected from PA0 (AREF)
|
53 | ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1); |
54 | ADCSRB |= //kein bit Freerunningmode |
55 | sei(); |
56 | |
57 | |
58 | while(1) |
59 | {
|
60 | |
61 | }
|
62 | |
63 | }
|
ich hoffe es hat funktioniert
Gcc schrieb: > Denk mal hier drüber nach:ADMUX |= //REFS1 REFS0 Voltage Reference > Selection Hier kann ich wählen ob ich eine externe oder eine interne Referenzspannung benützen will. wenn ich kein bit setze, wird VCC als analoge Referenzspannung genützt, PA0 und AREF wird abgeschaltet ? wenn ich REFS0 setze, wird externe Refrenz genützt und interne wird abgeschaltet?
Hi >Hier kann ich wählen ob ich eine externe oder eine interne >Referenzspannung benützen will. Und was wählst du mit diesem Befehl? Das gleiche mit > ADCSRB |= //kein bit Freerunningmode MfG Spess
Ich empfehle dir, C strukturiert zu erlernen - Buch zb. So wird das nix. Eine Wertzuweisung braucht einen linken und eine rechten Operanden. - Wo ist der rechte Operand hinter |= - Wo ist das ; am Ende der Anweisung Wenn du am Initialwert von ADMUX nichts ändern willst, dann fass dort auch nicht an. Wenn du was ändern willst, dann musst du auch sagen, was geändert ( oder in deinem Codeschnipsel: verodert ) werden soll. Gleiches bei ADCRSB. ( Wahrscheinlich meckert der Compiler nicht mal bei der ADMUX-Zuweisung, weil durch die folgenden Kommentare die ADCSRA-Zuweisung als rhs der ADMUX-Zuweisung genommen wird )
> >>Hier kann ich wählen ob ich eine externe oder eine interne >>Referenzspannung benützen will. > > Und was wählst du mit diesem Befehl? wenn ich REFSO setze interne referenz, also muss ich REFSO stzen? > > Das gleiche mit > >> ADCSRB |= //kein bit Freerunningmode > hier habe ich ja kein bit gesetzt, da dies den Freerunning mode aktiviert oder ?
Hi >wenn ich REFSO setze interne referenz, also muss ich REFSO stzen? Das steht im Datenblatt aber anders. >> ADCSRB |= //kein bit Freerunningmode >hier habe ich ja kein bit gesetzt, da dies den Freerunning mode >aktiviert oder ? Du hast garnichts gesetzt. ADCSRB |= erwartet einen Wert und keinen Kommentar. Und wenn du nichts reinschreiben must, dann lass die komplette Zeile weg. Das Register wird bei RESET mit Null initialisiert. MfG Spess
Rainer B. schrieb: > Eine Wertzuweisung braucht einen linken und eine rechten Operanden. > - Wo ist der rechte Operand hinter |= > - Wo ist das ; am Ende der Anweisung Ja, das war totaler blödsinn was ich da gemacht habe. -jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern vergessen ?
1 | /*
|
2 | * Analog_Dgital_Umsetzer für Attiny24A.c
|
3 | * im Freerunningmode mit interner Referenzspannung
|
4 | *
|
5 | * Created: 09.09.2016 18:10:19
|
6 | * Author: HUBER
|
7 | *
|
8 | *Verkabelung.:
|
9 | *
|
10 | * Poti VCC/GND Schleifer auf PC0 (ADC0)
|
11 | *
|
12 | */
|
13 | |
14 | |
15 | |
16 | #include <avr/io.h> |
17 | #include <avr/interrupt.h> |
18 | #define F_CPU 1000000UL
|
19 | #include <util/delay.h> |
20 | |
21 | ISR(ADC_vect) |
22 | {
|
23 | uint16_t val16; |
24 | |
25 | val16 = ADC; |
26 | if (val16 >=500) |
27 | {
|
28 | PORTB |= (1<<PB0); |
29 | }
|
30 | else
|
31 | {
|
32 | PORTB &= ~(1<<PB0); |
33 | }
|
34 | }
|
35 | int main(void) |
36 | {
|
37 | |
38 | DDRB = (1<<PB0) ; //Ausgang PB0 LED |
39 | |
40 | // blink
|
41 | PORTB |= 0x01; |
42 | _delay_ms(250); |
43 | PORTB &= ~0x01; |
44 | _delay_ms(250); |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | //ADC konfiguration
|
51 | |
52 | ADMUX ; |
53 | |
54 | ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2)|(1<<ADPS1); |
55 | ADCSRB; //kein bit Freerunningmode |
56 | sei(); |
57 | |
58 | |
59 | while(1) |
60 | {
|
61 | |
62 | }
|
63 | |
64 | }
|
Hi >-jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern >vergessen ? Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar C-Bücher. MfG Spess
spess53 schrieb: > Hi > >>wenn ich REFSO setze interne referenz, also muss ich REFSO stzen? > > Das steht im Datenblatt aber anders. REFSO1 steht internal 1,1v reference. Ich habe die drei Möglichkeiten schon probiert, aber das ändert nichts an der funktion
spess53 schrieb: >>-jetzt bleibt die Funktion trozdem aus. was habe ich beim konfiguriern >>vergessen ? > > Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar > C-Bücher. -das trifft auch zu, empfiehl mir mal bitte eins. - ich hab zwar zwei mit arduino, aber die helfen mir ja hier nicht wirklich weiter. -ich würde es aber jetzt am attiny 24 noch gerne zu ende bringen. vielleicht helft ihr mir ja noch
spess53 schrieb: > Dir fehlen grundlegende C Kentnisse. Es wird dringend Zeit für ein paar > C-Bücher. Da fehlt mMn grundlegenes Verständins. Wenn man eine Zuweisung nicht von einem Funktionsaufruf unterscheiden kann, sollte man gaaanz von vorne anfangen. "Die Programmiersprache C" von Kernighan und Ritchie ab der 2. Auflage in Deutsch empfehle ich (vielleicht mal in der Bücherei ausleihen - zu meiner Zeit gab es davon sogar ein Exemplar in der Stadtbücherei) Wenn das zu kompliziert geschrieben ist, solltest du die eine andere Beschäftigung suchen.
Hi >Ich habe die drei Möglichkeiten >schon probiert, aber das ändert nichts an der funktion Was sagt dir das hier REFS1 REFS0 0 0 VCC used as analog reference, disconnected from PA0 (AREF) ? >-das trifft auch zu, empfiehl mir mal bitte eins. Als notorischer Assemblerprogrammierer bin ich der falsche Ansprechpartner, aber das Standartdwerk Kernighan/Ritchie Programmieren in C kann ich empfehlen. MfG Spess
ich beschäftige mich natürlich mit einfacher Ein- und Ausgabe und Interrupt auslösen an into funktioniert auch schon ganz gut, ich dachte mir irgendwann muss ich mal mit dem ADC mal anfangen. der gehört ja auch noch zu den Grundlagen, oder ? und wenn das läuft kann ich das schon besser nachvollziehen, Darum hatte ich mir auch den Atmega8a gekauft, weil ich mMn nach hier am meisten nachlesen (und mit dem datenblatt besser klar komme) und nachfragen kann. Und ich würde es halt gerne auf dem attiny 24 a auch gerne probieren aber irgendwie verwirrt mich das lesen im datenblatt immer komplett.
spess53 schrieb: > Was sagt dir das hier > > REFS1 REFS0 > 0 0 VCC used as analog reference, disconnected from PA0 (AREF) > ? VCC wird als analoge Referecespannung benützt und von PAO (AREF) getrennt. so übersetze ich das für mich
Huber M. schrieb: > ich beschäftige mich natürlich mit einfacher Ein- und Ausgabe und > Interrupt auslösen an into funktioniert auch schon ganz gut, ich dachte > mir irgendwann muss ich mal mit dem ADC mal anfangen. der gehört ja auch > noch zu den Grundlagen, oder ? Natürlich gehört der ADC zu den Grundlagen, so wie alle anderen Peripherie-Module des Controllers; die gibt es nämlich bei anderen Controllern genauso. Huber M. schrieb: > Darum hatte ich mir auch den Atmega8a gekauft, > weil ich mMn nach hier am meisten nachlesen (und mit dem datenblatt > besser klar komme) und nachfragen kann. Und ich würde es halt gerne auf > dem attiny 24 a auch gerne probieren aber irgendwie verwirrt mich das > lesen im datenblatt immer komplett. Der einzige Unterschied neben der unterschiedlichen Peripherie sind vielleicht noch die Namen und Belegungen der Register. Der ADC eines Mega8A ist genauso aufgebaut, wie der des Tiny24A - beides sukzessive-Approximations-Wandler. Nur die Belegung der Register um die Dinger anzustellen, kann anders sein und heissen.
Huber M. schrieb: > so übersetze ich das für mich Und der Sinn dahinter? (Übersetzen kann Spess das mit Sicherheit selber).
genau, und darum dachte ich mir, wenn ich es am Atmega8 verstehe bzw. nachvollziehen kann. dann kann ich es auf dem Attiny24 auch, wenn ich die richtigen Registerbits setze. denn ich glaubte es verstanden zu haben. Wie man ein Poti an den Atmega8a mit interner Referenzspannung und interrupt im Freeruningmode betreibt. Und es zum attiny nicht so viel unterschied ausmachen sollte, die bit zu setzen.
STK500-Besitzer schrieb: > Und der Sinn dahinter? (Übersetzen kann Spess das mit Sicherheit > selber) das es für externe referenzspannung ist ? wenn ich kein bit setze.
Huber M. schrieb: > das es für externe referenzspannung ist ? wenn ich kein bit setze. und wo liegt die an, und wie groß ist die?
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.