www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multiplexer bei dem Analog Comparator


Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Funktionsweise soll so sein das er 2 unterschiedliche werte mit einem 
Sollwert vergleichen soll mit dem internen Comparator.

Mein Problem ist es das der Multiplexer einfach nicht das macht was er 
soll.
Er soll die eingelesen Werte vom PORTbereich vom AD Wandler (PINC0, und 
PINC1) vergleichen mit dem vorgegebenen Sollwert der auf PIND6 steckt.
Mein jetziger Quelltext sieht so aus.


http://pastebin.com/GWEnNE0z

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht für mich fischig aus:

In zwei unmittelbar aufeinander folgenden C-Anweiungen den ADC-Eingang 
wechseln und darauf hoffen, dass die ISR in den paar Takten dazwischen 
den korrekten Vergleich macht?

Das sei() würde ich vor die while-Schleife ziehen.

Die Hexwerte bei der ADC Initialisierung habe ich nicht mit dem 
Datenblatt aufgeschlüsselt.

Quellcode auf pastebin posten, damit man schlecht Copy&Pasten kann, 
finde ich doof, wo es doch hier den schönen Anhang und Codeformatierung 
gibt.

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja erstmal danke für die Antwort,
Aber siehe mein Name...
ich bin blutiger Anfänger, und wurden in der Schule ziemllich ins Kalte 
Wasser geworfen.
Unser Lehrer hat nicht mal mit der C Programmierung angefangen
und wir sollen nun ein Projekt auf die Beine stellen, nach 2 Monaten 
einarbeiten... =(
Ich werde mal die paar änderungen einbauen, ich hätte ja gerne noch NOP; 
Befehle eingebaut aber der Befehl funktioniert nicht

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Als Starter bist du ganz gut dabei, da kommen andere mit deutlich 
weniger an! Viel Erfolg!

Wenn du am ändern bist, überleg dir den Programmablauf.

Wenn du die Tastenabfrage wie jetzt in den Analog Compare Interrupt 
packst führt das zu Einschränkungen: Die Tasten reagieren dann nur, wenn 
der Analog Compare Interrupt auch aufgerufen wird! So etwas wäre fast 
nur brauchbar, wenn es z.B. darum geht einen Alarm über den Analog 
Compare Interrupt zu entdecken und dann per Taste auszuschalten.

Wenn es eine unabhängige Tastenbedienung werden soll (z.B. Batterietest 
o.ä.), nimmst du besser einen Timer Interrupt für die Tasten oder 
benutzt das Warteschleifenverfahren innerhalb while. Beides ist in 
Entprellung beschrieben.

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja also das Projekt soll im weitesten Sinne ein "Rauchmelder" darstellen
Der Interrupt soll eben der Alarm sein den man Quittieren kann
inzwischen hab ich die nop befehle eingebaut und es funktioniert auch
was mich nur sehr verwundert, ist das der Interrupt erst auslöst nach ca 
2 sec nach überschreiten des Schwellwerts

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bevor man den falschen Quellcode examiniert: Ist der Quellcode oben noch 
aktuell oder bereits wie angekündigt verändert?

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich poste mal den neuen :)
einen moment

Autor: Starter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/* ------------------------------------------------------------
  Titel : Projekt Rauchmelder
 -------------------------------------------------------------- 
 Funktion :  Pt100 und Photodiode überwachen
 --------------------------------------------------------------
 Prozessor : ATmega8
 Taktfrequenz externer Quarz:    3,686411 MHz 
 Sprache : C 
 Datum : ©2010 
 Version : 1.1 
 ------------------------------------------------------------ */

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
 
 ISR (ANA_COMP_vect)                                 // Interrupt  Analog Comparator
  {
  PORTB  |= 0x04;
  while(bit_is_set (PINB,2))
   {
    for(int x=0;x<=500;x++)
     {
      PORTB |= 0x02;
      _delay_ms(2.5);
      PORTB &=~ 0x02;
      _delay_ms(2.5);
     }
   _delay_ms (200);
   for(int y=0;y<=500;y++)
    {
     PORTB |= 0x02;
     _delay_ms(3);
     PORTB &=~ 0x02;
     _delay_ms(3);
    }
   }
  }

void main (void)
{
  DDRB  = 0x03;
  PORTB = 0x04;
  PORTD = 0x00;
  DDRD  = 0x00;
  ACSR  = 0x0b; // Analog Comparator Status Register
  SFIOR = 0x08; // Multiplexer ACME Bit 1
  ADCSRA&=~(1<<ADEN);//make sure ADC is OFF 
  
    while (1)
    {
      PORTB = 0x01;
  
    _delay_ms(2500);
    PORTB = 0x00;
    _delay_ms(6000);
  
    
    ADMUX = 0; // Wert PINC0 einlesen
      asm ("nop"::);
      asm ("nop"::);
        asm ("nop"::);
        asm ("nop"::);
         
    ADMUX = 1; // Wert PINC1 einlesen
         sei ();
   
    }
}

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.