DCC signalet er komplet

De forskellige dele fra mine tidligere blog posts er nu sat sammen, og jeg har et breadboard der kan generere DCC signalet der er gemt i shift registre.

Jeg har stadig ikke lavet den del der læser SPI signalet, men det er et adskilt kredsløb der kører sin egen clock - så de jeg er løbet tør for ledninger til mit breadboard er det nok bedst at få afsluttet denne del og så lave SPI siden selvstændigt. Så må man håbe det hænger sammen senere.

Min originale plan var at lave kredsløbet på et protoboard, men jeg ser ikke rigtig frem til at lodde så mange ledninger. Så indtil viddere hælder jeg nok mest til at få lavet it PCB hos Seeed. Hvis jeg kan holde mig til 10x10cm ser det ret billigt ud - i det mindste skulle det være muligt at sende det med langsom post istedet for den dyre DHL forsendelse jeg har set andre steder. Jeg har ingen idé om hvad der kan være på 10x10 - men jeg overvejer alligevel at bruge SMD for nogle af komponenterne - og skifter jeg til udelukkende at bruge SMD så skulle der i hvert fald ikke være plads problemer.

Jeg har også skiftet fra Eagle til KiCAD. Eagle tillader kun 8x10 cm boards i gratis versionen - sikkert nok, men man ved aldrig. KiCAD har et elendigt library men det er let at lave sine egne symboler. Jeg overvejede at uploade et par stykker til dem, men det var ikke oplagt hvordan man sætter KiCAD op så det er let - og de har gang i en længere diskussion om hvordan man overhovedet skal lave 74xx serien. OK... jeg beholder det for mig selv. Smile

Nå, nok snak - det bliver et længere indlæg denne gang, så det er med at komme i gang. Kredsløbet ser nu sådan her ud:

Billede

 

Jeg vil gennemgå kredsløbet fra venstre til højre som det er på denne tegning. Det er ikke nødvendigvis den bedste "rækkefølge", men kredsløbet er cyklisk, så det bliver let noget rod alligevel.

 

InputConnectors:

Billede

Der er ikke det store at sige om denne del - der er tre connectors (inklusive den med skruer) da jeg endnu ikke har bestemt mig for hvordan min Raspberry Pi skal forbindes. Så er der blads på boardet laver jeg plads til lidt forskelligt. Hvis der ikke er plads må jeg jo beslutte mig på et tidspunkt. Ellers er der bare to bypass capacitorer - jeg regner egentlig bare med en enkelt 100uF som jeg har nu - men vil helst have plads på boarded til at sætte lidt mere på hvis jeg løber ind i problemer.

Der er ikke en modstand til at aflade capacitorerne - de bliver afladet igennem in LED et andet sted.

CommandRegister:

Billede

Har gemmes to DCC kommandoer - den der er ved at blive afsendt af kredsløbet, samt den der modtages over SPI. SPI delen er som sagt ikke lavet endnu - derfor de manglende input til 74HC75 chippen. 74HC153 chippen bruges både til at enable/disable boosteren og styre output fra skift registerne alt efter kommando længde. Det har jeg beskrevet nærmere i et tidligere indlæg på bloggen.

Shift registerne er forbundet som følger:

Billede

 

Der er enklere end det ser ud - det er bare én række registrer til at gemme den kommando der sendes (øverst), samt en række der gemmer den sidste kommando modtaget med SPI. Selv om den nederste række er medtaget i diagrammet har jeg endnu ikke prøvet dem på mit breadboard. Jeg har bare "simuleret" output fra to af dem ved at sætte inputs direkte,

Når IN_DATA_BIT er lav vil shift registerne flytte kommandoen med DCC signalet som clock. Når IN_DATA_BIT er høj ignoreres DCC clock signalet. Derved undgår jeg at shifte registrerne når der sendes preamble og data byte start bit.

IN_CMD_END_BIT vil være lav når kredsløbet genererer den 1-bit der afslutter en DCC kommando. Når det sker vil shiftregisterne loade den seneste kommando modtaget over SPI fra den nederste række. Er der ikke modtaget en ny kommando vil den "gamle" kommando blive sendt igen. Så de øverste shift registere "låser" kommandoen på raising edge af IN_CMD_END_BIT.

ClockGenerator

Billede

Jeg har vist allerede sagt det sker skal siges om denne del før.

DccStateMachine

Billede

 

Her har vi fat i selve maskinrummet af kredsløbet.

Øverst til venstre genereres preamble. Det er næsten som beskrevet i det tidligere indlæg, bort set fra at jeg ikke længere bruger master reset til at starte et preamble. Istedet bruget jeg parallel load. Det betyder ikke noget i dette tilfælde da jeg loader 0, men det gav mig muligheder for at justere preamble længden mens jeg rodede med den næste del: generering af data byte start bit. Igen svarer det meget til et tidligere indlæg - men jeg har sparet en OR gate væk. Det betyder at udgangen på ben 11 står og skifter mellem 0 og 1 under preamble. Det var derfor jeg forudså et behov for at styre længden af preamblet - det kunne være at det skulle være et ulige antal bits (det kunne man naturligvis udregne i forvejen, men jeg var for doven). OR gaten bruges stadig til at undgå signalet "cykler" under preamble, men nu sikrer den udgangen (IN_DATA_BIT) fra denne del af kredsløbet, ikke den "intern" funktion.

74HC193 chippen nederst genererer command end bitten som beskrevet tidligere - der er vist ikke ændret noget.

LedStatusLight

Billede

Igen en del jeg ikke kan sige så meget om - ud over at min skod billige kina LED åbenbart smider 2 volt på den grønne. Lidt mere end forventet, så den kører kun 11 mA - men det ser OK ud. Jeg kan altid pille i modstandsstørelser, hvis jeg vil have mere skrald på.

DccGenerator

Billede

I mit tidligere indlæg smed jeg omkring mig med OR og AND gates for at sammensætte DCC signalet. For at få nok gates beskrev jeg hvordan man kan bruge den 74HC4053 jeg allerede har til at simulere AND/OR/NOT gates. Øh, ja. Men man kan jo også bare bruge den til som den multiplexer den nu engang er, så man slet ikke behøver de gates til at starte med. :Cool

Der var ikke nogen 74HC4053 i KiCAD's standard library, så jeg lavede min egen. Derved blev det også muligt at have de 3 multiplexere indbygget i samme IC som selvstændige gates (eller Units som KiCAD kalder det) - der gør diagrammet noget lettere at læse.

Til venste vælges output fra shift registrerne hvis IN_DATA_BIT er høj - ellers vælges IN_CMD_END_BIT - der så vil give lavt signal når det er en byte start bit, og højt signal når det er en end bit. OR gaten sikrer så at signalet altid er højt i preamble. Unit B på 74HC4053'eren vælger mellem 58µs for 1 og 116µs clocken for 2. Den sidste flip flop gate generer så det endelige DCC signal - der også bruges som clock for hele kredsløbet. Denne del er også beskrevet tidligere - det er de to øverste IC'er på det "gamle" diagram.

BoosterConnectors

Billede

 

Der er ikke meget magi her. Jeg har nok kun brug for en booster, men hvis jeg får plads til det laver jeg udgange til nogle flere - og evt også flere connector typer.

Får jeg nogle gates til overs (et OR gate og en inverter skulle være nok) ændrer jeg det nok så DCC altid er lav hvis BOOSTER_ENABLE er lav. Jeg får nok ikke brug for det, men det ville gøre det muligt at bruge en booster der ikke har noget enable signal - men istedet ser på om den får et signal på DCC indgangen. Som det er nu vil mit kredsløb altid generere et DCC lignende signal på output, selv om BOOSTER_ENABLE er lav.

Ja det er meget godt, men virker det?

Der er stadig lang tid til at jeg for sat strøm på et lokomotiv, så det er stadig et godt spørgsmål om det virker. Men med kommandoen "hard-wired" til 4 bytes (hvor de 3 sidste gentages da jeg var alt for doven til at sætte mere end 2 shift registrer op) får jeg følgende signal:

Billede

umiddelbart ligner det er DCC signal bort ser fra at de data jeg sender (01010101 00110011 00110011 00110011) naturligvis ikke er en gyldig kommando.

Hvad nu?

Det er et godt spørgsmål. Jeg vil formegentlig begynde på SPI delen - jeg er dog lidt tøvende da jeg vil fjerne min nuværende breadboard opsætning, og jeg vil godt nok være træt af at skulle lave den igen for at verificere evt. ændringer til denne del af kredsløbet. Så jeg burde nok se lidt mere på om jeg kan optimere det nogen steder... men vi får se, det der jo altid sjovere at rode med nye ting. Smile

__________________

mvh
Lars M

Er så småt ved at begynde at pille i skala n, epoke III, DB.

Like 0 kan lide
Top