Byte Bit für Bit seriell ausgeben

OP #3195292
Lesenswert?

Guten Tag,
ich würde gerne ein Byte seriell ausgeben und dabei mit dem 
höchstwertigen Bit anfangen.
Ich versuche es seit 2 Stunden aber irgendwie klappt es nicht, wo liegt 
mein Fehler?

denn ich würde damit gerne ein Schieberegister Laden und die Daten dann 
parallel ausgeben
1
void schieberegisterLaden()
2
{
3
  int actBit,bitNr,bitMaske;
4
  
5
  cbi(PORTC,PIN3); //Schiebeoperator 0 setzen
6
  cbi(PORTC,PIN4); //Speicheroperator 0 setzen
7

8
  bitMaske=128; //damit man sp‰ter immer nur das hˆchste Bit abfragt
9

10
  for(bitNr=0;bitNr<=8;bitNr++) //mit hˆchstem Bit anfangen, jedes Bit einlesen
11
  {
12
    // wir wollten numbers[x] einlesen
13
    // 0b01001 aufspalten in 0-1-0-0-1
14
    actBit=(numbers[2]<<bitNr);
15
    actBit=actBit & bitMaske;
16

17
    if(actBit==0)
18
      cbi(PORTC,PIN2);
19
    else
20
      sbi(PORTC,PIN2);
21

22
    //Schiebeoperation durchf¸hren:
23
    sbi(PORTC,PIN3);
24
    _delay_us(5);
25
    cbi(PORTC,PIN3);
26
  }
27
  //mit einem Byte fertig => an Speicher ‹bergeben
28
  cbi(PORTC,PIN4);
29
  _delay_us(5);
30
  sbi(PORTC,PIN4);
31

32
}


mfg,
Gast #3195414
Lesenswert?

Die sbi/cbi sind noch nicht konsistent, ist das so richtig?

PIN3 und PIN4 sind beide per Default auf 0.

Ein Takt (PIN3) wird scheinbar durch sbi/cbi erzeugt.
Ein Übernehmen (PIN4) aber durch cbi/sbi.

Nach der Aktion bleibt PIN4 auf "set".

Außerdem vielleicht Timing:

  cbi(PORTC,PIN4);
  _delay_us(5);
  sbi(PORTC,PIN4);

Vielleicht dahinter auch jeweils ein delay_us nötig?
#3195455
Lesenswert?

Ich rate mal, daß es ein 595er ist.

M. K. schrieb:
> ich würde gerne ein Byte seriell ausgeben und dabei mit dem
> höchstwertigen Bit anfangen.
Mach das gleich vernünftig und löte die 3 Leitungen an PortB(2, 3, 5).
1
//Init
2
DDRSPI |= (1 << MOSI) | (1 << SCK) | (1 << SS);
3
SPCR |= (1 << SPE) | (1 << MSTR);
4

5
//Send
6
void Send595(unsigned char data)
7
{
8
   SPDR = data;
9
   while(!(SPSR & (1 << SPIF)));
10
   SPSR |= (1 << SPIF);
11
   PORTSPI ^= (1 << SS);
12
   PORTSPI ^= (1 << SS);  
13
}

mfg.
OP #3195600
Lesenswert?

Helfender schrieb:
> Die sbi/cbi sind noch nicht konsistent, ist das so richtig?
>
> PIN3 und PIN4 sind beide per Default auf 0.
>
> Ein Takt (PIN3) wird scheinbar durch sbi/cbi erzeugt.
> Ein Übernehmen (PIN4) aber durch cbi/sbi.
>
> Nach der Aktion bleibt PIN4 auf "set".
>
> Außerdem vielleicht Timing:
>
>   cbi(PORTC,PIN4);
>   _delay_us(5);
>   sbi(PORTC,PIN4);
>
> Vielleicht dahinter auch jeweils ein delay_us nötig?

das define von sbi (set bit) und cbi (clear bit) hab ich nicht mit 
herein kopiert.

PIN4 ist RCK, PIN3 ist SCK und PIN2 ist SER von einem 595er

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