Hallo an alle, ich wende mich mal wieder mit einem Problem an Euch. Ich habe an meinem board 4 Taster und eine LED. uC ist ein Atmega8. In ASM habe ich eine Entprellroutine nachgebaut (nach P.Dannegger = echt genial). In meinem Programm wird bei jedem Drücken auf einen Taster die LED getogglet. Beim Drücken der Taste 2 oder 3 wird die LED mit Autorepeat getogglet. Das funktioniert soweit ganz gut. Wenn ich nun aber meinen ext. Quarz mit 3686400Hz dranhänge, die Fuses brenne und im Programm Xtal ändere, dann funktioniert nur noch das togglen, aber nicht mehr das Autorepeat. Ich bin schon längere Zeit am Suchen und probieren, aber ich finde nicht die Lösung. Wäre toll, wenn mir jemand mit einem Tipp helfen könnte.
Blinkt die Led jetzt vielleicht so schnell, dass du es garnicht mehr siehst? Die Led dürfte dann so aussehen als wäre sie immer an, aber eben nicht ganz so hell wie "immer immer" ;-) Hast du deine Warteroutine angepasst, damit nun eben mit schnellerem Quarz mehr Takte gewartet wird, um die selbe Blinkfrequenz zu erzielen? Bitte eine genauere Beschreibung was denn nun funktioniert oder was nicht :-)
>Bitte eine genauere Beschreibung was denn nun funktioniert oder was >nicht :-) Es funktioniert, dass sich bei jedem Drücken einer Taste(1 od. 2 od. 3 od. 4) der Zustand der LED ändert. Es funktioniert nicht, dass sich beim Gedrückthalten der Taste 2 od. 3 der Zustand der LED selbständig im eingestellten Rhythmus ändert (blinkt/Autorepeat). Ich habe auch schon den Wert von KEY_REPEAT_NEXT in beide Richtungen verändert, ohne Ergebnis. Arbeite ich ohne ext. Quarz, funzt beides wunderbar.
Hallo, also ich hab jetzt noch etwas probiert. Wenn ich im Programm die Zuweisung auf Taster/PortD und die LED/PortB verändere, und die Kabel von LED und Taster vertausche, dann geht's. ???? Aber man kann doch jeden Pin als Eingang oder Augang konfigurieren? Oder täusche ich mich da? Wär nochmal für einen Tipp dankbar.
Hallo nochmal, hat da niemand eine Idee? Also wenn ich schreib .equ led_port = PORTB ; LEDs .equ led_ddr = DDRB .equ KEY_PIN = PIND ; Tasten .equ KEY_PORT = PORTD .equ KEY_DDR = DDRD dann geht Autorepeat. Und wenn ich schreib .equ led_port = PORTB ; LEDs .equ led_ddr = DDRB .equ KEY_PIN = PINC ; Tasten .equ KEY_PORT = PORTC .equ KEY_DDR = DDRC dann geht es nicht mehr. Ich habe an PORTD mein LCD angeschlossen, deshalb sollen die 4 Taster an PORTC.
Hallo Peter,
>Port C, war da nicht was mit AVCC?
...das hatte ich im Forum bereits gefunden und habe AVCC und VCC
(Pin20/Pin7) miteinander verbunden. Leider ohne Erfolg. :-(
Du testest für die Repeatfunktion den gesamten PINC, Du mußt aber nur die Tasten maskieren, die auch Repeat auslösen sollen. Peter
Hallo Peter, ich hoffe die Frage ist für dich nicht zu doof, aber warum funktioniert alles, wenn ich mit PortD als Tasteneingang arbeite?? Ich ändere nur die Zuweisung des Ports D -> C und stecke die Kabel der Taster um. Nur um den Fehler einzukreisen, hab auch schon das Programmerkabel abgeklemmt und die Brücke zum Resetknopf entfernt (PC6 ist über eine Brücke mit RS verbunden).
Axel Hüser wrote: > Hallo Peter, > > ich hoffe die Frage ist für dich nicht zu doof, aber warum funktioniert > alles, wenn ich mit PortD als Tasteneingang arbeite?? Ohne Maskierung nimmst Du alle Bits. Warscheinlich ist ein Bit 0 und dann läuft die Repeatfunktion los. Peter
Hallo Peter, dein Tipp >Du testest für die Repeatfunktion den gesamten PINC, Du mußt aber nur >die Tasten maskieren, die auch Repeat auslösen sollen. >Ohne Maskierung nimmst Du alle Bits. >Warscheinlich ist ein Bit 0 und dann läuft die Repeatfunktion los. ...hat die Lösung gebracht. :-) Ich habe den Code ergänzt: in r0, KEY_PIN ; Tasten einlesen ldi temp1, 0b00001111 ; in temp1 bit0 bis bit3 'aktiviert' com r0 ; aus 0 wird 1 and r0, temp1 ; durch UND-Verknüpfung werden bit4 ; bis bit7 'deaktiviert' (Das Ganze funktioniert auch ohne Verbindung von VCC mit AVCC.) Vielen Dank Axel
Hallo, @Axel Hüser: >Das Ganze funktioniert auch ohne Verbindung von VCC mit AVCC.) Stimmt. Atmel hat die Pins nur aus Langeweile angebracht, daß die Versorgung auch über irgendwelche internen Wege geht, hast Du ja jetzt bewiesen.. Bleibt die Frage: wie lange lassen sich die internen Strukturen des Mega8 für die von Atmel ungeplante Versorgung der Logik von PortC mißbrauchen? So schafft man sich nicht tolle Erkenntnisse, sondern eingebaute Fehlerquellen, die dann eben zur nächsten Frage hier im Forum führen: Warum geht meine Schaltung plötzlich nicht mehr? Die ging doch die ganze Zeit! Kann an einem Mega8 plötzlich der PortC kaputt gehen? Warum muß ich bei Schaltung xxx jetzt AVcc und alle GND anschließen, bei meiner Mega8_Schaltung ging das doch auch ohne? Beliebig fortzusetzen und einzusortieren bei: Braucht eine LED wirklich einen Vorwiderstand? Brauch ich die 100n an Ub vom AVR unbedingt? Müssen die 100n an den 7805 wirklich ran? ;-))) Gruß aus Berlin Michael
@ Michael U. (amiga) Du hast den Klassiker vergessen. Läuft ein UART auch ohne Quarz? ;-) Falk
Hallo Michael, ich hab jetzt nochmal im Datenblatt unter AVcc (S.6) nachgesehen. Also wenn ich das Datenblatt richtig verstehe, sollte ACC mit AVCC bei Verwendung von PortC verbunden werden. (Auch wenn's in diesem Fall trotzdem funzt) Hab ich dich (und das DB) so richtig verstanden? Ich werde die Verbindung wieder herstellen, kein Problem. Axel
Hallo, richtig. AVcc versorgt auch die Logi des PortC, wenn nicht die ADC benutzt werden. Daß AVcc getrennt rausgeführt wird, ist nur, um zusätzliche Entstörmaßnahmen bei ADC-Nutzung einbauen zu können. Wenn es nicht ausdrücklich im Datenblatt erwähnt ist, gilt immer die Regal: ALLE (A)Vcc-Pins anschließen, ALLE GND-Pins anschließen. An ALLEN (A)Vcc und GND-Paaren jeweils dicht am Chip einen 100n. Bei mehreren Pins für die gleiche Funktion kann z.B. die interne Strombelastbarkeit überschritten werden, wenn nicht alle angeschlossen sind. Auch dann, wenn sie intern auf dem Chip verbunden sind. Die Bonddrähte sind schließlich keine 1,5^2 Leitungen. ;-) Solche Regeln immer einzuhalten, spart oft die stundenlange Suche nach Fehlern, die keine sind. Gerade weil es scheinbar geht und nach der nächsten Änderung nicht mehr, sucht man dann oft am völlig falschen Ende... Gruß aus Berlin Michael
Hallo Michael, das hat alles geklärt. Werde ich sofort auf meinem Board berücksichtigen. Danke
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.