USI kein Startcondition nach Initialiserung

Gast #3204907
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren