ATmega, 74hc595 og læsning af input (Læst 10370x)

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
ATmega, 74hc595 og læsning af input
« Dato: September 08, 2011, 04:12:51 »
Hej folkens.

Et lille hurtigt spørgsmål, hvis jeg gør programmeringen rigtig, kan jeg så læse fra en 74hc595 chips "udgange", eller skal jeg bruge en CD4021B chip?

Eller hvad er jeg begrænset til at bruge? Multiplexer måske? Hmmm..

På forhånd tak.
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #1 Dato: September 08, 2011, 16:35:12 »
Et lille hurtigt spørgsmål, hvis jeg gør programmeringen rigtig, kan jeg så læse fra en 74hc595 chips "udgange", eller skal jeg bruge en CD4021B chip?

Du kan sætte alt TTL direkte på en AVR uden at sætte noget 'imellem', så jeg vil tro at du ville kunne gøre tilsvarende for en 74HC595.

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #2 Dato: September 08, 2011, 21:14:03 »
TTL = ?


Mvh. Danni.
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #3 Dato: September 08, 2011, 21:59:35 »
TTL = ?

Transistor-to-Transistor-Logic.

Med andre ord: Hele 74xxx serien. =)

Desuden kan du sætte opto-couplere, LEDs (med modstand), switches, mm. direkte på benene også.
Du kan sætte følere (temperatur, fugtighed, chok, vægt, mm.) direkte på ADC ben også.

Har du 5 tryk-knapper, kan du med modstands-netværk forbinde disse 5, så de giver et analogt signal, og du kan sætte dem alle 5 på ét ADC ben. (Specielt praktisk på ATtiny85, for ikke at tale om ATtiny10)

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #4 Dato: September 09, 2011, 19:45:22 »
Hmm, er lidt i tvivl om hvad du mener Pacman.. :-/

Måske du vil demostere? :)
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #5 Dato: September 09, 2011, 21:16:53 »
Hmm, er lidt i tvivl om hvad du mener Pacman.. :-/

Mit første forsøg slog fejl, fordi der var en ting jeg havde glemt at tænke over, så jeg må lige have lidt mere tid til at give et fornuftigt eksempel. ;)

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #6 Dato: September 09, 2011, 21:36:57 »
Det er iorden du :)

Fik iøvrigt afvide af en ven, at jeg ikke umidelbart kan bruge en 74hc595 som multi input.. :-/
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #7 Dato: September 09, 2011, 22:30:08 »
Fik iøvrigt afvide af en ven, at jeg ikke umidelbart kan bruge en 74hc595 som multi input.. :-/

Er det noget lign. 74148 du er ude efter ?
-Altså 8 inputs til 3 outputs?
(Man kan også bruge en 74138/74238 til at omdanne 3 outputs til 8 outputs)

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #8 Dato: September 11, 2011, 16:02:19 »
Det er en omvendt 74hc595 jeg søger :) Som du siger, 8 inputs til 3 outputs.. eller hvordan man nu skal sige det.

Jeg ved at jeg kan bruge en CD4021BE, så jeg er ikke helt tabt... Ville bare spare lidt penge hvis jeg kunne nøjes med at bruge den samme enhed (74hc595), som både 8 output og 8 input.. :)
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #9 Dato: September 11, 2011, 20:16:10 »
Det er en omvendt 74hc595 jeg søger :) Som du siger, 8 inputs til 3 outputs.. eller hvordan man nu skal sige det.

Det lyder som om du søger en 74hc148. Den har også prioritet.
Dvs. du kan koble 7 taster til og så få 3 outputs (0 til 6), eller 8 taster og 4 outputs.
A0, A1 og A2 er outputs (address), 0-7 er inputs. EO kan bruges som fjerde output (dvs. input til din microcontroller). Prøv at se på 74148's datablad

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #10 Dato: September 11, 2011, 21:39:10 »
Den kigger jeg lige lidt videre på så :)

Tak for hjælpen Pacman.
Mvh. Danni Hansen.

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #11 Dato: September 15, 2011, 12:09:38 »
Spg. Til 74hc595:

Jeg har læst via denne side:
http://www.arduino.cc/en/Tutorial/ShiftOut

At jeg kan sætte disse i forbindelse med hinanden, så jeg kan styre utallige dioder fra 3 outputs i processoren, fx, hvis jeg bruger arduino til det, at jeg kan få port 8, 10 og 11 til at styre op til "hvem ved hvor mange" dioder... :)

Men, hvordan gør jeg det? Fordi jeg har da godt nok opstillet det efter "manualen", men, uden held, den tager først grøn og tænder den første når jeg trykker 0, der efter gul når jeg trykker 0, hvis jeg så vil tænde grøn igen, så kan jeg intet gøre, andet end hvis jeg trykker reset først...

Er godt nok lost lige pt.. Er det koden eller opstillingen der er forkert?

Kode følger senere.
Mvh. Danni Hansen.

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #12 Dato: September 15, 2011, 15:02:43 »
utallige

Husk at din strømforsyning skal kunne følge med.
Lad os antage at du bruger en alm. 7805. Denne klarer gerne 1A. Men man kan også få en LM78S05, den kan klare 2A.
Derudover kan de fleste diodebroer klare 1A. Man kan til en fornuftig pris få en diodebro der kan klare 1.5A.
Du kan i stedet for sætte 2 diodebroer parallelt, men husk at forbinde dem korrekt.

Lad os antage at en lysdiode er på 3V, 20mA. Der ryger altså 20mA pr. lysdiode, hvilket vil sige at på 1A kan du sætte 50 lysdioder. Derudover trækker IC'erne også lidt strøm. Hver IC klarer 8 LEDs, hvilket vil sige at 50/8 = 6. 6*8 = 48. Så hvis du sætter 6 IC'er på og 48 lysdioder, trækker du nok omkring 1A.
Dvs. Hvis du er lidt flittig med loddekolben har du et 10x10 LED display, som trækker omkring 2A.

Citér
...tænder den første når jeg trykker 0, der efter gul når jeg trykker 0,...
Er godt nok lost lige pt.. Er det koden eller opstillingen der er forkert?

Da jeg på omtalte side ikke kan se noget der skal 'trykkes' vil jeg gå ud fra at koden er ændret.

Efter al sansynlighed er det nok koden der har en smule fejl.

Prøv noget simpelt, lav et program, som gør følgende:
1: Tænd en bestemt kombination af lysdioder
2: Hold en 1 sek. pause
3: Tænd en anden kombination af lysdioder
4: Hold 1 sek pause
5: Tænd en tredje kombination af
6: Hold 1 sek pause
7: Gå tilbage til trin 1.

Der sendes jo en bitstrøm (fx. 8 bits). Disse skal clock'es ind, dvs. du skal køre clock-benet lavt/højt hver gang der skal indlæses en ny bit.

Jeg vil tro at hvis du har OE lav hele tiden og clock'er ganske langsomt (1 gang i sekundet), vil du se at efterhånden som du fyldet bits på, 'skiftes de ind' på næste LED.
Fx...
Du sender bitværdien '1' ind på første clock-puls, derefter '0' på resten af clock-pulserne, lysdioderne vil så lyse som følgende, efterhånden som du sender en clock-puls:
clk 0: LED7: slukket, LED6: slukket, LED5: slukket, LED4: slukket, LED3: slukket, LED2: slukket, LED1: slukket, LED0: slukket
clk 1: LED7: slukket, LED6: slukket, LED5: slukket, LED4: slukket, LED3: slukket, LED2: slukket, LED1: slukket, LED0: tændt
clk 2: LED7: slukket, LED6: slukket, LED5: slukket, LED4: slukket, LED3: slukket, LED2: slukket, LED1: tændt, LED0: slukket
clk 3: LED7: slukket, LED6: slukket, LED5: slukket, LED4: slukket, LED3: slukket, LED2: tændt, LED1: slukket, LED0: slukket
clk 4: LED7: slukket, LED6: slukket, LED5: slukket, LED4: slukket, LED3: tændt, LED2: slukket, LED1: slukket, LED0: slukket
clk 5: LED7: slukket, LED6: slukket, LED5: slukket, LED4: tændt, LED3: slukket, LED2: slukket, LED1: slukket, LED0: slukket
clk 6: LED7: slukket, LED6: slukket, LED5: tændt, LED4: slukket, LED3: slukket, LED2: slukket, LED1: slukket, LED0: slukket
clk 7: LED7: slukket, LED6: tændt, LED5: slukket, LED4: slukket, LED3: slukket, LED2: slukket, LED1: slukket, LED0: slukket
clk 8: LED7: tændt, LED6: slukket, LED5: slukket, LED4: slukket, LED3: slukket, LED2: slukket, LED1: slukket, LED0: slukket

Jeg har tilladt mig at fjerne en del skrammel fra hans rutine; den bliver lidt hurtigere, og jeg mener mere overskuelig.

Kode:
void shiftOut(uint8_t aDataPin, uint8_t aClockPin, uint8_t aData)
{
    uint8_t i;

    pinMode(aClockPin, OUTPUT);                     /* clock pin is output */
    pinMode(aDataPin, OUTPUT);                      /* data pin is output */

    digitalWrite(aDataPin, 0);                      /* data pin low */

    for(i = 7; i >= 0; i--)                         /* do all 8 bits */
    {
        digitalWrite(aClockPin, 0);                 /* clock pin low */
        digitalWrite(aDataPin, (aData >> i) & 1);   /* set data on data pin */
        digitalWrite(aClockPin, 1);                 /* clock pin high */
/*      digitalWrite(aDataPin, 0); */               /* data pin low (obsolete, removed!) */
    }
    digitalWrite(aClockPin, 0);                     /* last shift's clock ends at 0 */
}

Du burde kunne gøre følgende:

Kode:
void wait1sec()
{
    _delay_ms(250);
    _delay_ms(250);
    _delay_ms(250);
    _delay_ms(250);
}

int main()
{
    while(1)
    {
        shiftOut(170);
        wait1sec();
        shiftOut(240);
        wait1sec();
        shiftOut(85);
        wait1sec();
    }
}

Og så se forskellige mønstre skifte med 1 sek. mellemrum.
-Eller måske bedre:

Kode:
int main()
{
    uint8_t i;

    i = 0;
    while(1)
    {
        shiftOut(i++);
        _delay_ms(250);
    }
}

Da skulle du kunne se en binær tæller, når du bare kobler 8 stk. LEDs på ét shift-register.

Jeg vil tro, at hvis du nu skal have 16 LEDs på med 2 shift-registre, bør du nok have følgende test-kode:
Kode:
int main()
{
    uint8_t i;
    uint8_t j;

    i = 0;
    j = 0;
    while(1)
    {
        shiftOut(i++);
        shiftOut(j++);
        _delay_ms(250);
    }
}

 

Offline pacman

  • Højpas filter
  • *****
  • Indlæg: 311
  • Antal brugbare Indlæg: 8
  • Jens Bauer (Forsøgs-person)
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #13 Dato: September 17, 2011, 08:00:23 »
... 74hc595 ... kan styre utallige dioder

Forresten:
74HC595 kan klare 25..30mA per udgang, men absolut maksimum 70mA.
-Så hvis du har 3 LEDs på med en 100 ohm modstand, så kan du ikke have flere på.
Du kunne evt. give hver lysdiode færre mA, så kunne du have alle 8 på.
Fx. bruger jeg næsten altid 1K modstande på 5V, selvom en LED normalt klarer 100 ohm. Den lyser rigeligt som indikator (den vil endda stadig lyse svagt ved 10K).
-Ellers må du sætte nogle transistorer eller ULN2803 på også, men jeg har på fornemmelsen at du ønsker at undgå dette.
Det kan forresten være at du vil opleve at når du har 1 LED tændt, vil denne lyse kraftigere, end hvis du har alle 8 tændt, fordi de bruger af samme strømkilde. -Her hjælper det også lidt at skrue ned for strømforbruget.

Igen gælder det... Monterer du dine LEDs til VCC i stedet for GND, vil din 74595 klare ærterne bedre.
Altså: Den 'synker' strøm bedre på GND end på VCC.
Med andre ord: Sæt en modstand fra VCC til din LED's postive ben, og sæt LED'ens negative ben til din 74595.
Du vil opleve at LED'en lyser på værdi 0, mens den er slukket på værdi 1. Det er så en bivirkning, som du må leve med - altså skal du bare sige 1 for sluk og 0 for tænd. ;)
« Senest Redigeret: September 17, 2011, 08:07:03 af pacman »

 

Offline Danni-Hansen

  • µProcessoren
  • *
  • Indlæg: 544
  • Antal brugbare Indlæg: 17
    • Vis profil
Sv: ATmega, 74hc595 og læsning af input
« Svar #14 Dato: September 17, 2011, 11:11:55 »
Hej Pacman.

Tak for svar.

Hmm, jeg bruger lige pt 220 ohms modstange på hver udgang fra 75hc595. Hvilket må være omkrng 0.022A?
Mvh. Danni Hansen.