mikrocontroller.net

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


Autor: Matthias H. (maethes26)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: X- Rocka (x-rocka)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.