Hallo zusammmen, ich habe eine allgemeine Frage. Wie kann ich es allgemein realisieren, das mein Atmega16 Prozessor im Hintergrund einen Analogwert mißt und diesem permanent an ein LCD_Display ausgibt? Ich möchte meine Hauptroutine frei haben von dieser Aufgabe, damit ich dort andere Aufgaben lösen kann. Anbei mein Code. Die Stelle, die permanent ablaufen soll habe ich markirt. Man macht das über einen Timer oder die Interruptroutine des Analogwandlers. Die Frage meine ich nur allgemein, damit ich mir dann mit Hilfe der Unterlagen dieses Wissen beibringen kann. Ich möchte von Euch gern wissen in welche Richtung ich gehen soll. Ich würde mich über ein paar Tipps sehr freuen. Für weitere Nachfragen stehe ich gern zur Verfügung. Viele Grüße, Matthias. #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include "lcd_tools.c" /*#ifndef F_CPU #warning "F_CPU war noch nicht definiert, wird nun nachgeholt" #define F_CPU 8000000UL // Systemtakt in Hz - Definition als unsigned long beachten // Ohne ergeben sich unten Fehler in der Berechnung #endif */ int main(void) { uint16_t result = 0; uint8_t i; char texte[10]; double komma; double strom; lcd_ini(); ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // Frequenzvorteiler: setzen auf 32 (3.8 MHz / 32 = 115 kHz) und ADC aktivieren ADMUX = 0x06; // Kanal waehlen (ADC1) ?? ADMUX |= (1<<REFS0); // interne Referenzspannung nutzen ADCSRA |= (1<<ADSC); // eine ADC-Wandlung und danach wird das Bit wieder auf Null gesetzt while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten , warten bis die Wandlung durchgeführt iwst und bit wieder auf Null result = ADCW; // Wert abholen result=0; lcd_gotopos(2,1); lcd_writetext("AD-Wert"); while(1) { // die unteren Zeilen sollen ständig im Hiuntergrund ausgeführt werden, könnt ihr mir bitte sagen, welche Funktionen sich da am besten anbieten und ich schlage dann selber in der Literatur nach. Vielen Dank result=0; for(i=0; i<30;i++) { ADCSRA |= (1<<ADSC); // eine ADC-Wandlung und danach wird das Bit wieder auf Null gesetzt while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten , warten bis die Wandlung durchgeführt iwst und bit wieder auf Null result += ADCW; // Wert abholen } result /=30; dtostrf((double)result, 4,0, texte); lcd_gotopos(2,8); lcd_writetext (texte); //AD_Wert ausgeben //diese oberen Zeilen sollen ständig ausgeführt werden, damit ich in meinem Programm mit dem AD_Wert ständig arbeiten kann if (!(PINB &(1<<PB0))) { lcd_gotopos(1,1); lcd_writetext ("Motor Rechtslauf "); PORTA=0b00000011; } if (!(PINB &(1<<PB1))) { lcd_gotopos(1,1); lcd_writetext ("Motor Stopp "); PORTA=0b00000010; } if (!(PINB &(1<<PB2))) { lcd_gotopos(1,1); lcd_writetext ("Motor Linkslauf "); PORTA=0b00000101; } } return 0; }
Setze einen Timer auf, der Dir etwa alle 200ms ein Bit setzt. Im Main testest Du das Bit und gibst dann den ADC-Wert aufs LCD. Schneller als 200ms ist unergonomisch (kann keiner ablesen). Außerdem ist das LCD ein Blockdevice, d.h. es kann nur eine Task zur Zeit drauf zugreifen. LCD im Main und Interrupt gleichzeitig gäbe nen schönen Zeichensalat bzw. im 4Bit-Mode nen Nibble-Salat. Peter
Du weißt aber, dass "im Hintergrund ablaufen" bedeutet, dass immer noch Prozessorzeit draufgeht? ISRs werden (leider) nicht parallel ausgeführt...
@ Matthias H. (maethes26) >Wie kann ich es allgemein realisieren, das mein Atmega16 Prozessor im >Hintergrund einen Analogwert mißt und diesem permanent an ein >LCD_Display ausgibt? Durch Multitasking. Das ist einfacher als man denkt. Ein Timer ist hier auch recht nützlich. >Ich möchte von Euch gern wissen in welche Richtung ich gehen soll. Den Artikel oben lesen und drüber nachdenken, dann deine Programm entsprechend ändern. MFG Falk
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.