Forum: Mikrocontroller und Digitale Elektronik LED Taster interrup at90can


von peter (Gast)


Lesenswert?

Hallo,

ich arbeite mit 2 at90can und möchte mit einem taster an einem uC eine 
LED an dem anderen uC zum leuchten bringen.
Das ganze soll durch einen interrupt geschehen.
Kennt sich hier jemand gut aus?

Anbei der Part, der schonmal dazu führt, die LED an einem uC zum 
Leuchten zu bringen.

  DDRF |= (1<<PF0);    //Ausgang
  DDRD &=~ (1<<PD0);    //PD0 als Eingang
  PORTD |=(1<<PD0);    //internen Pull-up einschalten
  while(1)
  {
    a=PIND & (1<<PD0);
    if (a!=0)      //wenn Taster nicht gedrückt
    {
      PORTF &=~(1<<PF0);
    }
    else        //wenn Taster gedrückt
    {
      PORTF |= (1<<PF0);
    }
  }

von Rudolph R. (rudolph)


Lesenswert?

Kapitel 10.1 im Datenblatt, schau Dir mal das EICRA Register an.

von peter (Gast)


Lesenswert?

Hat mal jemand so etwas in diese Richtung gemacht?

Ist es dann generell möglich einmal den Code auf einen Mikrocontroller 
zu compilieren (heißt für alle Teilnehmer auf den Bus legen) und den 
Taster dann einem uC zu steuern?

von peter (Gast)


Lesenswert?

Und was bedeutet die Aussage: der interrupt wird durch eine steigende 
flanke ausgelöst ?

von Karl H. (kbuchegg)


Lesenswert?

peter schrieb:
> Und was bedeutet die Aussage: der interrupt wird durch eine steigende
> flanke ausgelöst ?

Na ja. steigende Flanke eben.

Du hast einen Draht. Auf dem Draht können 0V liegen oder auch 5V. Je 
nachdem ob dein Taster geschlossen ist oder auch nicht bzw. was 
derjenige mit dem 'Draht' veranstaltet, der ihn ansteuert.

Betrachten wir das mal zeitlich (die X-Achse ist die Zeit), dann ergibt 
sich ein Diagramm
1
      |
2
  5V  +     +-------+          +---------------+
3
      |     |       |          |               |
4
      |     |       |          |               |
5
  0V  +  ---+       +----------+               +----------
6
      |------------------------------------------------------> zeit

in dem an sieht, wie sich die Spannung mit der Zeit ändert, weil eben 
derjenige der die Spannung am Draht steuert, die jeweils andere Spannung 
anlegt. Jedesmal wenn sich die Spannung ändert, dann nennt man das eine 
Flanke. Welches wird also die steigende Flanke sein? Wodurch ist sie 
charakterisiert - im Gegensatz zu einer fallenden Flanke?


Zum Rest:
Ich denke mir ist schon klar, was du willst. Aber deine Ausführungen und 
Fragestellungen sind irgendwie so konfus, dass ich denke, das das mit 
dem Erklären ein Fass ohne Boden wird.

: Bearbeitet durch User
von peter (Gast)


Lesenswert?

Karl H. schrieb:
> Zum Rest:
> Ich denke mir ist schon klar, was du willst. Aber deine Ausführungen und
> Fragestellungen sind irgendwie so konfus, dass ich denke, das das mit
> dem Erklären ein Fass ohne Boden wird.

Wärst du so freundlich und könntest es versuchen mir zu erklären bzw. 
mir zu helfen?
Das würde mich wirklich weiter bringen.

von peter (Gast)


Lesenswert?

static void initialize()
{
//Init Taster
DDRD &=~ (1<<PD0);    //PD0 als Eingang
EIMSK |= (INT0);                // Interrupt fuer Pin 0 aktivieren
EICRA |= (ISC00);               // steigende Flanke erzeugt einen INT
EICRA |= (ISC01);

//Init LED
DDRF |= (1<<PF0);  //PF0 als Ausgang

sei();
}

//  ISR Taster
SIGNAL(SIG_INTERRUPT0)
{
  // LED an
  PORTF |= (1<<PF0);

  // entprellen
  _delay_ms(1000);
}

Habe es mal so versucht. Das funktioniert aber noch nicht.
Wo liegen meine Fehler?

von Karl H. (kbuchegg)


Lesenswert?

peter schrieb:
> Karl H. schrieb:
>> Zum Rest:
>> Ich denke mir ist schon klar, was du willst. Aber deine Ausführungen und
>> Fragestellungen sind irgendwie so konfus, dass ich denke, das das mit
>> dem Erklären ein Fass ohne Boden wird.
>
> Wärst du so freundlich und könntest es versuchen mir zu erklären bzw.
> mir zu helfen?
> Das würde mich wirklich weiter bringen.

Erst mal denke ich, du solltest mit dir selber ins reine kommen, was du 
eigentlich willst!

Ich denke, du willst
1
                  erster                             zweiter
2
                 at90can (A)                        at90can (B)
3
 
4
                                                                 Vcc
5
                                                                  |
6
                +------+                            +-------+    LED
7
                |      |                            |       |     |
8
           +----o      |                            |       o-----+
9
           |    |      |     Leitung                |       |
10
 Taster   \     |      o----------------------------o       |
11
           |    |      |                            |       |
12
      GND -+-   +------+                            +-------+

d.h. am Prozessor A ist ein Taster angeschlossen
Der Prozessor überwacht den Taster und wenn er ein Niederdrücken 
detektiert
dann schaltet er die Leitung zum Prozessor B um

Der Prozessor B wiederrum überwacht die Leitung in der Form, dass er mit 
einem Interrupt auf die steigende Flanke an dieser Leitung reagiert. In 
der entsprechenden Behandlung dieses Interrupts wird die LED 
eingeschaltet. Darüber wie die LED wieder ausgeschaltet wird, hast du 
noch nichts gesagt.

Was soll ich jetzt in diesem Zusammenhang mit einer Aussage wie dieser 
hier
> Ist es dann generell möglich einmal den Code auf einen Mikrocontroller
> zu compilieren (heißt für alle Teilnehmer auf den Bus legen) und
> den Taster dann einem uC zu steuern?
anfangen?
Bus? Welcher Bus? Wo kommt da auf einmal ein Bus her? Bis jetzt haben 
wir 2 bis auf die verbindende Leitung (und GND) voneinander unabhängige 
µC. Jeder arbeitet sein eigenes Programm ab. Wo kommt da jetzt auf 
einmal ein Bus ins Spiel?
Alle Teilnehmer? Wer sind 'Alle'. Es gibt nur 2 Teilnehmer. Der eine, 
der sich um die Taste kümmert und der andere der sich um die LED 
kümmert. Wenn der eine etwas vom anderen will, dann schaltet er die 
Leitung um und fertig.
'den taster dann mit einem uC zu steuern'. Ein Taster wird nicht von 
einem µC gesteuert. Auf einen Taster drückt ein Benutzer drauf. Den kann 
ein µC genau gar nicht steuern. Er kann die Leitung überwachen, ob der 
Benutzer auf den Taster draufgetatscht hat oder nicht, das ist aber 
schon alles was er kann. Etwas steuern heisst es zu beeinflussen. Der µC 
kann den Taster nicht beeinflussen. Er hat keine Kontrolle darüber, ob 
ein Mensch auf den Taster draufdrückt oder nicht.

Und du merkst schon. Das alles hat noch überhaupt nichts damit zu tun, 
WIE der µC B die Leitung überwacht. Der kann das normal machen so wie 
man eben den Zustand eines Pins einliest und auswertet, oder aber er 
kann sich einen Interrupt auf den Pin mit dieser Leitung aufschalten, so 
dass der Interrupt ausgelöst wird, wenn der Prozessor A die Leitung von 
0 auf 1 zieht (also eine steigende Flanke erzeugt). Das alles ist von 
deiner konfusen Fragestellung so weit weg, dass ich dieses Fass ohne 
Boden lieber nicht aufgreife.

: Bearbeitet durch User
von MArkus S. (markus1991)


Lesenswert?

Ok, erstmal vielen Dank für die Antwort und die damit verbundene Geduld.

Beim Durchlesen ist mir aufgefallen, dass ich mich wirklich dämlich und 
missverständlich ausgedrückt habe.

Deshalb versuche ich es noch einmal:

Ich habe bereits die Kommunikation zwischen den beiden Mikrocontrollern 
über CAN hergestellt. Ich arbeite nämlich in einem Projekt, bei dem die 
beiden Mikrocontroller über CAN untereinander kommunizieren sollen.
Aus dem Grund sollte auch das Ansteuern der LED durch den Taster über 
CAN erfolgen.

Im Moment bin ich soweit, dass ich eine LED zum blinken bringe, sobald 
der eine at90can eine nachricht mit einer speziellen ID empfängt und das 
wollte ich nun durch den Taster erweitern.

Macht das jetzt mehr Sinn?

von MArkus S. (markus1991)


Lesenswert?

Karl H. schrieb:
> Darüber wie die LED wieder ausgeschaltet wird, hast du
> noch nichts gesagt.

Die LED soll wieder ausgehen, sobald der Taster nicht mehr gedrückt ist.

von Rudolph R. (rudolph)


Lesenswert?

Frag doch einfach vor dem Verschicken der Botschaft den Pin ab.

a=PIND & (1<<PD0);
...
CANMSG = a;
...

Für den Anfang passt es ja, wenn man das einfach zyklisch macht, etwa 
alle 100ms.
Weder braucht man dafür einen externen Pin-Interrupt, noch muss man das 
für die Anwendung überhaupt entprellen.
Und ein Delay in einer ISR ist nebenbei gesagt auch keine Entprellung.

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.