Hallo, Hab ein problem und zwar muss ich ein projekt machen, wo ich auf einem atmega8 uc analoge signale(dc) 0volt bis 10volt digitalisieren muss und diese auf einer 8bit led anzeigen stufenweise ausgeben muss, zusätzlich dazu muss der wert auf einem lcd display angezeigt werden. Wie kann ich das ganze realisieren da ich unter anderem auf meinem uc nur 5 volt habe, 3 ports mit jeweils 6 pins ....? Bitte um ausführliche hilfe. Gruß
9er schrieb: > Bitte um ausführliche hilfe. Beauftrage einfach ein Entwicklungsbüro in deiner Nähe. Die machen das dann für dich.
Moin 9er, allzu ausführliche Hilfe kannst du erstmal nicht erwarten. Wir werden dir das Projekt natürlich nicht vorkauen. Aber in der Regel wirst du hier wenigsten Links und ein paar Basis-Ansätze erhaletn, auf denen du selbst aufbauen musst. 10Volt an einem 5V-ADC sampeln ist gar kein Problem. Man teilt die Spannung über einen Widerstandsteiler herunter. Der Teiler ist bekannt und mit dem Äquivalent zu den 5V kannst du dann mit dem Teilerfaktor einfach wieder auf den Wert der Spannugn bis 10V schließen. Wenn du aber möglichst sauber messen möchtest, solltest du gegen die interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim atmega8 z.B. 2,56V. Daher also mindestens die 10V um den Faktor vier herunterteilen und mit dem ADC gegen die 2,56V sampeln. Zur Ansteuerung eines LCD findest du hier im Forum auch genug. Such mal nach HD4470 LCD library für AVR. Wahrscheinlich bist du mit der Lib und Beschreibung von Peter Fleury am besten dran. Um LEDs als Leuchtbalken am atmega anzuschließen bist du auch nicht der erste. Fang erstmal mit der klassischen Beschaltung an und wenn dir die Pins knapp werden, versuch es mit dem Stichwort LED-Multiplexing. Alles in allem eine machbare Aufgabe als Schulprojekt oder Laborarbeit im Rahmen irgendeines E/I-Studiums.
Das Auslesen geht mit dem ADC des Atmega über einen Spannungsteiler (http://de.wikipedia.org/wiki/Spannungsteiler)
> und zwar muss ich Sagt wer ? Der Lehrer ? Dann sollte er Euch doch etwas dazu erklärt haben ? Viellicht hilft ja das folgende schon mal weiter ..... > muss der wert auf einem lcd display angezeigt werden http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD > 0volt bis 10volt digitalisieren .... uc nur 5 volt habe http://www.mikrocontroller.net/articles/Spannungsteiler > digitalisieren http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
@ 9er Ist Deine Shift-Taste defekt? Den Text kann ja keiner lesen! Ich werfe einfach mal ein paar Links in den Raum... http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige
Leider ist der Unterricht viel zu oft ausgefallen deshalb habe ich sehr wenig Wissen in dem Thema aber trotzdem dank für die Infos, zwar nicht sehr ausführlich aber hilfreich
...nicht sehr ausführlich, weil du immer noch Arbeit - und keine fertige Lösung - hast?
René B. schrieb: > Wenn du aber möglichst sauber messen möchtest, solltest du gegen die > interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim > atmega8 z.B. 2,56V. Da steckt ein kleiner Irrtum drinnen. Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie ist in der Höhe sehr konstant und von der Versorgungsspannung unabhängig. Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V
:
Bearbeitet durch User
Henny schrieb: > ...nicht sehr ausführlich, weil du immer noch Arbeit - und keine fertige > Lösung - hast? Wenn er die Links verfolgen und lesen würde, hätte er für den ADC Teil sogar das: eine zu 99% fertige Lösung.
Karl Heinz schrieb: > René B. schrieb: > >> Wenn du aber möglichst sauber messen möchtest, solltest du gegen die >> interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim >> atmega8 z.B. 2,56V. > > Da steckt ein kleiner Irrtum drinnen. > Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie > ist in der Höhe sehr konstant und von der Versorgungsspannung > unabhängig. > Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V Datenblatt Seite 198: "Internal reference voltages of nominally 2.56V or AVCC are provided On-chip." Habe gerade vor 3 Wochen damit was gemacht. Bei den späteren, Atmega328 z.B. ist die Vref 1,1V.
:
Bearbeitet durch User
Conny G. schrieb: > Datenblatt Seite 198: > > "Internal reference voltages of nominally 2.56V or AVCC are provided > On-chip." > > Habe gerade vor 3 Wochen damit was gemacht. > > Bei den späteren, Atmega328 z.B. ist die Vref 1,1V. Ich denke er meint, dass sie nicht genau 2.56V beträgt
Conny G. schrieb: > Karl Heinz schrieb: >> René B. schrieb: >> >>> Wenn du aber möglichst sauber messen möchtest, solltest du gegen die >>> interne Referenzsspannung deines Mikrocontrollers messen. Die ist beim >>> atmega8 z.B. 2,56V. >> >> Da steckt ein kleiner Irrtum drinnen. >> Die interne Referenzspannung eines Mega8 ist hauptsächlich eines: sie >> ist in der Höhe sehr konstant und von der Versorgungsspannung >> unabhängig. >> Was sie aber ganz sicher nicht ist: sie ist nicht 2.56V > > Datenblatt Seite 198: > > "Internal reference voltages of nominally 2.56V or AVCC are provided > On-chip." Datenblatt, ATMega8, Seite 241 "ADC Characteristics"
1 | VRef Reference Voltage Minimum: 2.3V, Typical: 2.56V, Maximum: 2.9V |
Alex W. schrieb: > VRef kann über die Register VCC, VRefext, 2,65V oder 1,1V eingestellt > werden Verwirr bitte den TO nicht noch mehr, als er ohnehin schon ist. Beim Mega8 gibt es genau diese Möglichkeiten
1 | REFS1 REFS0 Voltage Reference Selection |
2 | 0 0 AREF, Internal Vref turned off |
3 | 0 1 AVCC with external capacitor at AREF pin |
4 | 1 0 Reserved |
5 | 1 1 Internal 2.56V Voltage Reference with external capacitor at AREF pin |
Wobei die Zahlenangabe 2.56V ein wenig mit Vorsicht zu geniessen ist und der tatsächliche Wert nachgemessen werden muss.
Hallo Leute, ich hab mich glaub durch alle Links durchgekämpft aber ich komm einfach mit dem Projekt nicht klar weil viele Programme in Assembler geschrieben sind und ich in C programmieren muss :( könntet ihr mir weitere Tipps geben wie ich das Projekt bis nächste Woche fertig bekommen kann. Gruß
> ich in C programmieren muss Es gibt das AVR-Tutorial auch in der C-Variante: AVR-GCC-Tutorial Speziell ADC: AVR-GCC-Tutorial/Analoge Ein- und Ausgabe und LCD: AVR-GCC-Tutorial/LCD-Ansteuerung Gruß
1 | #include <avr\io.h> |
2 | #define F_CPU 3686400
|
3 | #include <util\delay.h> |
4 | |
5 | int main (void) |
6 | {
|
7 | ADMUX = 0b01000000; |
8 | ADCSRA = 0b10100101; |
9 | DDRB = 0b11111111; |
10 | |
11 | while (10) |
12 | {
|
13 | ADCSRA = ADCSRA | 0b01000000; |
14 | while (ADCSRA & 0b01000000) |
15 | {}
|
16 | if(ADC >=0 && ADC <128) |
17 | {
|
18 | PORTB = 0b00000001; |
19 | }
|
20 | if(ADC >=128 && ADC <256) |
21 | {
|
22 | PORTB = 0b00000010; |
23 | }
|
24 | if(ADC >=256 && ADC <384) |
25 | {
|
26 | PORTB = 0b00000100; |
27 | }
|
28 | if(ADC >=384 && ADC <512) |
29 | {
|
30 | PORTB = 0b00001000; |
31 | }
|
32 | if(ADC >=512 && ADC <640) |
33 | {
|
34 | PORTB = 0b00010000; |
35 | }
|
36 | if(ADC >=640 && ADC <768) |
37 | {
|
38 | PORTB = 0b00100000; |
39 | }
|
40 | if(ADC >=768 && ADC <896) |
41 | {
|
42 | PORTB = 0b01000000; |
43 | }
|
44 | if(ADC >=896 && ADC <1024) |
45 | {
|
46 | PORTB = 0b10000000; |
47 | }
|
48 | |
49 | }
|
50 | }
|
:
Bearbeitet durch User
Hallo Leute, hab mal versucht ein Programm zu schreiben was leider nicht funktioniert. Das Programm soll die Spannung AVCC stufenweise (3Bit->8 Zustände) auf den LED's anzeigen. Kann mir bitte jemand ein Tipp geben warum es nicht funktioniert. Danke für die Infos DomeG. Gruß
Weil du hier Bit 5 setzt: > ADCSRA = 0b10100101; Bit 5 – ADATE: ADC Auto Trigger Enable When this bit is written to on e, Auto Triggering of the ADC is enabled. The ADC will start a con- version on a positive edge of the selected trigger signal. The trigger source is selected by setting the ADC Trigger Select bits, ADTS in SFIOR und weil du hier die Spannung am Pin ADC0 mißt: > ADMUX = 0b01000000; UND weil du hier das Datenblatt lesen solltest (speziell von Seite 204 bis 221 : http://www.atmel.com/Images/doc2466.pdf
Das Register ADC sollte nur einmal nach der Wandlung gelesen werden? hmmm. Verwende doch die Bitbezeichnungen für die Register, außer da wo es offensichtlich ist. Macht den Coe für alle direkt lesbarer :)
1 | // wähle erstmal ADC0 als Eingang
|
2 | uint8_t ad_channel = 0; |
3 | |
4 | // puffervariable für ADC-Register
|
5 | uint16_t ad_buffer; |
6 | |
7 | // Kanalwahl
|
8 | ADMUX = (1 << REFS1) | (1 << REFS0 ) | (ad_channel & 0x0f); |
9 | |
10 | // ADC-Takt einstellen
|
11 | // 3,686400 MHz / 64 = 57,600 kHz
|
12 | // 200 kHz > 57,600 kHz > 50 kHz
|
13 | // das ist also ok
|
14 | ADCSRA = (1 << ADPS1) | (1 << ADPS2); |
15 | |
16 | // AD einschalten
|
17 | ADCSRA |= (1 << ADEN); |
18 | |
19 | // erste Wandlung ist eine Dummy Wandlung
|
20 | ADCSRA |= (1 << ADSC); |
21 | while (ADCSRA & (1 << ADSC) |
22 | {
|
23 | // wait for end of dummy conversion...
|
24 | }
|
25 | |
26 | ad_buffer = ADC; |
27 | |
28 | while(1) |
29 | {
|
30 | // mainloop wie bisher, nur solltest du ad_buffer prüfen...
|
31 | }
|
Uwe an welchem Pin sollte ich denn die Spannung messen, ich habe doch 6 Pins zur Verfügung -> PC0-PC5 und ich habe mir die Dattenblätter sher oft durchgelesen:)!!! Wieso ich des so umständlich mache mit den if-Bedingungen ist weil wirs nicht anders gelernt haben:(
Du musst das Datenblatt nicht einfach nur lesen, sondern auch verstehen ;-) Im Unterricht wurde nie die Switch-Case-Abfrage behandelt? Sollen die LEDs nacheinander aufleuchten oder immer eine dazukommen?
Hallo, die Leds sollen stufenweise leuchten, je höher die Spannung desto mehr Bits Christian und Switch-Case-Abfragen haben wir nur kurz angesprochen. Wie würdet ihr die Widerstände für den Spannungsteiler wählen? Hochohmig? Gruß
9er schrieb: > Hallo, > die Leds sollen stufenweise leuchten, je höher die Spannung desto mehr > Bits Christian und Switch-Case-Abfragen haben wir nur kurz angesprochen. > > Wie würdet ihr die Widerstände für den Spannungsteiler wählen? > Hochohmig? > So dass beide Widerstände zusammen in der Gegend von 10k haben. Wenn du von 0 bis 10V messen sollst, als Referenzspannung die Versorgung mit 5V wählst, brauchst du also einen Spannungsteiler 2:1. Zwei 10k Widerstände in Serie. Oder 2 Stück 4k7 Widerstände
Fatih Ö. schrieb: > Hallo Leute, > > hab mal versucht ein Programm zu schreiben was leider nicht > funktioniert. Und jetzt erklärst du mir bitte noch, warum du dich partout weigerst, die ADC Routinen aus dem ACR-GCC-Tutorial zu verwenden. Die würden nämlich aus dem Stand heraus funktionieren. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Analoge_Ein-_und_Ausgabe
:
Bearbeitet durch User
Viele Dank erstmal. Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt des weil ich ja dann 0,6 V abweiche von Vref. Und muss ich einen Kondensator ranhängen, hab nämlich oft was mit Kondensator gelesen.
9er schrieb: > Viele Dank erstmal. > Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt > des weil ich ja dann 0,6 V abweiche von Vref. Und muss ich einen > Kondensator ranhängen, hab nämlich oft was mit Kondensator gelesen. Ein Kondesantor, 100nF, vom ARef-Pin nach Masse. So wie das in gefühlten 10 Millionen anderen Beiträgen hier im Forum, inklusive aller Tutorien und Datenblätter steht.
:
Bearbeitet durch User
Karl Heinz schrieb: > 9er schrieb: >> Viele Dank erstmal. >> Bei 2,56 V Referenzspannung mache ich dann R1 = 10K und R2 = 2,5K, passt >> des weil ich ja dann 0,6 V abweiche von Vref. Nein das passt nicht. Denn wenn ich deine Daten hernehme und da mal mit 10V durchrechne, dann komme ich drauf, dass aus dem Spannungsteiler dann 3.125V rauskommen. Du bist also zu hoch. Und zwar prozentual schon ganz ordentlich zu hoch. Nimm doch die 5V, die du am Mega8 sowieso zur Verfügung hast. Kein Mensch erwartet von dir, dass du ein hochpräzises Messinstrument bauen kannst. Du hast ja ausserdem sowieso sicherlich nicht die hochpräzisen Widerstände im Einsatz. Dein 10k Widerstand hat keine 10k.
:
Bearbeitet durch User
9er schrieb: > Wie kommst du auf die 3.125V? Hmm. Gute Frage. Da muss ich mich wohl am Taschenrechner wo vertippt haben. Nochmal gerechnet und siehe da. Da bist im zulässigen Bereich.
Da ich die analoge Spannung stufenweise auf 8 leds ausgeben will benötige ich ja beim atmega8 zusätzlich noch 5 leds. Ich würde diese leds jeweils mit 350ohm vorwiderstände beschalten, passt des??? Und schalte ich diese dann gegen masse bzw gnd oder +5V bzw Vcc??? Gruß
9er schrieb: > Ich würde diese leds jeweils mit 350ohm vorwiderstände beschalten, > passt des??? Wenn die LEDs nicht ganz funzelig sind, darf der Widerstand gerne 1kΩ haben. Probiers aus mit der Helligkeit. > Und schalte ich diese dann gegen masse bzw gnd oder +5V bzw Vcc? Das kannst du machen wie du möchtest. Du kannst auch die eine Hälfte gegen Gnd und die andere gegen VCC schalten, mußt sie nur passend ansteuern. > ?? ?
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.