Forum: Mikrocontroller und Digitale Elektronik 4 Tasten 1Led und Autorepeat


von Axel H. (mf-futzi)


Angehängte Dateien:

Lesenswert?

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.

von Gast123 (Gast)


Lesenswert?

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 :-)

von Axel H. (mf-futzi)


Lesenswert?

>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.

von Axel H. (mf-futzi)


Lesenswert?

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.

von Axel H. (mf-futzi)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Port C, war da nicht was mit AVCC?


Peter

von Axel H. (mf-futzi)


Lesenswert?

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. :-(

von Peter D. (peda)


Lesenswert?

Du testest für die Repeatfunktion den gesamten PINC, Du mußt aber nur 
die Tasten maskieren, die auch Repeat auslösen sollen.


Peter

von Axel H. (mf-futzi)


Lesenswert?

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).

von Peter D. (peda)


Lesenswert?

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

von Axel H. (mf-futzi)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  Michael U. (amiga)

Du hast den Klassiker vergessen.

Läuft ein UART auch ohne Quarz?

;-)
Falk

von Axel H. (mf-futzi)


Lesenswert?

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

von Michael U. (amiga)


Lesenswert?

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

von Axel H. (mf-futzi)


Lesenswert?

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
Noch kein Account? Hier anmelden.