Forum: Mikrocontroller und Digitale Elektronik USI kein Startcondition nach Initialiserung


von Curby (Gast)


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
}

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
Noch kein Account? Hier anmelden.