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.