Hallo Habe eine Mega 128 und drei LEDS mit 1K Wiederständen nach 5 Volt. Ich initialisere so #include <avr/io.h> #include <stdint.h> uint8_t foo; int main() { //TASTER DDRD = (1 << DDD0) | (1 << DDD1) ; //LEDS DDRC =(0 << DDC0) | (0 << DDC1)| (0 << DDC2); PORTC |= (1<<PC0)| (1<<PC1)| (1<<PC2); return (0); } Leider tut sich nix?? Was mache ich falsch An Port D0 und D1 habe ich 2 taster mit Wiederständen gegen 5 Volt So wie im AVR Tutorial. Wenn ich die Taster Drücke resetet sich der Mega 128(Kurzschluß???)))
1 | DDRC =(0 << DDC0) | (0 << DDC1)| (0 << DDC2); |
ist eine umständliche Form der Anweisung
1 | DDRC = 0; |
Das Ganze ist damit keine Änderung gegenüber dem Zustand nach einem Reset, alle Pins von Port C stehen auf Eingang. Mein Tip: lass die sinnlose aus ,,Symmetriegründen'' geschriebenen verschobenen Nullen sein. Eine Null kannst du noch so oft schieben, es bleibt eine Null, also kann man das auch weglassen. Wie du eben gemerkt hast, ist die ,,Symmetrie'' zu den verschobenen Einsen zum Setzen eines Bits nichts wirklich wert, da sie dir nur den Blick verschleiert hat, und du gar nicht gemerkt hast, dass da noch was fehlt.
... und alle Taster liegen an Ausgängen! Du hast Ein- und Ausgänge vertauscht. Eingänge bekommen eine 0 und Ausgänge eine 1 im DDRx-Register.
Funktioniert trotzdem nicht bei Taster druck reset Atmega. LEDS leuchten nicht.
Wie hast du denn die LEDs angeschlossen? Ansonsten: Bei PORTC und Leds taucht sofort das Schlagwort 'JTAG' auf. Das hast du doch per Fuse abgeschaltet? Nimm mal den PORTB als Ausgabe her. Woher weist du eigentlich, dass der Mega128 resettet?
Habe mal dir Hexschreibweise probiert bei den LEDS PORTC=0x03 dann leuchtet die 2. Warum klappt das nicht mit der anderen schreibweise???(wie oben)
Hi, @Karl Heinz Normal hast du Recht, aber beim Mega128 liegt der JTAG auf PORTF. @Hans Peter Da sind grundsaetzliche Fehler: DDRD &= ~(1<<DDRD0) & ~(1<<DDRD1); // Setzt das Datenrichtungsregister auf Eingang DDRD |= (1<<LED1) | (1<<LED2); // Setzt das Datenrichtungsregister auf Eingang PORTD |= (1<<DDRD0) | (1<<DDRD1); // aktiviert die internen Pullups PORTD |= (1<<LED1) | (1<<LED2); // schaltet die LEDS aus weil sie gegen +5V gehen PORTD &= ~(1<<LED1) & ~(1<<LED2); // schaltet die LEDS ein weil sie gegen +5V gehen Gruß, Dirk
Ups, comment falsch DDRD |= (1<<LED1) | (1<<LED2); // Setzt das Datenrichtungsregister auf Ausgang
So habe es mal Probiert die Ausgänge funktionieren jetzt. Es muß aber heißen DDD0 nicht DDRD0 aber kein Problem. Nur eins habe ich noch die Eingänge Wenn ich den Taster Drücker resetet sich mein AVR. Was kann man dagegen tun??? Danke
> Wenn ich den Taster Drücker resetet sich mein AVR. Woher weist du das? > Was kann man dagegen tun??? Du zeigst uns dein jetziges Program, wir sagen dir was daran falsch ist. Ich rate mal: du hast den Port an dem die Taster hängen als Ausgang geschaltet. Die Pins dort sind auf high und dein Taster schaltet nach Masse -> Kurzschluss. Die Spannung bricht zusammen -> der µC resettet.
Also ich habe es so wie oben beschrieben DDRD &= ~(1<<DD0) & ~(1<<DDD1) & ~(1<<DDD4) & ~(1<<DDD5) & ~(1<<DDD6); // Setzt das Datenrichtungsregister Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert. Oder ist das falsch????
> Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert.
Äh nein.
Ich bin jetzt zu faul hier auf die Schnelle die ganzen
Negationen und UND Verknüpfungen im Kopf durchzurechnen um
zu sehen wo eine 1 übrigbleibt, aber:
Jörg hat dir schon gesagt, dass du die 0 Bits am besten
in Ruhe lässt, wenns nicht unbedingt sein muss.
Wenn du an PortD D2 und D3 als Ausgang haben willst und
alles andere als Eingang, dann kümmere dich nur um die
Ausgänge:
DDRD = ( 1 << DDD2 ) | ( 1 << DDD3 );
und fertig. Alles was nicht explizit auf 1 gesetzt wird
ist automatisch 0.
> DDRD &= ~(1<<DD0) & ~(1<<DDD1) & ~(1<<DDD4) & ~(1<<DDD5) & > ~(1<<DDD6); > Das hesit D0-6 ausgenommenD2 und D3 sind als Eingang programmiert. > Oder ist das falsch???? Alle Bits die auf 1 sind, definieren den zugehörigen Port-Pin als Ausgang. Schaun wir mal: ~ 1 << DDD0 0b00000001 0b11111110 1 << DDD1 0b00000010 0b11111101 wenn ich die beiden jetzt UND Verknüpfe kommt raus: 0b11111100 Das wäre also: D2 bis D7 sind Ausgang, D0 und D1 sind Eingang. Die weiteren Terme wirken auf gleiche Weise und setzen ihrerseits jeweils ein Bit auf 0. D.h. im Endeffekt kommt raus: 0b10001100 Also: D0, D1, D4, D5, D6 als Eingang D2, D3, D7 als Ausgang Aber: das ganze wird noch mit dem momentanen Zustand von DDRD UND Verknüpft DDRD &= ..... und DDRD hat beim Einschalten des AVR den Wert 0. D.h. deine ganze schöne DD-Maske ist für die Katz. Denn wenn du die mit 0 ver-undest, bleiben nur 0 Bits übrig.
Hier der Code zur Prot initilisierung DDRC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2)| (1<<DDC3); DDRD |= (1<<DDD7); PORTD |= (1<<DDD7); PORTC |= (1<<DDC0) | (1<<DDC1) | (1<<DDC2) | (1<<DDC3); Port C0-C3 als Ausgang geht auch Port D7 als Ausgang geht auch Port D0-D6 als Eingang geht nicht AVR bricht zusammen reset bei tastendruck Schalte alle Ausgänge LEDS aus geht auch
Habe das Problem behoben wer lesen kann ist klar im Vorteil Habe statt 10KOhm nur 10 Ohm eingelötet deshalb der Kurzschluß. Nun habe ich 10KOHM und es geht. Danke nochmal
Wo kommen da jetzt auf einmal Widerstände her? Wenn du nur einen Schalter an einen Pin hängst, brauchst du keine externen Pull-up Widerstände. Die hat dein Prozessor eingebaut. Brauchst du nur einschalten.
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.