Forum: Mikrocontroller und Digitale Elektronik Erste Schritte mit dem Atmega8


von Thomas M. (Gast)


Lesenswert?

Hallo,

ich habe mir schon vor einiger Zeit das MK1 (LPT) Bord bei Myavr.de 
gekauft und habe nun mal wieder Zeit um ein paar Versuche zu starten.

Ich habe mir den Quelltext für das Vergleichen von zwei externen 
Spannungen vorgenommen.
1
//----------------------------------------------------------------------
2
// Titel       : myAVR Beispiel "Komparator" für den ATmega8
3
//----------------------------------------------------------------------
4
// Funktion    : Zwei Analogwerte an PB0 und PB1 werden verglichen.
5
//             : Ist PB0 größer leuchtet LED1. Ist PB1 größer leuchtet LED2.
6
// Schaltung   : PD.7 an Poti1, PD.6 an Poti2, PB.0 an LED1, PB.1 an LED2
7
//----------------------------------------------------------------------
8
// Prozessor   : ATmega8
9
// Takt        : 3,6864 MHz
10
// Sprache     : C
11
// Datum       : 28.10.2003
12
// Version     : 1.2
13
// Autor       : Dipl. Ing. Päd. Alexander Huwaldt
14
// Programmer  :
15
// Port       :
16
//----------------------------------------------------------------------
17
#define F_CPU 3686400
18
#include <avr\io.h>
19
#include <avr\wdt.h>
20
//----------------------------------------------------------------------
21
void init(void)
22
{
23
  DDRB=0x07;                           // Set PORTB.0 und 1 als "Ausgang"
24
  PORTB=0x07;                          // Pull-up einschalten
25
  
26
}
27
//----------------------------------------------------------------------
28
main ()
29
{
30
  init();                              // Initialisierung
31
  
32
  while (true)                         // MainLoop
33
  {
34
    if (ACSR&0x20)          // Comparator Statusbit 5 auswerten
35
      PORTB=0x01;          // grüne LED on
36
    else
37
      PORTB=0x04;          // rote LED on
38
  }
39
}
40
//---------------------------------------------------------------------

Das Beispiel funktioniert mit in diesem Aufbau natürlich. Jetzt habe ich 
aber in der Doku zum Atmega8 folgendes gelesen:

AIN0 - analog Comparator, positive Input
AIN1 - analog Comparator, negative Input

Ich verstehe das jetzt so, dass ich an AIN0 verschiedene positive 
Spannungen (+) anlege und AIN1 gegen Masse schalte.

Wenn ich aber in dem Versuchsaufbau mal den Spannungsabfall über beiden 
Potis messe, dann habe ich an beiden Plus vom Mikrocontroller. (?)

von Tho W. (tommyprog)


Lesenswert?

> Wenn ich aber in dem Versuchsaufbau mal den Spannungsabfall über beiden
> Potis messe, dann habe ich an beiden Plus vom Mikrocontroller. (?)

Die Potis sind auf Masse geschalten.
Dennoch gibt es unterschiedliche Spannungen, wenn du die Poti- STellung 
voneinander Unterschiden hast PD7 anders wie bei PD6.

mfg,

tommyProg

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas M. schrieb:
> Ich verstehe das jetzt so, dass ich an AIN0 verschiedene positive
> Spannungen (+) anlege und AIN1 gegen Masse schalte.

 Nein.
 Wenn die Spannung am AIN0 höher ist als die Spannung an AIN1, wird
 AC0 gesetzt. Das ist alles.
 Man kann aber mit ACO Timer1 InputCapture starten und damit z.B.
 Periodendauer messen.

von Lukas (Gast)


Lesenswert?

Thomas M. schrieb:
> aber in der Doku zum Atmega8 folgendes gelesen:
>
> AIN0 - analog Comparator, positive Input
> AIN1 - analog Comparator, negative Input
>
> Ich verstehe das jetzt so, dass ich an AIN0 verschiedene positive
> Spannungen (+) anlege und AIN1 gegen Masse schalte.

Du kannst an AIN0 und AIN1 verschiedene positive Spannungen (auch 0V) 
anlegen, die aber nicht höher als Vcc sein dürfen.

Zum Schalten des Comparators kommt es auf das Verhältnis der beiden 
Spannungen zueinander an.

Im Datenblatt zum Mega8 steht:
"The Analog Comparator compares the input values on the positive pin 
AIN0 and negative pin AIN1. When the voltage on the positive pin AIN0 is 
higher than the voltage on the negative pin AIN1, the Analog Comparator 
Output, ACO, is set."

Grob übersetzt bedeutet das, daß wenn die Spannung am positiven Pin AIN0 
höher als am negativen Pin AIN1 ist, wird der Ausgang AC0 gesetzt.


> Wenn ich aber in dem Versuchsaufbau mal den Spannungsabfall über beiden
> Potis messe, dann habe ich an beiden Plus vom Mikrocontroller. (?)

??? Bitte Schaltplan mit gemessenen Werten.

von uwe (Gast)


Lesenswert?

> AIN0 verschiedene positive Spannungen (+) anlege und AIN1 gegen Masse
> schalte.
Wenn AIN1 Masse ist, wie willst du dann etwas Negativeres an AIN0 
anlegen als Masse damit was anderes als 1 rauskommt?

von Tho W. (tommyprog)


Angehängte Dateien:

Lesenswert?

Servus,

habe wahrscheinlich dasselbe kit wie du, nur nen myAVR Board v2 über 
USB.

Poti 1 gegen poti 2 gemessen gibt 0V, wenn beide weit aufgedreht (def. 
sache) sind.
Poti 1 weit aufgedreht gegen masse gibt 5.37V (µC- V)
Poti 1 nicht weit und Poti 2 weit aufgedreht ergibt dann auch ca. 5V.

Bei mir isses aktuell so, dass die LED bei einer gewissen Poti 
stellungen schwach leuchtet, bzw. leicht blinkt. Warum ist das so? Wegen 
der mechanik?
S. Code im Anhang.

die Pullups müssen draußen sein, weil sonst darüber zuviel Spannung 
abfällt.

Mfg,
tommyProg

: Bearbeitet durch User
von Johannes R. B. (Gast)


Lesenswert?

schau dir mal das Schaltbild eines Comparator an:

https://www.google.de/search?q=comparator&espv=2&biw=1920&bih=955&source=lnms&tbm=isch&sa=X&ei=PEM1VKr2Jaq8ygO4qYG4DA&ved=0CAYQ_AUoAQ

das ist letztlich ein OPV mit unendlicher Verstärkung... der hat als 
Eingänge die Analogen Signale V-Plus und V-Minus und überträgt diese in 
ein digitales Soignal ... das muss nicht zwingend heißen dass da 
positive und negative Spannungen oder masse dran gehöhren ... LOL guckst 
du hier:

http://en.wikipedia.org/wiki/Comparator

von Tho W. (tommyprog)


Lesenswert?

Tho Wes schrieb:
> Servus,
>
> habe wahrscheinlich dasselbe kit wie du, nur nen myAVR Board v2 über
> USB.
>
> Poti 1 gegen poti 2 gemessen gibt 0V, wenn beide weit aufgedreht (def.
> sache) sind.
> Poti 1 weit aufgedreht gegen masse gibt 5.37V (µC- V)
> Poti 1 nicht weit und Poti 2 weit aufgedreht ergibt dann auch ca. 5V.
>
> Bei mir isses aktuell so, dass die LED bei einer gewissen Poti
> stellungen schwach leuchtet, bzw. leicht blinkt. Warum ist das so? Wegen
> der mechanik?
> S. Code im Anhang.
>
> die Pullups müssen draußen sein, weil sonst darüber zuviel Spannung
> abfällt.
>
> Mfg,
> tommyProg

korrigiere, die Zeile mit dem "ACME" habe ich nun gelöscht, jetzt haut's 
wunderbar hin.


Als beweis hab ich auch das Programm ohne interrupt gemacht, und mit 
einer einfachen if-abfrage, dass wenn die Spannung U(pot1) höher wie 
U(pot2) ist, dann die rote angeht, ansonsten die grüne.

Aber ich versteh einfach nicht, was in der Anleitung
"
1   0   Eine fallende Flanke am ACO Ausgang löst einen Interrupt aus
1   1   Eine steigende Flanke am ACO Ausgang löst einen Interrupt aus"
heißt.
fallende Flanke ja, von 5V auf 3V z.B, oder steigende von 5V auf 7V, 
schon klar, aber wenn ich das aktiviere, egal welches von beiden, haut 
es mal garnicht hin. in Beiden Fällen leuchtet die LED, wie sie leuchten 
muss. Von der Vergleichslogik versteh ich fallend und steigend nicht. 
Bitte um Aufklärung.

Mfg,
TommyProg

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Bitte um Aufklärung.

Der Analog-Comparator-Ausgang (ACO) hat keine 3, 5 oder 7V. Der kennt 
nur logische Pegel. Fallende oder steigende Flanke bezieht sich also 
darauf, ob der Ausgang von H nach L oder von L nach H wechselt.

MfG Spess

von holger (Gast)


Lesenswert?

Wie brav hier doch alle auf einen 4 Jahre alten
Thread antworten;)

von Tho W. (tommyprog)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Bitte um Aufklärung.
>
> Der Analog-Comparator-Ausgang (ACO) hat keine 3, 5 oder 7V. Der kennt
> nur logische Pegel. Fallende oder steigende Flanke bezieht sich also
> darauf, ob der Ausgang von H nach L oder von L nach H wechselt.
>
> MfG Spess
Danke.
Ist damit gemeint, ob das ACO Bit im Register ACSR von 1 auf 0 wechselt 
und dann von 0 auf 1?
Was genau ist da der Ausgang von H nach L oder von L nach H?
Könntest du dich bitte präzisieren, vlt. sind das die 
Spannungsunterschiede in der jeweiligen Richtung, aber ich blick da 
irgendwie nicht so durch. Danke dir.

Mfg,
tommyProg

von spess53 (Gast)


Lesenswert?

Hi

>Ist damit gemeint, ob das ACO Bit im Register ACSR von 1 auf 0 wechselt
>und dann von 0 auf 1?

Ja. ACO ist der Analog Comparator Output.

Datenblatt:

When the voltage on the positive pin AIN0 is higher than the voltage on 
the negative pin AIN1, the Analog Comparator Output, ACO, is set.

ACO ist also 1 wenn die Spannung an AIN0 größer als die an AIN1 ist und 
0 wenn die Spannung an AIN0 gleich oder kleiner als die an AIN1 ist.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Es gibt auch noch eine AppNote von Atmel zu Analog Comparator:

http://www.atmel.com/Images/doc0934.pdf

http://www.atmel.com/images/avr128.zip

MfG Spess

von Tho W. (tommyprog)


Lesenswert?

danke dir, schau ich mir mal an.


Mfg,
TommyProg

von Tho W. (tommyprog)


Lesenswert?

Tho Wes schrieb:
> danke dir, schau ich mir mal an.

Habs jetzt durchgelesen, und ich brauch den Punkt "Using the Analog 
Comparator Interrupt".

Den Punkt 1.
"Clear interrupt....." muss ich noch befolgen, aber es läuft auch 
scheinbar so aus irgendeinen Grund, den ich nicht weiß.

Intelligenter, was nun mit steigende Flanke in diesen Zusammenhang 
gemeint ist, bin ich nicht wirklich geworden 8-(

von Lukas (Gast)


Lesenswert?

Tho Wes schrieb:
> Intelligenter, was nun mit steigende Flanke in diesen Zusammenhang
> gemeint ist, bin ich nicht wirklich geworden 8-(

... eigentlich Signalflanke. Hoffe, das trägt nicht zur weiteren 
Unklarheit bei: http://de.wikipedia.org/wiki/Signalflanke

von spess53 (Gast)


Lesenswert?

Hi

>Den Punkt 1.
>"Clear interrupt....." muss ich noch befolgen,

Datenblatt:

Bit 4 – ACI: Analog Comparator Interrupt Flag

This bit is set by hardware when a comparator output event triggers the 
interrupt mode defined
by ACIS1 and ACIS0. The Analog Comparator Interrupt routine is executed 
if the ACIE bit is set
and the I-bit in SREG is set. ACI is cleared by hardware when executing 
the corresponding interrupt
Handling Vector. Alternatively, ACI is cleared by writing a logic one 
to the flag.

>Intelligenter, was nun mit steigende Flanke in diesen Zusammenhang
>gemeint ist, bin ich nicht wirklich geworden 8-(

Machs dir doch nicht so kompliziert. ACO ist dein Signal. Und eine 
steigende Flanke ist, wenn ein Signal von 0 nach 1 wechselt. Bei einer 
fallenden Flanke ist es umgekehrt.

MfG Spess

von Tho W. (tommyprog)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Den Punkt 1.
>>"Clear interrupt....." muss ich noch befolgen,
>
> Datenblatt:
>
> Bit 4 – ACI: Analog Comparator Interrupt Flag
>
> This bit is set by hardware when a comparator output event triggers the
> interrupt mode defined
> by ACIS1 and ACIS0. The Analog Comparator Interrupt routine is executed
> if the ACIE bit is set
> and the I-bit in SREG is set. ACI is cleared by hardware when executing
> the corresponding interrupt
> Handling Vector. Alternatively, ACI is cleared by writing a logic *one*
> to the flag.

Den hab ich schon gestern befolgt.
>>Intelligenter, was nun mit steigende Flanke in diesen Zusammenhang
>>gemeint ist, bin ich nicht wirklich geworden 8-(
>
> Machs dir doch nicht so kompliziert. ACO ist dein Signal. Und eine
> steigende Flanke ist, wenn ein Signal von 0 nach 1 wechselt. Bei einer
> fallenden Flanke ist es umgekehrt.

1. Messung
Ich habe mit Poti2 nen Sollwert (z.b. 4V)
Poti ist hat nen IST- Wert mit z.b.(2V)
Da die Spannung darunter ist, geht die Grüne LED an.

Ist beim artikel Beitrag "ACO-Bit Abfrage beim Analog Comparator"
korrekt, dass ist< soll --> 1 bei Bitstelle ACO setzt, udn ist >soll 
-->0 bei ACO?
WARUM setzt er hier die logisch 1, und wo steht das?



P.s. den "Bit 5 – ACO: Analog Comparator Output
Dieses Bit ist synchronisiert und direkt mit dem Ausgang des 
Vergleichers verbunden. Die Synchronisation beinhaltet eine Verzögerung 
von 1 bis 2 Taktzyklen."
habe ich schon gelesen^^

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>1. Messung
>Ich habe mit Poti2 nen Sollwert (z.b. 4V)
>Poti ist hat nen IST- Wert mit z.b.(2V)
>Da die Spannung darunter ist, geht die Grüne LED an.

Für das Verhalten des Analog-Comperators gilt das Datenblatt. Und dort 
gibt es kein Poti, Ist, Soll oder sonst was in der Richtung, sondern nur 
Spannungen an AIN0 und AIN0.

Und wie sich der Comparator verhält habe ich hier

Beitrag "Re: Erste Schritte mit dem Atmega8"

schon beschrieben.

MfG Spess

von Tho W. (tommyprog)


Lesenswert?

spess53 schrieb:
> Hi
>
>>1. Messung
>>Ich habe mit Poti2 nen Sollwert (z.b. 4V)
>>Poti ist hat nen IST- Wert mit z.b.(2V)
>>Da die Spannung darunter ist, geht die Grüne LED an.
>
> Für das Verhalten des Analog-Comperators gilt das Datenblatt. Und dort
> gibt es kein Poti, Ist, Soll oder sonst was in der Richtung, sondern nur
> Spannungen an AIN0 und AIN0.
>

Das stimmt. Mein SOLLWert ist praktisch mein POTI2 auf AIN0 und mein 
IST- Wert auf AIN1.
Das habe ich richtig konfiguriert, nur verstehe ich dann nicht, warum er 
den Flankenunterschied beim ACSR zwischen 0b...00 und 0b.....11 nicht 
unterscheidet :/
Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken


Mfg,
tommyProg

: Bearbeitet durch User
von spess53 (Gast)


Lesenswert?

Hi

>Das habe ich richtig konfiguriert, nur verstehe ich dann nicht, warum er
>den Flankenunterschied beim ACSR zwischen 0b...00 und 0b.....11 nicht
>unterscheidet :/
>Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken

Dann zeig mal dein aktuelles Programm.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Tho Wes schrieb:

> Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken

Welcher Flankenunterschied?

Du scheinst es immer noch nicht begriffen zu haben.
Die Flanke entsteht dann, wenn sich die Spannungen verändern!

Hast du an AIN0 eine Spannung, die kleiner als die Spannung an AIN1 ist, 
und die Spannung an AIN0 wird größer, dann kippt beim Überschreiten der 
Spannungsgleichheit der Ausgang des Comperators von 0 auf 1. Hier hast 
du deine steigende Flanke!

Mit der Einstellung des Interrupts auf Flanken programmierst du also im 
Grunde eine Benachritigung, die auslöst wenn sich die Größer/Kleiner 
Beziehung der beiden Spannungen verändern. Da geht es nur um die 
relative Beziehung der beiden Spannungen untereinander: welche von 
beiden ist die Größere und verändert sich das zugunsten der anderen 
Spannung.

Wenn dein Programm das so nicht tut, dann hast du wo einen 
Programmfehler. Ohne Code wird den aber keiner sehen.

von Tho W. (tommyprog)


Angehängte Dateien:

Lesenswert?

Karl Heinz schrieb:
> Tho Wes schrieb:
>
>> Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken
>
> Welcher Flankenunterschied?
>
> Du scheinst es immer noch nicht begriffen zu haben.
> Die Flanke entsteht dann, wenn sich die Spannungen verändern!

Ja, das weiß ich schon^^. Wenn die Spannungen sich verändern, ändert 
sich das ACO je nachdem von 0 auf 1 oder von 1 auf 0.

Ich kann mich halt net so gut ausdrücken^^.
Hab einen Anstupser übers i-net gefunden, und baue noch am Programm rum, 
aber aktuelll der Code im Anhang.
(Hab dann noch eine Grüne LED reingebaut, wenn die IST- Spannung unter 
der SollSpannung liegt) also der Füllpegel beim Mehl noch nicht erreicht 
ist.

Da ich zwei Pottis benutze, sind die Spannungen voneinander unabhängig.

Mfg,
tommyProg

: Bearbeitet durch User
von Dietrich L. (dietrichl)


Lesenswert?


von Tho W. (tommyprog)


Lesenswert?

Dietrich L. schrieb:
> Tho Wes schrieb:
>> Da ich zwei Pottis benutze
>
> sowas?: http://www.thetford-europe.com/de/product/porta-potti-qube-365/
> ;-))

Nein, und ich wusste nichtmal, dass es sowas gibt; "potti" xD

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Tho Wes schrieb:
> Das stimmt. Mein SOLLWert ist praktisch mein POTI2 auf AIN0 und mein
> IST- Wert auf AIN1.
> Das habe ich richtig konfiguriert, nur verstehe ich dann nicht, warum er
> den Flankenunterschied beim ACSR zwischen 0b...00 und 0b.....11 nicht
> unterscheidet :/
> Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken

 Die Spannung am AIN0 ist höher:
  AIN0 (4.0V) --|
                |--- ACO = 1
  AIN1 (2.0V) --|

 Jetzt drehst du am Poti und erhohst den IST-Wert:
  AIN0 (4.0V) --|
                |--- ACO = 0
  AIN1 (4.5V) --|

 Die Spannung am AIN1 ist jetzt höher, ACO geht auf 0.
 Und zwar sieht das so aus:
1
          AIN0 > AIN1      AIN1 > AIN0      AIN0 > AIN
2
     ___________________                 _______________ 
3
 ACO Log.1              \    Log.0      /                Log.1
4
                        |\_____________/|                 
5
                        |               |
6
                        |               |
7
            Das ist eine Flanke        Und das auch
 Bits ACIS1,ACIS0 in ACSR entscheiden ob deine ISR bei fallender,
 steigender oder bei jeder Zustandänderung aufgerufen wird.

EDIT:
1
#define ACSR_DEFINED  0b00001000    //comparator aktiviert und externe referenzspannung eingestellt, fallende Flanke eingsetelllt
 Damit hast du Toggle eingestellt, also Interrupt auf jeder Flanke.

 Und natürlich sperrt man (zumindest beim AVR) in der ISR keine
 Interrupts.

: Bearbeitet durch User
von Tho W. (tommyprog)


Lesenswert?

Marc Vesely schrieb:
> Tho Wes schrieb:
>> Das stimmt. Mein SOLLWert ist praktisch mein POTI2 auf AIN0 und mein
>> IST- Wert auf AIN1.
>> Das habe ich richtig konfiguriert, nur verstehe ich dann nicht, warum er
>> den Flankenunterschied beim ACSR zwischen 0b...00 und 0b.....11 nicht
>> unterscheidet :/
>> Die Steuerung agiert so, dass die Flankenunterschiede nichts bewirken
>
>  Die Spannung am AIN0 ist höher:
>   AIN0 (4.0V) --|
>                 |--- ACO = 1
>   AIN1 (2.0V) --|
>
>  Jetzt drehst du am Poti und erhohst den IST-Wert:
>   AIN0 (4.0V) --|
>                 |--- ACO = 0
>   AIN1 (4.5V) --|
>
>  Die Spannung am AIN1 ist jetzt höher, ACO geht auf 0.
>  Und zwar sieht das so aus:
>
1
>           AIN0 > AIN1      AIN1 > AIN0      AIN0 > AIN
2
>      ___________________                 _______________
3
>  ACO Log.1              \    Log.0      /                Log.1
4
>                         |\_____________/|
5
>                         |               |
6
>                         |               |
7
>             Das ist eine Flanke        Und das auch
8
>
>  Bits ACIS1,ACIS0 in ACSR entscheiden ob deine ISR bei fallender,
>  steigender oder bei jeder Zustandänderung aufgerufen wird.

Hut ab, dass ist ein sehr anschauliches Zeichenbild.


> EDIT:
>
1
> #define ACSR_DEFINED  0b00001000    //comparator aktiviert und externe 
2
> referenzspannung eingestellt, fallende Flanke eingsetelllt
3
>
>  Damit hast du Toggle eingestellt, also Interrupt auf jeder Flanke.
Yep, das weiß ich, steht im Datenblatt so auch drin. Verändere ich aber
0b00001000 auf 0b00001011, macht er dasselbe wie davor, obwohle er 
eigentlich bei steigenden Flanken reagieren müsste. Das ist auch mein 
Problem.

>  Und natürlich sperrt man (zumindest beim AVR) in der ISR keine
>  Interrupts.
Oh okay. Hatte ich drin, falls es ein weiteres ISR gibt,dass evtl. 
auftreten könnte, damit mein erstes ISR trotzdem atomar abläuft. Und 
mein 2tes nicht mein 1stes ISR behindert.

Mfg,
tommyProg

von Karl H. (kbuchegg)


Lesenswert?

Tho Wes schrieb:

>>  Damit hast du Toggle eingestellt, also Interrupt auf jeder Flanke.
> Yep, das weiß ich, steht im Datenblatt so auch drin. Verändere ich aber
> 0b00001000 auf 0b00001011, macht er dasselbe wie davor, obwohle er
> eigentlich bei steigenden Flanken reagieren müsste. Das ist auch mein
> Problem.

'Dasselbe wie zuvor' heisst jetzt konkret was?

Wie muss sich das ganze denn für dich als Benutzer präsentieren.
Du hast das Poti für AIN1 auf ca. MItte gestellt (nachmessen am AVR, da 
sollte dann am AIN1 ca. die halbe Versorgungsspannung anliegen).

Das Poti für AIN0 steht an einem Ende, vorzugsweise an dem Ende, so dass 
an AIN0 eine Spannung von 0V anliegt. Nachmessen!

jetzt drehst du am AIN0 Poti.
Progrramm 1:
  wenn du mit dem AIN0-Poti ca. am selben Punkt angelangt bist, an dem 
auch das AIN1 Poti steht, überschreitet die AIN0 Spannung die Spannung 
an AIN1, der Comperator schaltet um, der Interrupt wird aufgerufen und 
deine LED toggeln. Da dein Poti unter umständen kratz, kann es auch 
sein, dass kurz darauf die SPannungsverhältnisse wieder umdrehen und der 
Interrupt noch mal feuert.
Drehst du das Poti wieder zurück, dann unterschreitet die Spannung an 
AIN0 irgendwann wieder die SPannung an AIN1. Der Comperator kippt wieder 
in die andere Lage und der Interrupt löst wieder aus.

Programm 2:
Fast so wie vorher, nur dass der Interrupt nur dann kommt, wenn du Poti 
AIN0 von wenig auf viel Spannung drehst. Beim erneuten Unterschreiten 
der Spannung an AIN1 kommt kein Interrupt mehr.


> Oh okay. Hatte ich drin, falls es ein weiteres ISR gibt,dass evtl.
> auftreten könnte, damit mein erstes ISR trotzdem atomar abläuft. Und
> mein 2tes nicht mein 1stes ISR behindert.

Die Interrupts sind sowieso vom Prozessor her gesperrt, sobald ein 
Interrupt abgearbeitet wird. Man kann also maximal (wenn man weiss was 
man tut), die Interrupts während einer ISR wieder zulassen.

: Bearbeitet durch User
von Tho W. (tommyprog)


Lesenswert?

Karl Heinz schrieb:
> Tho Wes schrieb:
>
>>>  Damit hast du Toggle eingestellt, also Interrupt auf jeder Flanke.
>> Yep, das weiß ich, steht im Datenblatt so auch drin. Verändere ich aber
>> 0b00001000 auf 0b00001011, macht er dasselbe wie davor, obwohle er
>> eigentlich bei steigenden Flanken reagieren müsste. Das ist auch mein
>> Problem.
>
> 'Dasselbe wie zuvor' heisst jetzt konkret was?
Programm1 und Programm2 verhalten sich absolut identisch.
(hab auf die Uhrzeit vom .hex- file geachtet, und passt)
Das console Output passt auch, es konnte "gerebuildet" werden.

> Wie muss sich das ganze denn für dich als Benutzer präsentieren.
> Du hast das Poti für AIN1 auf ca. MItte gestellt (nachmessen am AVR, da
> sollte dann am AIN1 ca. die halbe Versorgungsspannung anliegen).
Massenseitig am Poti von Poti zu GND gemessen liegen 2.63V an.


> Das Poti für AIN0 steht an einem Ende, vorzugsweise an dem Ende, so dass
> an AIN0 eine Spannung von 0V anliegt. Nachmessen!
Poti ist auf linksgedreht. 0V liegen an.

> jetzt drehst du am AIN0 Poti.
> Progrramm 1:
>   wenn du mit dem AIN0-Poti ca. am selben Punkt angelangt bist, an dem
> auch das AIN1 Poti steht, überschreitet die AIN0 Spannung die Spannung
> an AIN1, der Comperator schaltet um, der Interrupt wird aufgerufen und
> deine LED toggeln. Da dein Poti unter umständen kratz, kann es auch
> sein, dass kurz darauf die SPannungsverhältnisse wieder umdrehen und der
> Interrupt noch mal feuert.
> Drehst du das Poti wieder zurück, dann unterschreitet die Spannung an
> AIN0 irgendwann wieder die SPannung an AIN1. Der Comperator kippt wieder
> in die andere Lage und der Interrupt löst wieder aus.
Es agiert auch so. Ob es kratzt kann ich nicht sagen.

> Programm 2:
> Fast so wie vorher, nur dass der Interrupt nur dann kommt, wenn du Poti
> AIN0 von wenig auf viel Spannung drehst. Beim erneuten Unterschreiten
> der Spannung an AIN1 kommt kein Interrupt mehr.
Nein, es verhällt sich genauso wie bei Programm 1.

>
>> Oh okay. Hatte ich drin, falls es ein weiteres ISR gibt,dass evtl.
>> auftreten könnte, damit mein erstes ISR trotzdem atomar abläuft. Und
>> mein 2tes nicht mein 1stes ISR behindert.
>
> Die Interrupts sind sowieso vom Prozessor her gesperrt, sobald ein
> Interrupt abgearbeitet wird. Man kann also maximal (wenn man weiss was
> man tut), die Interrupts während einer ISR wieder zulassen.
Danke dir für die Information.

!Das seltsame am Messen ist, dass die Rote und Grüne LED sich abwechseln 
(mit spitze drauf leuchtet die rote, sonst die grüne z.b.), obwohl man 
nur mit einer Messspitze auf den massekontakt vom Multimeter(das 
nichtmal eingeschalten ist) kommt.!

: Bearbeitet durch User
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.