Hallo Leute,
ganz grob erklärt, ich erzeuge eine Start und Stop Condition in kurzem
ABstand hintereinander und erwarte, dass gemäßg meiner Programmierung
SDA immer 5V (auf dem Multimeter, real sehr kurze Flanken) ist und SCL
wechselt.
Dies ganze funktioniert aber nur solange ich USICR nicht konfiguriere.
Dann bleibt SDA und SCL einfach tot. Ich dachte ich kann trotzdem die
Ports auch direkt ansprechen??
Zur Konfiguration ist die Zeile in usi_master_initialize(). Ein anderer
Controller, der auf Start und Stop Conditionen reagiert bestätigt meine
Beobachtung. SDA und SCL lässt sich manuell nicht ansteuern, wenn ich in
usi_master_initialize() die USICL Zeile nicht auskommentiere.
AUskommentiert reagiert der andere Controller, denn dann reagieren die
SCL und SDA Pins...
Was übersehe ich?
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <util/delay.h>
|
4 |
|
5 | #define USI_DDR DDRB
|
6 | #define USI_PORT PORTB
|
7 | #define SDA_DDR PORTB0
|
8 | #define SCL_DDR PORTB2
|
9 | #define SDA_PIN PINB0
|
10 | #define SCL_PIN PINB2
|
11 | #define SDA_OUT PORTB0
|
12 | #define SCL_OUT PORTB2
|
13 |
|
14 | #define slave_addr 2
|
15 |
|
16 |
|
17 | void usi_clear_flags(){
|
18 | USISR = (1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|(0x0<<USICNT0); //Clear Flags and Timer
|
19 | }
|
20 |
|
21 | void usi_master_initialize(){
|
22 | //USICR = (0<<USISIE)|(0<<USIOIE)|(1<<USIWM1)|(0<<USIWM0)|(0<<USICS1)|(0<<USICS0)|(1<<USICLK)|(0<<USITC);
|
23 |
|
24 | USI_PORT |= (1<<SDA_OUT)|(1<<SCL_OUT);
|
25 | USI_DDR |= (1<<SDA_DDR)|(1<<SCL_DDR); //SDA und SCL als AUsgänge
|
26 |
|
27 | //usi_clear_flags();
|
28 | }
|
29 |
|
30 | void usi_stop_condition(){
|
31 | USI_PORT &= ~(1<<SDA_OUT);
|
32 | USI_PORT |= (1<<SCL_OUT);
|
33 | _delay_us(100);
|
34 | USI_PORT |= (1<<SDA_OUT);
|
35 | }
|
36 |
|
37 | void usi_start_condition(){
|
38 | USI_PORT &= ~(1<<SDA_OUT); //SDA High to Low
|
39 | _delay_us(100);
|
40 | USI_PORT &= ~(1<<SCL_OUT);
|
41 | USI_PORT |= (1<<SDA_OUT);
|
42 | }
|
43 |
|
44 |
|
45 |
|
46 | int main(void)
|
47 | {
|
48 | unsigned char x,y,z;
|
49 | */
|
50 | //--------------------------------Initialisierung---------------------------------------
|
51 | DDRA = 0b11111111;
|
52 | DDRB = 0b11111111;
|
53 | PORTA = 0xFF;
|
54 | PORTB = 0xFF;
|
55 |
|
56 | ADCSRA = (1<<ACD);
|
57 |
|
58 | usi_master_initialize();
|
59 |
|
60 | //--------------------------------Initialisierung---------------------------------------
|
61 |
|
62 | while(1){
|
63 |
|
64 | for(x=0;x<20;x++){ _delay_ms(100);}
|
65 |
|
66 | usi_start_condition();
|
67 | for(x=0;x<20;x++){ _delay_ms(100);}
|
68 |
|
69 | usi_stop_condition();
|
70 | }
|
71 |
|
72 | return 0;
|
73 | }
|