Hallo ich würde gerne An meinem ATMEGA8535 eine Analog Spannung an PortA am ersten Pin wandeln, ich weis aber leider nicht wie das mit der Declaration funkioniert am anfang und auf was ich achten muss weis irgendjemand wo es ein Beispiel programm gibt? Danke
>weis irgendjemand wo es ein Beispiel programm gibt? Ja, ich. Im Tutorium: http://www.mikrocontroller.net/articles/AVR
Doch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Analoge_Ein- _und_Ausgabe Genauer: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Aktivieren_des_ADC
datenblatt? suche in der codesammlung? vieleicht google? wobei das datenblatt sicher der beste rat ist. ansonsten selber anstrengen, versuchen und wenn garnix klappt hier versuchen, aber wenn der eindruck erweckt wird das jemand noch garnix versucht hat und sich hier die komplette lösung zusammenschnorren will dann wird das nix. konkrete frage -> konkrete antwort. aber ich stolper ja auch nicht in irgendein luft und raumfahrtforum: ich möchte mir eine marsrakete bauen, hat jemand die konstruktionspläne oder kann das eben für mich machen?????
natürlich nicht aber ich gedacht vielleicht ist ja jemand so freundlich ;-) danke trozdem jungs
Nun habe ich das datenblatt mal durch gelesen und das Programm geschrieben hab nun aber follgendes problem die werte des ADC Registers sind irgendwie müll es steht nicht der wert darin der seien sollte. Verändert man die eingangsspannung ändert sich irgendwie nix angehängt habe ich ein teil des Programms *****************************************************/ #include <mega8535.h> #include <stdio.h> #include <delay.h> #include "displaydrv.h" #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input|ADC_VREF_TYPE; // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } // Declare your global variables here //Varibalen Declarierung unsigned int Test1 = 0; //Display Varible char string[16]; void main(void) { // Declare your local variables here // ADC initialization // ADC Clock frequency: 62,500 kHz // ADC Voltage Reference: AVCC pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: Free Running ADMUX=ADC_VREF_TYPE; ADCSRA=0xA6; SFIOR&=0x0F; // Global enable interrupts #asm("sei") //Display Aktivieren InitDisplay (); while (1) { MoveToPosition (0, 0); sprintf (string ,"%04d, ADCL"); SetLine (4, string); MoveToPosition (1, 0); sprintf (string ,"%04d, ADCH"); SetLine (4 , string); }; }
> angehängt habe ich ein teil des Programms
Und warum zum Geier nur einen Teil und nicht den kompletten Code? So wie
das oben steht, kann nichts herauskommen, weil "read_adc" nie
aufgerufen wird!
>SFIOR&=0x0F;
Was soll da passieren? (Sowas habe ich bisher noch nie gebraucht...)
1 | while (1) |
2 | {
|
3 | |
4 | MoveToPosition (0, 0); |
5 | sprintf (string ,"%04d, ADCL"); |
6 | SetLine (4, string); |
7 | |
8 | MoveToPosition (1, 0); |
9 | sprintf (string ,"%04d, ADCH"); |
10 | SetLine (4 , string); |
11 | |
12 | };
|
13 | }
|
Wo fragst du den ADC ab?
@Rahul: > >SFIOR&=0x0F; > Was soll da passieren? (Sowas habe ich bisher noch nie gebraucht...) Das macht der Code Generation Wizard vom CodeVision. Da braucht man nur ein paar Buttons anklicken, und schon erzeugt einem das Ding Code, ohne dass man verstehen muss, warum... Ist das nicht schön? (Zumindest, solange man keine Fehler suchen muss...;-)
Wie frägt man den ADC ab? mit welchem befehl Der sprintf befehl ist nur für meinen Display Treiber er schreibt einfach den jetzigen inhalt des adch oder adcl registers auf das display ich hab gedacht wenn er im free running modus läuft ändert sich der register wert automatisch. Falsch gedacht oder?? :-) danke trozdem
>Ist das nicht schön? (Zumindest, solange man keine Fehler suchen muss...
Ich kenne da noch eine "Baukasten-Programmier-Sprache", die gerne
Probleme bereitet... die fängt mit "Bas" an und hört mit "m" auf...(das
"co" kann man sich sicherlich denken...;-)
> Wie frägt man den ADC ab? mit welchem befehl
Könnte es eventuell sein, dass Du von dem Code, den Du da
zusammengestückelt hast, ÜBERHAUPT NICHTS verstanden hast? Du hast eine
Funktion, die den ADC initialisiert und einen Wert zurückgibt. Wenn Du
diese Funktion aber aus dem Hauptprogramm heraus überhaupt nicht
aufrufst, dann kann auch kein Ergebnis rauskommen...
Die Funktion hab ich doch garnicht geschrieben die hat der Compiler selber Generiert!! Mein Arbeitgeber hat das nur angeklickt und gemeint ich werd schon rausfinden wie das geht!!!Ich selber hab noch nicht wirklich viel Programiert ledigtlich ein lauflicht oder ein paar kleine IF schleifen ich mach das ja erst seit 2 wochen. Und jetzt soll ich halt so ein projekt mit dem AD wandler machen!!! ich hab jetzt mal read_adc(WERT = ADCW); in die while schleife integriert leider erfolos im register steht immer müll
>read_adc(WERT = ADCW); Vielleicht solltest du dir erst mal C-Grundlagen antun. >Compiler selber Generiert! Das ist definitiv gelogen. Compiler generieren eher keinen C-Code. Was du meinst, ist der Klickiklick-Wizard, der dazu führt, nicht mehr zu denken...
OB generiert oder eingefügt ist doch egal ich will damit nur sagen das der code nicht von mir stammt!!! Sagt mir doch einfach wie ich den read_adc befehl ein bauen soll danke
> Mein Arbeitgeber hat das nur angeklickt und gemeint > ich werd schon rausfinden wie das geht!!! Gut, dass ich nicht so einen Arbeitgeber habe... Aber was Du brauchst, sind tatsächlich einige C-Grundlagen. Eine gute Einführung in deutscher Sprache, die sich auch um den A/D-Wandler kümmert, ist das AVR-GCC-Tutorial auf dieser Seite. Es bezieht sich zwar nicht auf den CodeVision-Compiler, aber solange Du die da angegebene ANSI-C-Syntax benutzt, kann der CodeVision das auch compilieren. Und gerade, um das Prinzip zu verstehen, ist das Tut sicher ein guter Anfang, auch wenns drum geht, dass einem ein Arbeitgeber mit oben genannter Einstellung im Nacken sitzt und Druck macht, weil alles gestern schon fertig sein soll...
> Aber was Du brauchst, sind tatsächlich einige C-Grundlagen
Allerdings. Eine Funktion aufrufen zu können, sind absolute
Grundlagen.
Sag deinem Arbeitgeber (etwas freundlicher als ich das
jetzt schildere), wenn er zu dämlich ist dir einen
Lehrer zu stellen, dann soll er dir wenigstens ein
Buch kaufen, dass du in deiner Arbeitszeit lesen darfst.
Das Buch sollte sein:
"Kernighan&Ritchie, Programmieren in C"
Mit dem (und einer Programmierumgebung auf dem, und für den
PC), machst du erst mal die ersten Schritte in C.
Du kannst nicht laufen, wenn du noch nicht gehen kannst.
Jemand der in seinem ganzen Leben noch nie einen Schrauben-
zieher in der Hand hatte, stellt man auch nicht ohne einen
einführenden Werkstattkurs in ein CNC-Fräscenter.
> Mein Arbeitgeber hat das nur angeklickt und gemeint > ich werd schon rausfinden wie das geht!!! Das erinnert mich ein bischen an den Informatik unterricht in den späten 70-er, frühen 80-er Jahren. Da wurden massenhaft Physik oder Mathelehrer in den grossen Ferien zwangsbeglückt im nächsten Schuljahr den EDV Unterricht zu übernehmen. Entsprechend sah dann auch der Unterricht aus.
Ich frag mal meinen Chef ob er mir einen Lehrer stellt was ich aber für ziemlich unwahrscheinlich halte. Danach bestell ich mir ein Buch, ich denke ich muss das daheim lesen für sowas haben wir hier keine zeit. Nochmal zum AD Wandler wenn ich die read_adc Funktion aufrufe wandelt er einmal den wert?
>Nochmal zum AD Wandler wenn ich die read_adc Funktion aufrufe wandelt er >einmal den wert? Ja
Ach ja. Dein Aufruf würde zb. so aussehen
1 | ...
|
2 | |
3 | unsigned int AdcWert; |
4 | |
5 | ...
|
6 | |
7 | while (1) |
8 | {
|
9 | |
10 | AdcWert = read_adc( 0 ); // Kanal 0 auslesen |
11 | |
12 | MoveToPosition (0, 0); |
13 | sprintf (string ,"%04d", AdcWert); |
14 | SetLine (4, string); |
15 | }
|
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.