Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieberegister als Output
starkeeper
26.03.2005, 16:42
Hi,
ich möchte testweise folgende Schaltung realisieren.
Es wäre toll wenn da mal jemand drüber schaun würde. Es sollen einfach die 16 LEDs angesteuert werden. Das ganze geht über die beiden Schieberegister die hintereinander geschaltet sind. Da fängt das Problem an, wie schliesse ich die 74HC595N korrekt an den PIC an, sodass ich die einfach per SPI ansprechen kann?
Dann würde ich gerne wissen ob ich für die ULN2803A noch irgendwelche Widerstände einbauen muss?
schon mal Danke im Voraus!
BlueNature
26.03.2005, 17:10
Einen Fehler hast du in der Ausgangsbeschaltung des ULN2803. Die LED's müssen andersrum und die gemeinsame Masse muß +5V sein. Das andere sieht eigentlich völlig normal aus. Nur eins ist Geschmacksache. Den SPI zu nehmen. Geht auch über normale Ports, dann verschwendet man den SPI nicht für das Schieberegister.
Grüße Wolfgang
starkeeper
26.03.2005, 17:28
Sind denn die Schieberegister richtig angeschlossen. Der Pin RCK am Register, kam mir spanisch vor, wofür ist der? Den habe ich nun einfach willkürlich mit einem beliebigen PIN am PIC verbunden.
Ich nutze den CCS Compiler da gibt es ganz komfortable Funktionen um ein paar Bytes auszugeben. Wenn ich die register nun woanders anschliesse kann ich die Funktionen wohl nicht verwenden. Wie müsste ich das dann Softwaretechnisch umsetzen?
@Starkeeper: Die RCK mußt du auf +5 halten, damit er die Werte des Schieberegister auch an seinen Output legt.
Den braucht man, wenn man erst was gemütlich reinschippert, und dann mit einem Schlag alle Outputs setzen will.
starkeeper
26.03.2005, 21:45
Ahh, ok. Ich könnte das also auch steuern. So, dass er garnicht anzeigt, wie die Bits an ihren Platz schippern. Ich würde dann erst 5V auf RCK geben, wenn alle Bits gesetzt sind.
Was mich nun aber doch brennend interessiert, wie ich die Schieberegister an normalen Pins nutze. Das wäre meine nächste Idee gewesen, anstatt noch mehr von den Teilen zu kaskadieren, einfach nochmal zwei an den PIC zu hängen.
BlueNature
26.03.2005, 22:07
Hallo starkeeper!
Ich habe mal was geschrieben gehabt das ähnlihc funktioniert. Ein CD4094 der das selbe ist in CMOS-Technik. Den habe ich an einem PIC-AXE hängen. Habe aus Portmangel das eben auch erweitert gehabt mit zwei Standard-Pins. Das war mein Code dazu wenn man Ausgänge mit dem Bytewert belegt hat einfach diese Routine aufrufen und das Schieberegister macht die Ausgabe der Variablen an den Pins. Ist auch mit drei Leitungen (Data, Clock und Strobe) relisiert wie bei dir.
' ************************************************** ************
' * Schieberegister-Verwaltung *
' ************************************************** ************
ShiftRegSet:
' Schieberegister mit Daten laden (8-Bit)
TempByte = Ausgaenge
For i = 1 To 8
Low ShrData1
Low ShrData2
If TempByte < 128 Then GoTo ShiftRegSet2
High ShrData1
ShiftRegSet2:
PulsOut ShrClock1, 1 ' 10µs-Impuls
'PulsOut ShrClock2, 1 ' 10µs-Impuls
Low ShrData1
TempByte = TempByte * 2
Next i
PulsOut ShrStrobe, 2 ' 20µs Ausgänge übernehmen
Return
Grüße Wolfgang
starkeeper
27.03.2005, 10:10
Danke, aber das sieht verdammt nach Basic aus. So ganz kann ich dem Code daher nicht folgen.
Was ich nicht verstehe, wie ich denn nun den Clock zustande kriege.
starkeeper
18.04.2005, 11:49
Hi,
also ich habe nun meine Schaltung umgesetzt. Was mir nun klar geworden ist, das es garnicht funktionieren kann. Der ULN2803 Schaltet ja -5V, deshalb muss dort ja auch die Kathode dran. Ich verwende aber RGB-LEDs die habe nur eine gemeinsamme Kathode, sodass ich gezwungen bin +5V zu schalten um dann jede Farbe steuern zu können. So hatte ich es ja auch zu anfang geplant. :-)
Nun ist meine Frage, gibt es sowas wie den ULN2803, nur eben invertiert? Sodass ich meine benötigten +5V erhalte. Was wäre denn mit dem UDN2981, den kann man aber wohl nicht mit 5V betreiben?
Der UDN klingt vernünftig, is auch für TTL , sollte gehen
starkeeper
18.04.2005, 12:14
Was mich irritiert, ist das Datenblatt. Dort steht etwas von Input Voltage 15V.
http://www.ortodoxism.ro/datasheets/allegromicrosystems/2981.pdf
Was meinen denn die damit?
Die sagen, bei +50 Grad und 15V kann jeder Output 120 mA liefern.
wie gesagt, geschaltet wird immer mit TTL-Pegel
Ich weiß nicht, was das Zeug kostet, aber ich täts mit irgendwelchen 08/15 Transistoren treiben.
starkeeper
18.04.2005, 15:03
Mit den Transistoren bekomme ich aber Platzprobleme. Ich baue das ganze in dreifacher Ausführung.
starkeeper
24.04.2005, 21:15
Was mich interessieren würde, wie ich nun die Register zum arbeiten bekomme. Um die Daten die im Register stehen auszugeben soll ich ja nun 5V auf RCK geben. Soll das nur orübergehend geschehen, oder wie lange? Wie ist das denn in den SPI-Funktionen vom CCS vorgesehen?
Wie schnell kann man denn so ein Register kaputt machen, ich habe welche die stehen immer auf Hich und andere die geben garnix von sich. Funktionieren tut hier nischts so rischtisch.
BlueNature
24.04.2005, 21:40
Servus starkeeper!
Reset solltest du nicht direkt an +5V schließen. Eher über einen 10k-Vorwiderstand. Das ist allgemein üblich wenn man sich nicht sicher ist ob es der Baustein verträgt.
Die Register bekommst du zum arbeiten wenn du über deine SPI Ein Byte mit 8 Bits abschickst. Wie das bei einem PIC geht weiß ich nicht das ich nicht mit PIC's arbeite. Mußt du nachlesen oder ein anderer weiß es vieleicht. Check mal trotzdem ob überhaupt Signale an den Leitungen anstehen beim Absenden.
Das übernehmen der Daten mit dem RCK-Pin geschieht laut Bausteinzeichnung mit einer Flanke. Also muß nachdem die beiden Bytes abgesenbdet wurden der Pin im Pegel wechseln das es ausgegeben wird an die beiden ULN2803.
Grüße Wolfgang
starkeeper
25.04.2005, 11:44
@BlueNature
Was meinst du denn mit Reset? Die Schieberegsiter haben doch garkein Reset.
Mich wurmt es das so eine eigentlich simple Sache nicht klappt, wie soll ich denn dann jemals zu einer aufwendigen Schaltung kommen. Daher wäre es nett wenn ihr mir auf die Sprünge helft.
Folgendermassen sieht nun meine Gesamtschaltung aus. Ich kann dort keinen Fehler erkennen.
Den Pic habe ich mit folgendem TestCode bespielt:
#include <16F876.h>
#USE DELAY (CLOCK=20000000)
#FUSES HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
unsigned int token;
void main()
{
token = 0;
setup_adc(ADC_OFF);
set_tris_a(0b00000000);
set_tris_b(0b00000000);
set_tris_c(0b00000000);
output_a(0x00);
output_b(0x00);
output_c(0x00);
// Setup SPI
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
while(TRUE) // Programmschleife
{
// write to SPI
if(token == 0)
{
spi_write(0x10101010b);
token = 1;
delay_ms(10);
output_high(PIN_C6);
delay_ms(10);
output_low(PIN_C6);
delay_ms(900);
}
else
{
spi_write(0x01010101b);
token = 0;
delay_ms(10);
output_high(PIN_C6);
delay_ms(10);
output_low(PIN_C6);
delay_ms(900);
}
}
}
Der Code soll einfach nur per SPI wechselnde Signale liefern, sodass die LEDs abwechselnd blinken. Es tut sich aber garnix.
Die LEDs leuchten beim starten willkürlich auf und verharren so, ohne dass der PIC irgend einen Einfluss hat.
Wo zum Teufel liegt denn nun mein Fehler?
Ich weiß das jetzt nicht auswendig, du mußt darauf achten, daß er die Clock-Flanke in der Mitte des Datenbits setzt, ich glaub, du brauchst die steigende Flanke. Ist aber im Datasheet klitzeklein beschrieben.
Anm: Ich verwend selbst ausgiebigst den SPI. Ich würde an deiner Stelle alle register hintereinander setzen und dafür den Vorteiler auf 1.
starkeeper
25.04.2005, 12:24
Also du benutzt nicht die SPI-Funktionen vom CCS? Oder wie kann ich denn da einfluss nehmen auf solche Parameter?
Ich mach's im Assembler.
Aber die Musik spielt so oder so da:
setup_spi(spi_master | spi_l_to_h | spi_clk_div_64);
spi_master ist klar
spi_clk_div_64 Prescaler ist auch klar
spi_l_to_h hier wird bestimmt, wie die Flanken liegen
da mußt du in der Doku schauen, wie's gemeint ist.
Ich vermute, du braucht spi_h_to_h, d.h. mit der fallenden Flanke legt er das daten-Bit an, und genau IM Bit geht die Clock-Flanke wieder rauf. (datenübernahme im Shift-Register)
starkeeper
25.04.2005, 19:13
HAHA, ich werd verrückt!
Also ich habe nun mal eigenen Code geschrieben und es funktioniert fast perfekt:
output_low(RES_CLOCK_GREEN);
for(i=0; i < 16; i++)
{
if(zahl & pow(2,i))
{
output_high(SER_DATA_GREEN);
}
else
{
output_low(SER_DATA_GREEN);
}
output_high(SER_CLOCK_GREEN);
delay_cycles(10);
output_low(SER_CLOCK_GREEN);
}
output_high(RES_CLOCK_GREEN);
delay_cycles(10);
output_low(RES_CLOCK_GREEN);
Dieser Code würde z.B. wenn man die Variable zahl vom typ int16 auf xAAAA setzt ein an-aus-an.. Muster zauber. Das funktioniert soweit. Das Problem bei der Sache, das er die Daten direkt in das zweite Register schiebt und das erste bleibt immer leer. Liegt das ev. am Datentyp int16 oder wodran könnte das nun noch liegen?
Moment, er schiebt jedesmal 8-Bit. Für das int16 mußt du also 2 x in den SSPBUF schreiben.
Ich weiß nicht, ob der CCS ein int16 mit EINEM write-befehl rausschickt.
Schick mal 2x hintereinander 0xAA, dann sollten beide Register voll sein.
starkeeper
25.04.2005, 20:45
Also ich habe ja garkeine CCS funktionen mehr benutzt. Ich habe das ja alles selber abgebildet, wie im Code oben beschrieben.
dwenn der Stromverbrauch nicht kein Hindernis ist: der ULN 2803 kann doch die LED's mit gemeinsamer Katode durch kurzschließen 'ausschalten'.
RG
starkeeper
26.04.2005, 14:30
Ich hab die Funktionen nun nochmals umgeschrieben und es klappt jetzt alles. Danke für die Hilfe!
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.