Hallo, arbeite Grad mit AVR Studio (zum allerersten mal) und wollte wissen wie ich mit C und der Headerdatei <avr/io.h> eine einfach Taster"steuerung" mache. Also mit "if ( *port & (1 << pin) )" dieser oder jener Eingang 1 dann Ausgang Port(z.B.:B) dieser oder jener Ausgang high. Würde mit PORTX = 0xff auch einfach mal alle pulluppen, also wärs eig besser mit "if eingang X = low". Bitte lasst doofe Kommentare - Ich hab gesucht und nichts gefunden, ausserdem bin ich ein noob =)
Zunächst brauchst du erstmal was zur Entprellung: http://www.mikrocontroller.net/articles/Entprellung Alles weitere ergibt sich dann automatisch. ;) - gerd
Hi, hab beides schon durchgemacht.. Bzw beim AVR-GCC bin ich grade dabei. Allerdings find ichs da eben nicht. =/
Ich hab mir zum Enprellen dies hier angesehen, nur falls jemand interessiert. Beitrag "Entprellen für Anfänger"
Schwachströmler schrieb: > Hi, hab beides schon durchgemacht.. Ähem, kann ich nicht so recht glauben. Gerade in den Debounce-Beispielen von Peter Dannegger wird genau das gemacht, was du in deinem Eingangsposting erfragst. - gerd
Genau bei dem häng ich gerade. Wie müsste das aussehen, ohne debounce? Will bei der Simulation beim AVR Studio die ganze Zeit den Ausgang auf High bringen, aber schaffs nicht.
Schwachströmler schrieb: > Genau bei dem häng ich gerade. > > Wie müsste das aussehen, ohne debounce? Nicht 'ohne' Du brauchst einen debounce d.h. in manchen Fällen brauchst du ihn nicht. Man muss unterscheiden zwischen * etwas soll passieren (zb eine LED soll leuchten) solange eine Taste gedrückt wird * etwas soll passieren, wenn eine Taste gedrückt wird. Der Unterschied ist wie die Fensterheber in einem Auto. In manchen Autos wird das Fenster bewegt, solange du eine Taste drückst. Drückst du, fährt die Fensterscheibe. Lässt du die Taste los, hört auch die Bewegung auf. Der andere Fall ist: Du drückst eine Taste und eine LED leuchtet auf. Du lässt die Taste los und nichts weiter passiert. Drückst du erneut auf die Taste so geht die LED wieder aus. Lässt du los passiert nichts weiter. Der erste Fall ist der einfachere. Man muss dort auch nichts entprellen
1 | int main() |
2 | {
|
3 | ....
|
4 | |
5 | while( 1 ) { |
6 | |
7 | if( !( PORTB & ( 1 << TASTER_PIN ) ) ) |
8 | schalte LED ein |
9 | else
|
10 | schalte LED aus |
11 | }
|
12 | }
|
hier steht klipp und klar: Taste gedrückt -> Led ein Taste nicht gedrückt -> Led aus und damit ergibt sich dann der Fall, dass die LED genau dann und nur dann leuchtet, wenn die Taste gedrückt ist. Dazu muss man auch nichts entprellen Der andere Fall ist etwas komplizierter. Dazu muss man entprellen. Und am einfachsten nimmt man dazu zb die 'Komfortlösung' auf der weiter oben angegebenen Wiki-Seite
Karl heinz Buchegger schrieb: >> Wie müsste das aussehen, ohne debounce? > > Nicht 'ohne' > Du brauchst einen debounce >> Will bei der *Simulation beim AVR Studio* die ganze Zeit den Ausgang auf >> High bringen, aber schaffs nicht. Im Simulator ist das Debounce nicht unbedingt notwendig (obwohl die Simulation dort nicht schadet, wenn es später auf die Hardware gehen soll). Schwachströmler sollte halt mal seinen bisherigen Quellcode zeigen und angeben, was er im Simulator macht bzw. was er machen will und was nicht funktioniert.
Schwachströmler schrieb: > Wieso wird da eine Schleife mit While gebraucht? Weil du wohl kaum eine Taste in ein paar Nanosekunden drücken kannst, die der µC braucht um dein Programm ohne die Schleife zu Ende abzuarbeiten. AVR-GCC-Tutorial Fang vorne an zu lesen. Die Sache mit "was brauch ich an Hardware, was brauch ich an Software und wie installiere ich sie" kannst du überlesen. Das Kapitel 9 wäre ein ganz guter Einstiegspunkt.
Schwachströmler schrieb: > Wieso wird da eine Schleife mit While gebraucht? Vielleicht solltest du das AVR-GCC Tutorial mal gewissenhaft durcharbeiten. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Einf.C3.BChrungsbeispiel - gerd PS: Tipp - schau dir zeile 5a und die Erklärung dazu an.
/* Alle Zeichen zwischen Schrägstrich-Stern und Stern-Schrägstrich sind lediglich Kommentare */ // Zeilenkommentare sind ebenfalls möglich // alle auf die beiden Schrägstriche folgenden // Zeichen einer Zeile sind Kommentar #include <avr/io.h> // (1) int main (void) { // (2) DDRB = 0xff; // (3) PortB = Ausgänge // PORTB = 0x00; // (4) PINC = 0b1011101; // Pull-UPs DDRC = 0x00; // PortC = Eingänge while(1) { // (5a) Hauptschleife if (PORT3==1) PORTB = PINB | (1 << PD7); } // (5c) return 0; // (6) } was macht ich falsch=?
Schwachströmler schrieb: > /* Alle Zeichen zwischen Schrägstrich-Stern > und Stern-Schrägstrich sind lediglich Kommentare */ > > // Zeilenkommentare sind ebenfalls möglich > // alle auf die beiden Schrägstriche folgenden > // Zeichen einer Zeile sind Kommentar Jupp, das wissen wir... :-/ > was macht ich falsch=? Was erwartest du von dieser Zeile: > if (PORT3==1) > was macht ich falsch=? Was sagt der Compiler?
#include <avr/io.h> int main(void){ DDRD |= _BV(PD0); //Ausgang definieren (LED) DDRC &= ~_BV(PC0); //Eingang definieren (Taster) PORTC|= _BV(PC0); //internen Pull-Up-Widerstand einschalten while(1){ if (bit_is_clear(PINC,0)) {PORTD &=~_BV(PD0);} //LED an else {PORTD |=_BV(PD0);} //LED aus } return(0); } Machs so!
Und hier > PORTB = PINB | (1 << PD7); wird der PortB7 bestenfalls einmal gesetzt und bleibt dann in alle Ewigkeit so. Du könntest allerdings einfach den Portpin auf Masse kurzschliessen, dann wird er wieder gelöscht (weil dann PINB7 0 wird)... > PORTB = PINB | (1 << PD7); Glück gehabt, dass PD7 genauso wie PB7 definiert ist...
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.