Forum: Mikrocontroller und Digitale Elektronik Byte Bit für Bit seriell ausgeben


von M. K. (theother)


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,

von Markus M. (mark_m)


Lesenswert?

ein Fehler ist schon einmal hier:
1
for(bitNr=0;bitNr<=8;bitNr++) //mit hˆchstem Bit anfangen, jedes Bit einlesen

Grüsse

von M. K. (theother)


Lesenswert?

Markus M. schrieb:
> ein Fehler ist schon einmal hier:
>
>
1
> for(bitNr=0;bitNr<=8;bitNr++) //mit hˆchstem Bit anfangen, jedes Bit
2
> einlesen
3
>
>
> Grüsse

 =>>  'bitNr<8'  Danke!

--- aber müssen noch mehr fehler sein

von holger (Gast)


Lesenswert?

Wenn man PORTC verwendet sollte man die JTAG Fuse abschalten.

von E.T. (Gast)


Lesenswert?

holger schrieb:
> Wenn man PORTC verwendet sollte man die JTAG Fuse abschalten.

Hat der Prozessor soetwas überhaupt?

von M. K. (theother)


Lesenswert?

E.T. schrieb:
> holger schrieb:
>> Wenn man PORTC verwendet sollte man die JTAG Fuse abschalten.
>
> Hat der Prozessor soetwas überhaupt?

ist ein ATMega8

von holger (Gast)


Lesenswert?

>ist ein ATMega8

Der hat kein JTAG. Jetzt müssen wir nur noch raten
was für ein Schieberegister das ist.

von Helfender (Gast)


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?

von Thomas E. (thomase)


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.

von M. K. (theother)


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

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.