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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.