Forum: Mikrocontroller und Digitale Elektronik Bitshift für Schieberegister C-Code


von Michael I. (inglinm)


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
}

von holger (Gast)


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.

von Thomas E. (thomase)


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.

von Michael I. (inglinm)


Lesenswert?

Wieso ist HC164 eine schlechte Wahl? es macht ja nichts wenn die Daten 
sofort ausgegeben werden oder? soviel ich weiss werden die doch erst mit 
dem enable puls übernommen...

von Thomas E. (thomase)


Lesenswert?

Michael I. schrieb:
> soviel ich weiss werden die doch erst mit dem enable puls übernommen...
Aber nur wenn der direkt vom Controller kommt.

mfg.

von Peter D. (peda)


Lesenswert?

Thomas Eckmann schrieb:
> Michael I. schrieb:
>> via 74hc164 anzusteuern
>
> Schlechte Wahl.

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

von holger (Gast)


Lesenswert?


von Michael I. (inglinm)


Angehängte Dateien:

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

von Michael I. (inglinm)


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?

von Thomas E. (thomase)


Lesenswert?

Michael I. schrieb:
> doch zur ursprünglichen frage, tut der code was er soll?
Ja.

mfg.

von Lukas K. (carrotindustries)


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
}

von Michael I. (inglinm)


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
}

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.