Forum: Mikrocontroller und Digitale Elektronik Wer kann mir helfen?


von eXc (Gast)


Angehängte Dateien:

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!

von Manfred Glahe (Gast)


Lesenswert?

@eXc

Ich kenne den 16F628 nicht, aber für den 16F84 würden die BANKSEL
Angaben fehlen.
Hat der möglicherweise auch noch sowas?

MfG  Manfred Glahe

von Andreas Jäger (Gast)


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

von eXc (Gast)


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?!?!

von Andreas Jäger (Gast)


Lesenswert?

Der PIC invertiert keine Eingänge. Woher hast Du diese Information?

Andreas

von Andreas Jäger (Gast)


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

von Manfred Glahe (Gast)


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

von Andreas Jäger (Gast)


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

von Peter D. (peda)


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.

von eXc (Gast)


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?

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.