Hallo das ganze soll bei nem Mega32 eine Tasterturmatrix auslesen aber schon die einfache Pinabfrage über 1 Taste geht nicht!! PINB2-4 Spalten PINC2-5 Zeilen Aktuell ist die Zeile 1 (PINC2) active und wenn dedrückt soll der PortB1 da ganze auslesen (high sein) ! Stimmt was mit den Pull Up Einstellungen nicht. Messe wunderbar 5V an PB1 wenn gedrückt und 0 V wenn nicht...
1 | #define F_CPU 1000000UL // MP-Takt |
2 | #include <avr/io.h> |
3 | #include <stdio.h> |
4 | #include <stdlib.h> |
5 | #include <inttypes.h> |
6 | #include <avr/interrupt.h> |
7 | #include <avr/wdt.h> |
8 | #include <util/delay.h> |
9 | |
10 | #define BAUD 1200UL |
11 | #define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1) |
12 | |
13 | int uart_putc(unsigned char c) |
14 | { |
15 | while (!(UCSRA & (1<<UDRE))); |
16 | |
17 | UDR = c; |
18 | return 0; |
19 | } |
20 | int uart_puts( char* str ) |
21 | { |
22 | while( *str ) |
23 | uart_putc( *str++ ); |
24 | while (!(UCSRA & (1<<UDRE))); |
25 | |
26 | UDR = 0x0A; |
27 | return 0; |
28 | } |
29 | |
30 | void long_delay(void); |
31 | |
32 | int main(void) |
33 | { |
34 | |
35 | // Eingang (Spalten) |
36 | DDRB = 0x00; |
37 | PORTB = 0x00; |
38 | |
39 | // Ausgang (Zeilen) |
40 | DDRC = 0xFF; |
41 | PORTC = 0xFF; |
42 | |
43 | // RS232 aktivieren |
44 | UCSRB |= (1 << TXEN) | ( 1 << RXEN ) | ( 1 << RXCIE ) ; // UART TX, RX einschalten |
45 | UCSRC |= ( 1 << URSEL ) | ( 1<<UCSZ1 ) | ( 1<<UCSZ0); // Asynchron 8N1, |
46 | UBRRL = (uint8_t) UBRR_BAUD; |
47 | |
48 | sei(); |
49 | uart_puts("Start : "); |
50 | while (1) |
51 | { |
52 | // Prüfe Zeile 1 ( 1 2 3) |
53 | PORTC = (1<<PC2); |
54 | |
55 | if (PINB & (1<<PINB1)) |
56 | { |
57 | _delay_ms(100); |
58 | if (PINB & (1<<PINB1)) |
59 | { |
60 | _delay_ms(100); |
61 | if (PINB & (1<<PINB1)) |
62 | { |
63 | uart_puts(" pressed"); |
64 | } |
65 | } |
66 | } |
67 | else |
68 | { |
69 | uart_puts("not pressed"); |
70 | } |
71 | long_delay(); |
72 | PORTC=0x00; |
73 | } |
74 | } |
75 | |
76 | |
77 | void long_delay(void) |
78 | { |
79 | _delay_ms(200); |
80 | _delay_ms(200); |
81 | _delay_ms(200); |
82 | _delay_ms(200); |
83 | } |