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!
@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
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
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?!?!
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
@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
@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
"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.
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.