Hallo zusammen, ich bräuchte mal Hilfe zur Entwicklung eines Programms mit C. Ich soll fürs Studium eine Matrix-Tastaurabfrage mit repeat-Funktion realisieren. Wir verwenden das miniModul-537. Aufgabe dabei ist die Entwicklung einer Polling-Routine die eine zyklische Abfrage der Tasten realisiert und die Entwicklung einer Funktion die bei permanent gedrückter Taste repetierend den Tastaturcode an ein Anzeigemodul abgibt. Ausgabeports: P5.0, P5.1, P5.2 und P5.3 Eingabeports: P5.4, P5.5 und P5.6 Da ich absolut keine Ahnung vor der Materie habe hoffe ich das Ihr mir weiterhelfen könnt, ich habe schon im Netz gesucht aber nichts hilfreiches gefunden. Ich würde mich freuen wenn Ihr Anregungen oder noch besser eine Lösung für mich habt ;) Freundliche Grüße Günther
Lass den Repeat erst mal weg und bschäftige dich nur mit der Abfrage der
Matrix.
Das Prinzip einer Matrixabfrage ist bekannt?
Du hast eine Reihe von Ausgängen. Die Ausgänge sind mit den Eingängen
derart verknüpft, dass wenn du eine Ausgangsleitung aktivierst UND eine
Taste, die in der Zeile(Spalte, ja nach Verschaltung) dieser
Ausgangsleitung liegt, gedrückt ist, du an einer der Eingangsleitungen
diesen Tastendruck siehst. Die registrierst du, merkst dir, dass diese
Taste gedrückt ist. Dann gehts zur nächsten Zeile (Spalte) und wieder
kann dann eine gedrückte Taste dieser Zeile (Spalte) detektiert werden.
Macht man das reihum für alle Zeilen, dann hat man die komplette Matrix
einmal abgescannt.
> Da ich absolut keine Ahnung vor der Materie habe
Was muss man sich unter "Absolut keine Ahnung" vorstellen? So eine
Matrix ist schon kein Einsteigerprojekt mehr. D.h. zu diesem Zeitpunkt
solltest du eigentlich schon das eine oder andere Programm geschrieben
haben und zb normale Taster abgefragt und ausgewertet haben.
Günther Metzger schrieb: > Da ich absolut keine Ahnung vor der Materie habe Was hast Du dann bisher im Studium gemacht? Ich kenne das so, daß die Aufgaben auf dem Vorlesungsstoff aufbauen, sie sollen ihn vertiefen. Günther Metzger schrieb: > oder noch besser eine Lösung > für mich habt ;) Könnte ich machen, dauert etwa 10min. Würde Dir aber nichts nützen, weil: 1. der Prof sieht sofort, daß sie nicht von Dir ist. 2. Du kannst sie nicht erklären. Peter
> Da ich absolut keine Ahnung vor der Materie habe hoffe ich das Ihr mir > weiterhelfen könnt, ich habe schon im Netz gesucht aber nichts > hilfreiches gefunden. Wenn du keine Ahnung hast, warum wird dir dann diese Aufgabe gestellt? Du studierst und hast im Netz nichts gefunden?
Hi kbuchegg, danke erstmal für die rasche Antwort. Also ja das Prinzip der Matrixabfrage ist klar. Was mir fehlt ist die Programmierung mit C, da hab ich nicht wirklich viel Ahnung. Na gut, so schlecht sind meine Kentnisse bei C auch wieder nicht aber zumindest dafür reichen sie dann doch nicht ganz. Bei der Ausgabe habe ich 4 Ausgänge und 3 Eingänge. Ich habe da schon ein wenig was geschrieben:
1 | #pragma large /* use memory model 'large' */ |
2 | |
3 | #include <REG517.H> /* Register Set of 80517 controller */ |
4 | #include <stdio.h> /* Standard I/O functions */ |
5 | #include "serinit.h" /* Automatic baudrate detection */ |
6 | /*mainprogram
|
7 | |
8 | sbit P5_0 = P5^0;
|
9 | sbit P5_1 = P5^1;
|
10 | sbit P5_2 = P5^2;
|
11 | sbit P5_3 = P5^3;
|
12 | sbit P5_4 = P5^4;
|
13 | sbit P5_5 = P5^5;
|
14 | sbit P5_6 = P5^6;
|
15 | |
16 | void main (void) { /* execution starts here */
|
17 | |
18 | SerInit(); /* call automatic baudrate detection */ |
19 | |
20 | |
21 | putchar(' '); /* send dummy-Byte for compatibility */ |
22 | |
23 | printf ("\x1AHello World\n"); |
24 | |
25 | |
26 | |
27 | while (1) { /* An embedded program without any */ |
28 | /* operating system usually does not */
|
29 | /* stop and never returns. */
|
30 | /* We've used an endless loop in this */
|
31 | /* example. */
|
32 | |
33 | |
34 | P5_0=1; |
35 | if P5_4=1 |
36 | then printf("Taste 1") |
37 | else if P5_5=1 |
38 | then printf("Taste 2") |
39 | else if P5_6=1 |
40 | then printf("Taste 3") |
41 | else p5_0=0; |
42 | |
43 | printf (" char = %02bX\n",getchar()); |
44 | |
45 | /* print the two digit hex code of */
|
46 | /* any received character */
|
47 | }
|
48 | }
|
Der Anfang ist schon richig so meinte mein Betreuer aber die while Schleife ist nicht richtig bzw da muss noch mehr hin.
> Was mir fehlt ist die Programmierung mit C, da hab > ich nicht wirklich viel Ahnung. Das merkt man Das hier
1 | if P5_4=1 |
2 | then printf("Taste 1") |
3 | else if P5_5=1 |
4 | then printf("Taste 2") |
5 | else if P5_6=1 |
6 | then printf("Taste 3") |
7 | else p5_0=0; |
ist doch ein einziger Syntax/Semantic Fehler.
Du solltest dich schleunigst in C soweit auf die Rolle kriegen, bei den
Fehlern, die du hier machst. Das sind Anfängerfehler, Marke 'Erste
Lektion, erste Stunde'.
= ist nicht dasselbe wie ==
Die Bedingung in einem if steht in C in Klammern
es gibt kein then
Strichpunkte scheinen dir unbekannt zu sein.
Matrix ist schön und gut. Aber du brauchst erst mal einen Crashkurs in
C.
Und zwar rasend schnell! Was du über Weihnachten machen wirst, weißt du
jetzt ja: Einen Compiler für den PC organisieren (da gibt es einige
freie Compiler), in der Uni-Bibliothek ein C-Buch ausleihen und dann in
den 2 Wochen zumindest das erste Drittel des Buches samt Übungen
durcharbeiten.
Wie soll man sich mit jemanden über das Umformen von Gleichungen
unterhalten, wenn er schon beim kleinen 1x1 ganz offensichtlich
aussteigt und Punkt- vor Strichrechnung nicht intus hat?
> Na gut, so schlecht sind meine Kentnisse bei C auch wieder nicht
Du beliebst zu scherzen?
Wenn das was ich da sehe jetzt nicht ein Irrtum deinerseits ist
(falsches File gepostet), dann sind sie katastrophal. printf fehlerfrei
hinschreiben zu können qualifiziert nicht als 'einigermassen gute C
Kentnisse'.
Wenn du C programmierst, dann musst du auch in C programmieren und nicht
in Pascal.
Du magst dich ob der Offenheit wundern. Aber ganz brutal gesagt: Wenn du
da nicht schleunigst anfängst an deinen grundlegenden C-Fähigkeiten zu
arbeiten, dann wird das nix mit diesem Semester. Da ist nicht nur Feuer,
sondern bereits ein halber Grossbrand am Dach! Und das liegt nicht
daran, dass du noch nie µC oder eine Matrix programmiert hast. Da fehlt
es auf einer viel grundlegenderen Ebene.
Also zuerst hab ich geschrieben das es mir klar ist das ich nicht viel Ahnung vom Programmieren habe, da muss man einen nicht dumm machen wenn man keine Ahnung hat. Deswegen bin ich ja auch schließlich hier, damit einem geholfen wird. Und ebenso habe ich auch geschieben, dass die while Schleife nicht richtig ist!
Günther Metzger schrieb: > Also zuerst hab ich geschrieben das es mir klar ist das ich nicht viel > Ahnung vom Programmieren habe, da muss man einen nicht dumm machen wenn > man keine Ahnung hat. Und zu dem Zeitpunkt bin ich auch noch davon ausgegangen, dass sich das 'Keine Ahnung haben' im wesentlichen auf die Matrix bezieht. Vielleicht ein kleines Problem mit der Bitbehandlung oder im Speichern der Tastendrücke oder wie man den Autorepeat hinkriegt. Dann hast du geschrieben > Na gut, so schlecht sind meine Kentnisse bei C auch wieder nicht und was dann gekommen ist, war einfach nur ...... > Deswegen bin ich ja auch schließlich hier, damit > einem geholfen wird. Das geht nicht. Ohne das du Vorarbeit leistest, kann dir hier keiner helfen. Was soll ich dir (nur als Beispiel: in Mathe) bei Differntialrechnung helfen, wenn du mit dem Auflösen von Klammern oder simplen Gleichungsumformungen nicht klar kommst? Wenn du mir beruflich sagst, du hättest einigermassen Kentnisse in C und lieferst dann sowas ab um Hilfe zu erhalten, dann schmeiss ich dich hochkant raus. Denn das werte ich als Betrug im Einstellungsgespräch. Jemand der sich als angehender Dolmetsch ausgibt und dann radebrechtet "We is hungri on Schnitzel" hat ganz einfach dreist gelogen und das liegt nicht daran, dass er nicht weiß, wie die Engländer zu Schnitzel sagen.
hallo zusammen so ich hab mich mal ein wenig informiert und hab das folgende erreicht. Ich bin mir aber nicht sicher ob ich die spaltenabfrage brauche und wie man den Input bzw Output deklarieren kann. Ich denke mal mit stdin bzw stdout.
#pragma large /* use memory model 'large' */ #include <REG517.H> /* Register Set of 80517 controller */ #include <stdio.h> /* Standard I/O functions */ #include <serinit.h> /* Automatic baudrate detection */ //-------------------------------------------// //Zeilenabfrage// sbit P4_0 = P4^0; sbit Sp1 = P5^4; sbit Sp2 = P5^5; sbit Sp3 = P5^6; sbit Ze1 = P5^0; sbit Ze2 = P5^1; sbit Ze3 = P5^2; sbit Ze4 = P5^3; unsigned char taste = 0; int zeile=1, spalte=0; void wait (void) { /* wait function */ ; /* only to delay for LED flashes */ } void tastendruck_zeile1(void) { Ze1 = 1; if(Sp1 == 1) taste= 1; else if(Sp2 == 1) taste= 2; else if(Sp3 == 1) taste= 3; Ze1 = 0; } void tastendruck_zeile2(void) { Ze2 = 1; if(Sp1 == 1)taste = 4; else if(Sp2 == 1)taste = 5; else if(Sp3 == 1)taste = 6; Ze2 = 0; } void tastendruck_zeile3(void) { Ze3 = 1; if(Sp1 == 1)taste= 7; else if(Sp2 == 1)taste= 8; else if(Sp3 == 1)taste= 9; Ze3 = 0; } void tastendruck_zeile4(void) { Ze4 = 1; if(Sp1 == 1)taste=10; else if(Sp2 == 1)taste=11; else if(Sp3 == 1)taste=12; Ze4 = 0; } //-------------------------------------------// //Spaltenabfrage // /* sbit Sp1 = P5^0; sbit Sp2 = P5^1; sbit Sp3 = P5^2; sbit Ze1 = P5^3; sbit Ze2 = P5^4; sbit Ze3 = P5^5; sbit Ze4 = P5^6; unsigned char taste1 = 0; int zeile=0, spalte=1; void tastendruck_spalte1(void) { Sp1 = 1; if(Ze1 == 1) taste1= 1; else if(Ze2 == 1) taste1= 4; else if(Ze3 == 1) taste1= 7; else if(Ze4 == 1) taste1= 10; Sp1 = 0; } void tastendruck_spalte2(void) { Sp2 = 1; if(Ze1 == 1) taste1= 2; else if(Ze2 == 1) taste1= 5; else if(Ze3 == 1) taste1= 8; else if(Ze4 == 1) taste1= 11; Sp2 = 0; } void tastendruck_spalte3(void) { Sp3 = 1; if(Ze1 == 1) taste1= 3; else if(Ze2 == 1) taste1= 6; else if(Ze3 == 1) taste1= 9; else if(Ze4 == 1) taste1= 12; Sp3 = 0 ; } */ //------------------------------------------------------------------// //cases// void tasteerkennen(void) { switch (taste) { case 0 : break; case 1 : printf ("\x1A 1 \n"); taste=0; break; case 2 : printf ("\x1A 2 \n"); taste=0; break; case 3 : printf ("\x1A 3 \n"); taste=0; break; case 4 : printf ("\x1A 4 \n"); taste=0; break; case 5 : printf ("\x1A 5 \n"); taste=0; break; case 6 : printf ("\x1A 6 \n"); taste=0; break; case 7 : printf ("\x1A 7 \n"); taste=0; break; case 8 : printf ("\x1A 8 \n"); taste=0; break; case 9 : printf ("\x1A 9 \n"); taste=0; break; case 10 : printf ("\x1A * \n"); taste=0; break; case 11 : printf ("\x1A 0 \n"); taste=0; break; case 12 : printf ("\x1A # \n"); taste=0; break; } } void tastatur(void) { unsigned int i; /* delay var */ for (i=0; i<6000; i++) { /* delay for 12000 counts */ wait (); /* call wait function */ } /* tastendruck_spalte1(); tastendruck_spalte2(); tastendruck_spalte3(); */ tastendruck_zeile1(); tastendruck_zeile2(); tastendruck_zeile3(); tastendruck_zeile4(); tasteerkennen(); } //---------------------------------------------------------------------- ----------------------------------// //Hauptprogramm// void main() { unsigned int i; /* delay var */ serinit(); /* call automatic baudrate detection */ putchar(' '); /* send dummy-Byte for compatibility */ printf ('k'); while(1) { //serial.waitEvent(); tastatur(); P4_0 = 0; /* output to LED port */ for (i=0; i<18000; i++) { /* delay for 12000 counts */ wait (); /* call wait function */ } P4_0 = 1; /* output to LED port */ for (i=0; i<6000; i++) { /* delay for 12000 counts */ wait (); /* call wait function */ } } }
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.