Wer kann mir helfen?

Gast #60181
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 #60182
@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
Gast #60183
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
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
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
@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
@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
"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
@ 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

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.