Forum: Mikrocontroller und Digitale Elektronik Code in eine Interruptroutine Auslagerbar?


von Matthias H. (maethes26)


Lesenswert?

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;
}

von Peter D. (peda)


Lesenswert?

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

von X- R. (x-rocka)


Lesenswert?

Du weißt aber, dass "im Hintergrund ablaufen" bedeutet, dass immer noch 
Prozessorzeit draufgeht?
ISRs werden (leider) nicht parallel ausgeführt...

von Falk B. (falk)


Lesenswert?

@  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
Noch kein Account? Hier anmelden.