Bitshift für Schieberegister C-Code

OP #2353537
Lesenswert?

Hallo Zusammen

Ich habe mir die lcd-routines umgeschrieben um ein lcd mit ks00066 mit 
drei ainschlüssen via 74hc164 anzusteuern.

Beim angefügten c-code bin ich nicht ganz sicher ob er sinngemäss 
korrekt ist (compilieren geht).

Idee Das Datenbit wird gesetzt oder auch nicht, dann wird der bitshift 
port aktiviert und danach beide ports wieder null gesetzt, das ganze 
achtmal.

funktioniert das so? hab leider im moment kein zugriff zur hardware um 
zu testen... vielen dank für anregungen und tipps
1
static void lcd_out( uint8_t data )
2
{  
3
  for ( uint8_t i=0; i<8; i++ )
4
    {           
5
      LCD_PORT |= (((data>>i)&1)<<LCD_DB);         // DB Bit setzen 
6
    
7
      LCD_PORT |= (1<<SRSHIFT);                      // Bitshift in SR
8
      _delay_us( SR_ENABLE_US );                     // kurze Pause
9
      LCD_PORT &= ~((1<<SRSHIFT)|(1<<LCD_DB));       // Data Pin und SR Pin Null setzen
10
  }   
11
    
12
}
Gast #2353549
Lesenswert?

>funktioniert das so? hab leider im moment kein zugriff zur hardware um
>zu testen... vielen dank für anregungen und tipps

Na dann warte halt bis die Hardware wieder zur
Verfügung steht. Wenn es Probleme gibt fragst du noch mal.
#2353576
Lesenswert?

Michael I. schrieb:
> via 74hc164 anzusteuern

Schlechte Wahl.
Während des Schiebens werden die Bits sofort ausgegeben. Das könnte dein 
Display ganz schön durcheinander bringen.
Nimm' lieber ein 74HC595. Damit kannst du erst die Daten reinschieben 
und dann alle auf einmal auf die Ausgänge legen.

Michael I. schrieb:
> Idee Das Datenbit wird gesetzt oder auch nicht, dann wird der bitshift
> port aktiviert und danach beide ports wieder null gesetzt, das ganze
> achtmal.
Schlechte Idee.
Bessere Idee: SPI.

mfg.
OP #2353627
Lesenswert?

Ja das kommt er. 1 Pin wird für enable gebraucht, 1 Pin für Bitshift, 
und der dritte Pin für setzen der bits im Register, sowie als befehls 
oder dateneingabe ans lcd...
wollte nicht gleich die ganze posten (um nicht alle abzuschrecken)

Im Anhang nun die modifizierten files...

Danke für den Typ mit SPI, aber gehöre eher noch in die 
Anfängerkategorie und werde mich später mal damit auseinandersetzen
Angehängte Dateien:
OP #2353652
Lesenswert?

>
> Nö, der ist optimal.
> Du brauchst nur 3 Leitungen zum MC:
> - 164-Data/LCD-RS
> - 164-Clock
> - LCD-E
>
>
> Thomas Eckmann schrieb:
>> Nimm' lieber ein 74HC595.
>
> Macht die Sache nur deutlich komplizierter.
>
>
> Peter

Genau so ist es gedacht. beim link von holger ist auch noch die 
verdrahtung aufgezeichnet (bei mir einfach übers kreuz) da lcd_out wohl 
anders ist...

doch zur ursprünglichen frage, tut der code was er soll?
#2353666
Lesenswert?

Beim Elektor gab's sowas auch mal.
Dort war die E-Leitung einfach das letzte Bit im Schieberegister.
Im übrigen sind Operationen im Stil 1<<i auf AVRs 'teuer'; es ist besser 
pro interation eine Variable einfach um 1 weiterzuschieben und ein 
festes Bit abzufragen.
Für 16 bit kann das dann so aussehen:
1
void dac_raw(uint16_t b) {
2
  DAC_PORT &= ~(1<<CS_P);
3
  unsigned char i = 16;
4
  while (i > 0) {
5
    DAC_PORT |= (1<<SCK_P);
6
    if(b&(1<<15)) {
7
      DAC_PORT |= (1<<D_P);
8
    }
9
    else {
10
      DAC_PORT &= ~(1<<D_P);
11
    }
12
    b <<= 1;
13
    i--;
14
    _delay_us(5);
15
    DAC_PORT &= ~(1<<SCK_P);
16
    _delay_us(5);
17
    
18
  }
19
  DAC_PORT |= (1<<CS_P);
20
}
OP #2353690
Lesenswert?

Betreffend optimierung meinst du sowas oder?

1
static void lcd_out( uint8_t data )
2
{  
3
  for ( uint8_t i=0; i<8; i++ )
4
    {           
5
      LCD_PORT |= ((data&1)<<LCD_DB);         // DB Bit setzen 
6
    
7
      LCD_PORT |= (1<<SRSHIFT);                      // Bitshift in SR
8
      _delay_us( SR_ENABLE_US );                     // kurze Pause
9
      LCD_PORT &= ~((1<<SRSHIFT)|(1<<LCD_DB));       // Data Pin und SR Pin Null setzen
10
      data >>= 1 }   
11
    
12
}

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