16 Bit shift register mit 3.3V

Allgemeine Themen rund um den Propeller Mikrocontroller und Elektronik
DJLinux

Re: 16 Bit shift register mit 3.3V

Beitrag von DJLinux »

Hallo Frank (Digger)
solltest Du Dein Display mal in Betrieb nehmen hier der Code dazu.
Warum mein Display nichts mehr macht weiss ich nicht.
An allen Pins kommt die Bits so an wie sie müssen.

Egal andere Mütter haben auch schöne Displays :lol:

Grüsse Joshy

PS. Der lesende Teil des Displays habe ich auskommentiert daher kannst Du den Propeller direkt 1:1 an das Display anschliesen. Die 3.3V vom Prop werden in der 5V Welt auch als High Pegel erkannt. Nur beim Lesen von 5V Pegeln braucht der Prop für seine 3.3V einen Spannungsteiler.

Code: Alles auswählen

''******************************************************
''*  Propeller WINTEC WD-C2704M-1HNN display interface *
''******************************************************
CON
  _CLKMODE = XTAL1 + PLL16X ' externer Quartz x 16                          
  _XINFREQ = 5_000_000
  
  ' Display pins
  #4,RS,RW,E1,E2,D0,D1,D2,D3,D4,D5,D6,D7
  LED=D7+1

PUB Main | ctrl,char
  PortInit
  WaitMS(15) ' > 15 ms
    
  ' init Controller 1 (E1) oder 2 (E2)
  ctrl:=E2
  
  WriteCMD(ctrl,$38)
  WaitMS(5) ' >4.1 ms
  WriteCMD(ctrl,$380)
  WaitMS(1)  ' >1 µs
  WriteCMD(ctrl,$38) ' ab hier Busy Flag auswerten bzw. Pause für Display

  WaitWhileBusy(ctrl)
  WriteCMD(ctrl,$38) ' SYSTEM SET 8Bit 2 lines

  WaitWhileBusy(ctrl)
  WriteCMD(ctrl,$0F) ' Display an mit blinkendem unterstrich Cursor
          
  ' controller 1 (Zeile 1 u. 2)
  WaitWhileBusy(ctrl) 
  WriteCMD(ctrl,$01) ' Display löschen

  WaitWhileBusy(ctrl)
  WriteCMD(ctrl,$02) ' Cursor Pos1 (home)

  WaitWhileBusy(ctrl)
  WriteCMD(ctrl,$04 | %10) ' ENTRY MODE SET (nach jedem zeichen ein Schritt rechts)

  ' Nur ein Test um 8 eigene Zeichen zu definieren
  'WaitWhileBusy(ctrl)
  'WriteCMD(ctrl,$40 | 0)  ' SET CGRAM ADRESS 0 (erste Zeichendefinition)
  'repeat 8*8
  '  WriteDATA(ctrl,$FF)   ' 8 invertierte Spaces

  WaitWhileBusy(ctrl)
  WriteCMD(ctrl,$80 | 0)   ' SET DDRAM ADRESS 0 (erste Zeile erste Spalte)
  
  ' 27 Zeichen ab Space in oberster Zeile ausgeben
  repeat char from 1 to 27
    WaitWhileBusy(ctrl)
    WriteDATA(ctrl,$20+char)

  repeat 'endlos

PRI SetLED(boolean)  ' nur als Test LED
  if boolean<>0
    outa[LED]:=1
  else
    outa[LED]:=0
      
PRI WaitMS(ms) | now ' kurze Pausen für das Display 
  now := CNT
  now += CLKFREQ / 1000 * ms
  WaitCnt(now)
  
PRI PortInit | pin   ' Alle Displaypins als Ausgänge
  outa[RS..LED]~
  dira[RS..LED]~~ 
  
PRI WriteCMD(c,cmd)   ' sende Commando zu Controller 1 oder 2
  outa[RW]     := 0   ' schreibend
  outa[RS]     := 0   ' Steuerleitung auf Commando
  outa[D0..D7] := cmd
  outa[c]      := 0   ' nicht nötig !!!
  outa[c]      := 1   ' comando wird bei fallender Flanke übernommen
  WaitMS(1)
  outa[c]      := 0
  
PRI WriteDATA(c,data) ' sende daten zu Controller 1 oder 2
  outa[RW]     := 0   ' schreibend
  outa[RS]     := 1   ' Steuerleitung auf Daten
  outa[D0..D7] := data
  outa[c]      := 0   ' nicht nötig !!!  
  outa[c]      := 1   ' Daten werden bei fallender Flanke übernommen
  WaitMS(1)
  outa[c]      := 0 
  
PRI WaitWhileBusy(c) | reg ' Busy so lange bit 7 gesetzt ist
  SetLED(1) ' Kontroll LED an
  WaitMS(5) ' Pause für Display
  SetLED(0) ' Kontroll LED aus
  return    ' und zurück
  
  ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  ' !!! wird im Moment nicht benutzt !!!
  ' !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  dira[D7] := 0  ' als Eingänge
  outa[RW] := 1  ' lesend
  
  repeat
    outa[c] := 0  ' ansteigende Flanke setzt daten
    outa[c] := 1  ' daten gültig so lange high
    WaitMS(1)     ' Zeit für Display nicht nötig !!! 
    reg := ina[D7]
    outa[c] := 0
    if reg==0
      quit
  dira[D7]:= 1   ' D7 wieder als Ausgang      
  outa[RW]:= 0   ' wieder schreibend    
  
  SetLED(0)      ' controll LED aus
Zuletzt geändert von DJLinux am Do 10. Sep 2009, 20:35, insgesamt 1-mal geändert.
Benutzeravatar
digger
Administrator
Beiträge: 676
Registriert: Sa 23. Mai 2009, 22:44
Wohnort: Schorfheide
Kontaktdaten:

Re: 16 Bit shift register mit 3.3V

Beitrag von digger »

cool danke :)
DJLinux

Re: 16 Bit shift register mit 3.3V

Beitrag von DJLinux »

Hatte noch ein PS. angefügt fals du schneller warst.

Grüsse Joshy
Benutzeravatar
digger
Administrator
Beiträge: 676
Registriert: Sa 23. Mai 2009, 22:44
Wohnort: Schorfheide
Kontaktdaten:

Re: 16 Bit shift register mit 3.3V

Beitrag von digger »

Supi, jetzt muss ich mir nur noch irgendwie einen freien Abend verschaffen! ;-)
Antworten