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); } }
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?
Und was bedeutet die Aussage: der interrupt wird durch eine steigende flanke ausgelöst ?
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
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.
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?
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
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.