Wer kann mir helfen?

Gast #60181
Lesenswert?

Hallo, ich bin am Verzweifeln! Ich möchte nur eine Matrixtastatur
abfragen. Aber es funktioniert einfach nicht und ich finde den Fehler
nicht. Ich vermute es hat was mit der internen Invertierung zu tun
vielleicht?! Code ist im Anhang. Wäre schön wenn mal jmd drüber gucken
könnte. Ist bestimmt ein ziemlich dummes Problem! Anschlussplan der
Tastatur ist auch mit dabei! PortA ziehe ich durch externe R's auf
Masse oder auf +5. Geht beides nicht!
Angehängte Dateien:
Gast #60183
Lesenswert?

Hallo eXc,

ich programiere zwar nicht in C aber:

>PORTA=0x00;

Ist überflüssig, da Du vorher PORTA als Eingang setzt. Dann kannst Du
nichts ausgeben.

>PORTB = 128;   // RB7
>tmpA = PORTA;
>tmpA &= 0b.0000.1111; //Pegel an den RA4-7 ignorieren

Was soll das mit 'tmpA', wenn Du im Weiteren gar nicht mit 'tmpA'
arbeitest? Du blendest zwar die Bits 4-7 in 'tmpA' aus. fragst aber
dann PORTA direkt ab???

>if(PORTA.0) {Delay1ms(100); taste = 1; while(PORTA.0){}; break; } //
RA0
>if(PORTA.1) {Delay1ms(100); taste = 4; while(PORTA.0){}; break; } //
RA1
>if(PORTA.2) {Delay1ms(100); taste = 7; while(PORTA.0){}; break; } //
RA2
>if(PORTA.3) {Delay1ms(100); taste =10; while(PORTA.0){}; break; } //
RA3

Das soll bestimmt so sein (beachte while...!):

if(PORTA.0) {Delay1ms(100); taste = 1; while(PORTA.0){}; break; } //
RA0
if(PORTA.1) {Delay1ms(100); taste = 4; while(PORTA.1){}; break; } //
RA1
if(PORTA.2) {Delay1ms(100); taste = 7; while(PORTA.2){}; break; } //
RA2
if(PORTA.3) {Delay1ms(100); taste =10; while(PORTA.3){}; break; } //
RA3


Andreas
Gast #60184
Lesenswert?

Hmm.. keine Ahnung was das ist ;) Ich bin ziemlich neu was das angeht.
Ich vermute jedoch, daß der PIC die Eingänge intern invertiert und ich
das irgentwie nicht berücksichtigt habe. Z.B. Aus 00010000 wird
11101111 und dann stimmt ja die abgefragte Zahl auch nicht mehr?!?!
Gast #60186
Lesenswert?

1) Ich habe zwar die Docus nicht im Kopf, aber ich glaube Port B hat bei
dieser PIC-Familie interne Pull-UP Widerstände. Ich würde dann die
Matrix so aufbauen, dass PORTB als Eingang konfiguriert ist (und die
Pull-UPs natürlich einschalten). Es sind dann keine externen
Widerstände nötig.

2) Vielleich solltest Du mal erklären, was nicht funktioniert.

Andreas
Gast #60187
Lesenswert?

@eXc

Ich habe mal im Datenblatt nachgeschaut und festgestellt, daß der
16F628 4 Registerbänke hat. Um TRISA/B ausführen zu können muß Du erst
auf Bank1 schalten.
Wo machst Du das???

MfG  Manfred Glahe
Gast #60188
Lesenswert?

@Manfred

>Ich habe mal im Datenblatt nachgeschaut und festgestellt, daß der
>16F628 4 Registerbänke hat. Um TRISA/B ausführen zu können muß Du
>erst auf Bank1 schalten.
>Wo machst Du das???


Sowas müsste doch der Compiler regeln. Das ist doch das mindeste...

Andreas
#60189
Lesenswert?

"Aber es funktioniert einfach nicht"

Bei so einer Aussage kann Dir auch keiner helfen !!!

Du must schon sagen, was die erwartete Funktion ist und was die
beobachtete.


Peter


P.S.:
Ich sage unseren Kunden immer wieder, Reparaturen ohne
Fehlerbeschreibung kosten mindestens das doppelte. Aber manche scheinen
einfach zuviel Geld zu haben.
Gast #60190
Lesenswert?

@ Andreas: Mit der While() haste Du natürlich Recht. Das ist beim
Copy&Paste passiert bzw. das sind ein paar übriggebliebende
Testveränderungen um den Fehler zu finden! Genauso wie tmpA. Das stand
auch mal in der if-Anweisung drin.

Was nicht funktioniert: Die Befehle in der if-Anweisung werden nie
bearbeitet. Also entweder stimmt da die Bedingung nicht oder der Wert
wird nie erreicht?! Wenn ich eine Taste drück und gerade der Output ein
H auf die entsprechende Spalte gibt, kann ich am Eingang klar erkennen,
daß das H dorthin weitergegeben wird. Also PortA ist normal L (durch
externe Pulldowns) und wenn ich eine Taste drücke wird der H
(LED-Kontrolle an den Ports).

Hmm.. was könnte das sein?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren