mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wer kann mir helfen?


Autor: eXc (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Manfred Glahe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: eXc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!?!

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der PIC invertiert keine Eingänge. Woher hast Du diese Information?

Andreas

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Glahe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Jäger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: eXc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.