Dipswitches uitlezen met 74165's

Goeiemiddag allen

In een project heb ik 2x8 DIP switches zitten die uitgelezen worden door een ATmega162 microcontroller dmv 74165 schuifregisters.
Schema:
http://www.imgdumper.nl/uploads4/4dbd36f409952/4dbd36f4004ec-74165_dipsw.thumb.jpg

PARLOAD is pin PB4 van de microcontroller. MISO (PB6) en SCK (PB7) zijn uiteraard verbonden met de bijbehorende pinnen op de µC.
Echter krijg ik de schuifregisters niet uitgelezen. Ik heb volgend programmaatje geschreven:

[code=C]
//CPU Klokfrequentie:
#define F_CPU 20000000

//Includes van header files:
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/wdt.h>

char dipswitch1;
char dipswitch2;

char readdipsw(void) {
char SPIData;
//74165 inlezen en teruggeven
//Data in de buffer lezen: Parallel load low (P1)
PORTB &= 0b11101111;
_delay_us(100);
PORTB |= 0b00010000;
_delay_us(100);
SPIData = SPDR;
return SPIData; //spi data register inlezen
}

int main(void) {
DDRC = 0b11111111;
DDRB = 0b10010111;

SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

while(1) {
dipswitch1 = readdipsw();
dipswitch2 = readdipsw();
PORTC = dipswitch2;;
_delay_ms(50);
}
}
[/code]

Met de LA zie ik enkel de PARLOAD lijn die 2x na mekaar kort laag gaat. Op SCK en MISO komt er geen beweging. Om te testen heb ik de ISP programmer losgekoppeld.

Weet er iemand wat ik fout doe? Alvast bedankt...

Stijn

Als je een LS serie TTL IC gebuikt moet je de switches aan de massa leggen en pullups gebruiken.
4K7 pulldowns gebruiken zoals het nu zit werkt niet (Iil current te hoog).

Als je al een print gemaakt hebt kun je de LS door een HC type vervangen dan hoef je het niet over te doen.

P.S. De code hebt ik niet gecontroleerd omdat door het bovenstaande hardware probleem het zowiezo niet gaat werken.

-edit-, nu wel even de code bekeken: Waar zit je shift om je bitjes in een 'byte' of 'word' te schuiven?

Als je alle I/O puur met polling gebruikt mis ik nog een hoop code!

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Er zitten inderdaad 74LS165's op de printplaat.
Pull down's zijn op de printplaat vervangen door 10k weerstanden, omdat we geen 4k7's hadden liggen...

Bitjes zouden binnengeschoven worden dmv SPIData = SPDR. Voor zover ik uit de datasheet kon opmaken start de µC dan met het ophalen van 1 byte?

Meet eens op een ingangs pin van de 74LS165 met uitgeschakelde dipswitch!
Je zult nu een veel te hoge spanning meten, ergens in de buurt van 4V terwijl die minder als 0.8V behoort te zijn voor het 0 niveau.

Moraal van het verhaal: NOOIT een TTL input pull-downen, werkt niet.

Wat betreft de SPI interface, weet je zeker dat alles goed geinitialiseerd is?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Met uitgeschakelde dipswitch meet ik spanningen op de 74165 tussen 0.390V en 0.396V. Volgens de datasheet is VIL 0.8V. Er zit dus nog wel wat speling op... Bij volgende ontwerpen zal ik er rekening mee houden :)

Eigenaardig kan theoretisch niet, heb je er nu pulldowns van 470 ohm aan hangen?

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Nee, zijn pull-down weerstanden van 10kΩ. (2 weerstands arrays)

Welk merk 74LS165 zit er dan in?

-edit- Wat is het niveau van de SHIFT/LOAD toen je gemeten hebt?
Laat me raden: Hoog?
Er komt nog een verassing, wordt vervolgd........

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

De chipjes komen uit de stal van Texas Instruments.
Shift/Load was inderdaad hoog toen ik mat.

Nu komt de verassing: maak de shift/load maar eens laag en meet nu nog eens op de inputs van de dipswitch.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Ik heb eindelijk gevonden wat ik fout doe met de software. Je moet eerst een byte verzenden op SPI eer je een byte kan ontvangen. (Logisch natuurlijk...)
Ik krijg in ieder geval al genoeg beweging op de bus.

Nu merk ik ook dat Henri62 gelijk heeft: er komt alleen een hoog signaal uit de 74LS165's. Gelukkig heb ik hier nog 2 74HC165's gevonden, dus ik ga die dadelijk proberen te vervangen.

Ik wist niet dat die letters tussen de 74 en de rest zoveel verschil maakten...

Heb je die meting nog gedaan met de s/l laag?
Gewoon effe de pin laag programmeren en meten.
Als je het resultaat post, leg ik je de verassing uit!

[Bericht gewijzigd door henri62 op zondag 1 mei 2011 15:42:10 (19%)

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Met shift/load laag meet ik inderdaad 1.06V op de ingangen van de 74LS165. Raar... Heeft waarschijnlijk iets te maken met die NAND poort aan intern aan de ingang in de 74165. In die poort komen S/L en de ingang samen...

[Bericht gewijzigd door Stijn S op zondag 1 mei 2011 15:57:43 (46%)

Klopt, de parallel ingangen worden ge-gate met een AND gate en het S/L signaal. Die AND gate is intern opgebouwd met een z.g. multi emitter transistor.
Zoiets om het versimpelen:

code:


                   +-----+
A o---|<|-----+----| 2K7 |---- +5V
              |    +-----+
B o---|<|-----+
              \----> Naar uitgang van de gate via nog wat transistors.

Als je pin A aan GND legt zul je op B een spanning meten van zo'n 0.4 zoals bij je eerste meting.
Als je pin A aan +5V legt zul je op B in een keer een vele hogere spanning meten, afhankelijk hoe de rest van de schakeling opgebouwd is en die pulldown die eraan hangt.

In het geval van de Shift/load is het signaal intern een keer geinverteerd waardoor je bij een laag S/L signaal dit verschijnsel meet.

Als je met een scoop meet en je blijft constant die switches uitlezen in een loopje, zie je het heel duidelijk dat de ingangen op en neer gaan tussen die "verboden" waarden.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

En bij de HC editie is die AND poort dan opgebouwd met wat meer componenten? (Omdat daar het probleem niet optreedt...)

Bij HC logic is het circuit opgebouwd met CMOS fets.
Daar zijn de ingangen heel hoogohmig en heb je geen last van de ingangs bias stroom.

Je moet met HC logic wel heel goed opletten dat je ALLE ingangen aansluit. Dus als je bijvoorbeeld 1 van de gates van een AND poort niet gebruikt, hang dan de inputs aan GND. Doe je dat niet kan het circuit zichzelf opblazen want je mag absoluut geen halve voedings spanning aansluiten.

1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.

Ok, dankje voor de nuttige tips!