Forum: Mikrocontroller und Digitale Elektronik Multiplexer bei dem Analog Comparator


von Starter (Gast)


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

von Stefan B. (stefan) Benutzerseite


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.

von Starter (Gast)


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

von Stefan B. (stefan) Benutzerseite


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.

von Starter (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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

von Starter (Gast)


Lesenswert?

ich poste mal den neuen :)
einen moment

von Starter (Gast)


Lesenswert?

1
/* ------------------------------------------------------------
2
  Titel : Projekt Rauchmelder
3
 -------------------------------------------------------------- 
4
 Funktion :  Pt100 und Photodiode überwachen
5
 --------------------------------------------------------------
6
 Prozessor : ATmega8
7
 Taktfrequenz externer Quarz:    3,686411 MHz 
8
 Sprache : C 
9
 Datum : ©2010 
10
 Version : 1.1 
11
 ------------------------------------------------------------ */
12
13
#include <avr/io.h>
14
#include <util/delay.h>
15
#include <avr/interrupt.h>
16
 
17
 ISR (ANA_COMP_vect)                                 // Interrupt  Analog Comparator
18
  {
19
  PORTB  |= 0x04;
20
  while(bit_is_set (PINB,2))
21
   {
22
    for(int x=0;x<=500;x++)
23
     {
24
      PORTB |= 0x02;
25
      _delay_ms(2.5);
26
      PORTB &=~ 0x02;
27
      _delay_ms(2.5);
28
     }
29
   _delay_ms (200);
30
   for(int y=0;y<=500;y++)
31
    {
32
     PORTB |= 0x02;
33
     _delay_ms(3);
34
     PORTB &=~ 0x02;
35
     _delay_ms(3);
36
    }
37
   }
38
  }
39
40
void main (void)
41
{
42
  DDRB  = 0x03;
43
  PORTB = 0x04;
44
  PORTD = 0x00;
45
  DDRD  = 0x00;
46
  ACSR  = 0x0b; // Analog Comparator Status Register
47
  SFIOR = 0x08; // Multiplexer ACME Bit 1
48
  ADCSRA&=~(1<<ADEN);//make sure ADC is OFF 
49
  
50
    while (1)
51
    {
52
      PORTB = 0x01;
53
  
54
    _delay_ms(2500);
55
    PORTB = 0x00;
56
    _delay_ms(6000);
57
  
58
    
59
    ADMUX = 0; // Wert PINC0 einlesen
60
      asm ("nop"::);
61
      asm ("nop"::);
62
        asm ("nop"::);
63
        asm ("nop"::);
64
         
65
    ADMUX = 1; // Wert PINC1 einlesen
66
         sei ();
67
   
68
    }
69
}

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.