von
Stefan (Gast)
20.07.2012 12:29
Hallo,
ich habe vor einen Befehl über die Tastatur an einen Atmega32 zu senden.
Momentan leite ich die Tasteneingabe direkt an den Uart um eine Ausgabe
zu erhalten. Was mich ein bisschen stutzig machte war die Ausgabe zur
Enter-Taste: " ,_/" Stimmt die Ausgabe ? Wenn ja was könnte in der
überprüfung Enter ja/nein in der zeile 192 falsch sein. Bitte nicht über
das schlechte coding ärgern...ich programmiere noch nicht so lange und
möchte es gerne besser machen. Also: Danke für jeden Tipp!
Mfg Stefan 1 /* this keyboard interface is based on avr appnote 313
2 changes are made for using avr-gcc and atmega8 processors
3 beck@informatik.htw-dresden.de
4 */
5
6 #include <avr/pgmspace.h>
7 #include "kb.h"
8 #include "uart.h"
9 #include "gpr.h"
10 #include "pindefs.h"
11 #define BUFF_SIZE 64
12 #include <string.h>
13
14 void decode ( unsigned char sc );
15 void put_kbbuff ( unsigned char c );
16
17 volatile unsigned char edge , bitcount ; // 0 = neg. 1 = pos.
18
19 unsigned char kb_buffer [ BUFF_SIZE ];
20 volatile unsigned char * inpt , * outpt ;
21 volatile unsigned char buffcnt ;
22
23
24 void init_kb ( void )
25 {
26 inpt = kb_buffer ; // Initialize buffer
27 outpt = kb_buffer ;
28 buffcnt = 0 ;
29 GIMSK = ( 1 << INT0 );
30 MCUCR = 2 ; // INT0 interrupt on falling edge
31 edge = 0 ; // 0 = falling edge 1 = rising edge
32 bitcount = 11 ;
33 sei ();
34 }
35
36 ISR ( INT0_vect )
37 {
38 static unsigned char data ; // Holds the received scan code
39 if ( ! edge ) // Routine entered at falling edge
40 {
41 if ( bitcount < 11 && bitcount > 2 ) // Bit 3 to 10 is data. Parity bit,
42 { // start and stop bits are ignored.
43 data = ( data >> 1 );
44 if (( PORT_KB & ( 1 << DATAPIN )))
45 {
46 data = data | 0x80 ; // Store a '1'
47 }
48 }
49
50 MCUCR = 3 ; // Set interrupt on rising edge
51 edge = 1 ;
52 }
53 else
54 { // Routine entered at rising edge
55
56 MCUCR = 2 ; // Set interrupt on falling edge
57 edge = 0 ;
58 bitcount -= 1 ;
59 if ( bitcount == 0 ) // All bits received
60 {
61 decode ( data );
62 bitcount = 11 ;
63 }
64 }
65 }
66
67 void decode ( unsigned char sc )
68 {
69 // Coding us-keyboard, geman keyboard contains multi-byte chars
70 // Vector ist indexed by scancode and contains the ascii code at
71 // the indexed position
72 static char CodingUnshifted [] =
73 { /* 0 1 2 3 4 5 6 7 8 9 a b c d e f*/
74 /*0*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , '^' , 0 ,
75 /*1*/ 0 , 0 , 0 , 0 , 0 , 'q' , '1' , 0 , 0 , 0 , 'y' , 's' , 'a' , 'w' , '2' , 0 ,
76 /*2*/ 0 , 'c' , 'x' , 'd' , 'e' , '4' , '3' , 0 , 0 , ' ' , 'v' , 'f' , 't' , 'r' , '5' , 0 ,
77 /*3*/ 0 , 'n' , 'b' , 'h' , 'g' , 'z' , '6' , 0 , 0 , ',' , 'm' , 'j' , 'u' , '7' , '8' , 0 ,
78 /*4*/ 0 , ',' , 'k' , 'i' , 'o' , '0' , '9' , 0 , 0 , '.' , '?' , 'l' , ':' , 'p' , '-' , 0 ,
79 /*5*/ 0 , 0 , '\'' , 0 , '[' , '+' , 0 , 0 , 0 , 0 , 13 , ']' , 0 , '|' , 0 , 0 ,
80 /*6*/ 0 , '<' , 0 , 0 , 0 , 0 , 8 , 0 , 0 , '1' , 0 , '4' , '7' , 0 , 0 , 0 ,
81 /*7*/ '0' , ',' , '2' , '5' , '6' , '8' , 0 , 0 , 0 , '+' , '3' , '-' , '*' , '9' , 0 , 0
82 };
83 static char CodingShifted [] =
84 {
85 /*0*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 9 , 0 , 0 ,
86 /*1*/ 0 , 0 , 0 , 0 , 4 , 'Q' , '!' , 0 , 0 , 0 , 'Y' , 'S' , 'A' , 'W' , '@' , 0 ,
87 /*2*/ 0 , 'C' , 'X' , 'D' , 'E' , '$' , '#' , 0 , 0 , ' ' , 'V' , 'F' , 'T' , 'R' , '%' , 0 ,
88 /*3*/ 0 , 'N' , 'B' , 'H' , 'G' , 'Z' , '^' , 0 , 0 , ',' , 'M' , 'J' , 'U' , '&' , '*' , 0 ,
89 /*4*/ 0 , '<' , 'K' , 'I' , 'O' , ')' , '(' , 0 , 0 , '>' , '/' , 'L' , ';' , 'P' , '_' , 0 ,
90 /*5*/ 0 , 0 , '"' , 0 , '{' , '=' , 0 , 0 , 0 , 0 , 13 , '}' , 0 , '\\' , 0 , 0 ,
91 /*6*/ 0 , '>' , 0 , 0 , 0 , 0 , 8 , 0 , 0 , '1' , 0 , '4' , '7' , 0 , 0 , 0 ,
92 /*7*/ '0' , ';' , '2' , '5' , '6' , '8' , 0 , 0 , 0 , '+' , '3' , '-' , '*' , '9' , 0 , 0
93 };
94
95 static unsigned char is_up = 0 , shift = 0 , mode = 0 ;
96
97 if ( ! is_up ) // Last data received was the up-key identifier
98 {
99 switch ( sc )
100 {
101 case 0xF0 : // The up-key identifier
102 is_up = 1 ;
103 break ;
104
105 case 0x12 : // Left SHIFT
106 shift = 1 ;
107 break ;
108
109 case 0x59 : // Right SHIFT
110 shift = 1 ;
111 break ;
112
113 case 0x05 : // F1
114 if ( mode == 0 )
115 mode = 1 ; // Enter scan code mode
116 if ( mode == 2 )
117 mode = 3 ; // Leave scan code mode
118 break ;
119
120 default:
121 if (( mode == 0 ) || ( mode == 3 )) // If ASCII mode
122 {
123 if ( sc < 128 )
124 {
125 if ( ! shift ) // If shift not pressed,
126 put_kbbuff ( CodingUnshifted [ sc ]);
127 else
128 put_kbbuff ( CodingShifted [ sc ]);
129 }
130 }
131 else { // Scan code mode
132 print_hexbyte ( sc ); // Print scan code
133 put_kbbuff ( ' ' );
134 put_kbbuff ( ' ' );
135 }
136
137 break ;
138 }
139 } else {
140 is_up = 0 ; // Two 0xF0 in a row not allowed
141 switch ( sc )
142 {
143 case 0x12 : // Left SHIFT
144 shift = 0 ;
145 break ;
146
147 case 0x59 : // Right SHIFT
148 shift = 0 ;
149 break ;
150
151 case 0x05 : // F1
152 if ( mode == 1 )
153 mode = 2 ;
154 if ( mode == 3 )
155 mode = 0 ;
156 break ;
157 case 0x06 : // F2
158 //clr();
159 break ;
160 }
161 }
162 }
163
164 void put_kbbuff ( unsigned char c )
165 {
166 if ( buffcnt < BUFF_SIZE ) // If buffer not full
167 {
168 * inpt = c ; // Put character into buffer
169 inpt ++ ; // Increment pointer
170
171 buffcnt ++ ;
172
173 if ( inpt >= kb_buffer + BUFF_SIZE ) // Pointer wrapping
174 inpt = kb_buffer ;
175 }
176 }
177
178 int getchar ( void )
179 {
180 int byte ;
181
182 while ( buffcnt == 0 ); // Wait for data
183
184 byte = * outpt ; // Get byte
185 outpt ++ ; // Increment pointer
186
187 if ( outpt >= kb_buffer + BUFF_SIZE ) // Pointer wrapping
188 outpt = kb_buffer ;
189 buffcnt -- ; // Decrement buffer count
190
191
192 if ( strcmp ( "" + byte , " ,_/" ) == 0 ){
193
194 uputs ( "asdfasdf \n\r " );
195
196 }
197
198 return byte ;
199 }
200
201 char * gets ( char * pBuf , int n )
202 {
203 int count = 1 ;
204 char c ;
205 char * p = pBuf ;
206 * pBuf = 0 ; // init with terminating null
207 while ( count < n )
208 {
209 c = getchar ();
210 if ( c == 0x8 ) // if Backspace
211 {
212 if ( count > 1 )
213 {
214 putchar ( c ); // echo backspace
215 p -- ; * p = 0 ; count -- ; //delete one char
216 }
217 }
218 else
219 {
220 putchar ( c ); // Echo to rs232 or lcd
221 * p = c ; // put char to buffer
222 p ++ ; // increment
223 * p = 0 ; // put a new terminating null behind the last char
224 count ++ ; // count chars
225 if ( * ( p - 1 ) == 0xd || * ( p - 1 ) == 0xa ) // End of line
226 {
227 * ( p - 1 ) = '\n' ;
228 return pBuf ;
229 }
230 }
231 }
232 return pBuf ;
233 }
von
Stefan (Gast)
20.07.2012 12:32
Sorry ich dachte Linennummer würden angezeigt. Es handelt sich um diesen
Teil hier:
1 if ( strcmp ( "" + byte , " ,_/" ) == 0 ){
2
3 uputs ( "asdfasdf \n\r " );
4
5 }
> Wenn ja was könnte in der
überprüfung Enter ja/nein in der zeile 192 falsch sein.
So ziemlich alles.
Das ergibt keinen Sinn
Du hast hier
byte = *outpt; // Get byte
nur 1 Byte geholt. Das ist der (ein?) Code einer Taste. Mir ist nicht
klar, was du da mit Stringvergleichen willst. Du hast keinen String.
(Abgesehen davon macht ""+byte mit 99% Sicherheit nicht das, was du
denkst das es macht.)
Schritt zurückgehen:
Dein Problem ist im eigentlichen Sinn nicht irgendetwas Spezielles im
Code, sondern das dir nicht klar ist, wie du dein Problem lösen willst
und welche Nebenbedingungen dazu im Code existieren.
von
Stefan (Gast)
21.07.2012 13:29
Danke für die Antworten!
Ja immoment bin ich mir auch nicht so sicher wie ich das lösen soll. Die
Sache da oben ist mehr oder weniger aus Verzweiflung entstanden.
Ich schaue mir die Links mal ganz in ruhe an und versuche damit eine
Lösung zu "basteln".
Danke erstmal an euch!
Mfg Stefan
von
khmweb (Gast)
30.07.2012 10:44
Hallo,
suche mal nach "avr313.pdf" bei Google. Ich denke, das hilft Dir weiter?
Aber auch viell. die Software zu einem Buch:
http://www.oldenbourg-verlag.de/wissenschaftsverlag/mikrocomputertechnik-controllern-atmel-avr-risc-familie/9783486589887
und dort Zusatzmaterial, Beispielprogramme wählen (in Assembler und C).
LG khmweb
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.