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.
Druckbare Version
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.
Mit den Transistoren bekomme ich aber Platzprobleme. Ich baue das ganze in dreifacher Ausführung.
Klaro, das is'n argument
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.
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
@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:
Der Code soll einfach nur per SPI wechselnde Signale liefern, sodass die LEDs abwechselnd blinken. Es tut sich aber garnix.Code:#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);
}
}
}
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.
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)
HAHA, ich werd verrückt!
Also ich habe nun mal eigenen Code geschrieben und es funktioniert fast perfekt:
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?Code: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);