Hallo, ich bin hier neu, habe mich aber schon durch alle möglichen threads und tutorials gelesen... ungefähr schon 4 Wochen... von daher ist das erständnis eigentlich ganz gut. Jetzt die frage.. ich möchte gerne den am AD-Eingang des atmega8 anliegenden dynamischen Wert über den Usart per Tx verschicken. eine Umwandlung oder Verarbeitung soll nicht IM mc stattfinden, auch Interrupts sofern möglich sollen vermieden werden. Timer / sleep /watch dog functions ebenfalls... die simpleste form der datenübergabe, aus varibale AD wandler in varibale Usart.. würde ich gerne verwirklichen! worüber ich jetzt nicht soviel weis ist die reinfolge der abarbeitung der prog teile... wenn dazu auch jemand was sagen könnte wäre klasse. Die arbeitsumgebung ist das Stk500 ...und AVRstudio4.12 funktioniert auch alles super... per usart kann ich schon beliebige werte verschicken. wie im GCC tutorial erklärt gut erklärt worden ist. und das AD-wandler beipspiel ist auch einwandfrei und funzt... nur die datenübergabe nicht..!!! Vielleicht kann mir jemand dabei helfen... wäre super nett. ein kurzes beispiel wäre klasse.
ich bekomme aus der unteren AD-wandler funktion keinen wert raus... den ich in der main weiter benutzten kann. alle variablen sind nur intern verwendbar . wie result etc... irgendwie muss es doch gehen das ich result = XY setzte und XY in der main wie z.B buffer = XY ; **************** wobei buffer der eingabewert für die Usart-funktion ist void uart_send(uint16_t buffer){ /* Warten bis der Sendepuffer frei ist */ while ( !( UCSRA & (1<<UDRE)) ); /* Daten in den Puffer schreiben und damit senden */ UDR = (buffer); while ( !( UCSRA & (1<<UDRE)) ); } *************************** ************************************************* uint16_t ReadChannel(uint8_t mux) { uint8_t i; uint16_t result = 0; //Initialisieren wichtig, da lokale Variablen //nicht automatisch initialisiert werden und //zufällige Werte haben. Sonst kann Quatsch rauskommen ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler // setzen auf 8 (1) und ADC aktivieren (1) ADMUX = mux; // Kanal waehlen ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */ ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */ for(i=0;i<4;i++) { ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while ( ADCSRA & (1<<ADSC) ) { ; // auf Abschluss der Konvertierung warten } result += ADCW; // Wandlungsergebnisse aufaddieren } ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) result /= 4; // Summe durch vier teilen = arithm. Mittelwert return result; }
Ich glaub, da fehlen einige Grundlagen, was die Übergabe von Werten an Funktionen oder die Rückgabe von Werten aus Funktionen angeht. Da Du Deine main nicht mitgeschickt hast, weiß ich nicht, was Du da machst, aber warum nicht irgendwas in der Art wie int main(void) { uint16_t ADWert; //...irgendwelcher Unfug ADWert = ReadChannel(0); //liest Wert von Kanal 0 uart_send(ADWert); } Allerdings kannst Du per UART nur 8 Bits auf einmal verschicken, so dass Du entweder in main oder in der uart_send den 16-Bit-AD-Wert auf zwei 8-Bit-Werte aufteilen musst. Also z.B. void uart_send(uint8_t buffer) { //Wie oben } //... int main(void) { uint16_t ADWert; //...irgendwelcher Unfug ADWert = ReadChannel(0); //liest Wert von Kanal 0 uart_send((uint8_t) ADWert); //Sendet Low-Byte uart_send((uint8_t)(ADWert >> 8); //Sendet High-Byte }
das hat soweit gut geklappt eine klammer hat gefehlt aber ansonsten ganz großen dank.. uart_send((uint8_t)(ADWert >> 8)); statt.... uart_send((uint8_t)(ADWert >> 8);
Glückwunsch! Wollte ja nur sehen, ob Du auch selber drauf kommst und nicht nur einfach vorgegebenen Code zusammenstückelst ohne drüber nachzudenken;-)
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.