www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Atmega8 in shift registri

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
jozzze2000
Član
Član



Pridružen-a: Pet 25 Nov 2011 8:36
Prispevkov: 167
Aktiv.: 1.11
Kraj: Novo mesto

PrispevekObjavljeno: Čet Jul 02, 2015 11:23 am    Naslov sporočila:  Atmega8 in shift registri Odgovori s citatom

Rad bi zvezal 4 shift registre v "daisy chain" in z njimi krmilil 32 LED-ic. Z dvema deluje OK, z več kot dvema pa se zatakne.

Trenutna koda, ki deluje z dvema sh.registroma (columns = 16 LED-ic) je spodaj.
Ko dodam še en sh.register ter spremenim konstanto columns na 24 in povečam vhodni podatek v funkcijo Shift_Int na 24 bitov, se še vedno prikaže samo na dveh sklopih LED-ic (dva sh.registra). Prosim pomagajte.

Koda:
#include <avr/io.h>

#include <util/delay.h>

typedef unsigned char u8;
#define F_CPU 1000000UL

/************************/
//V1

#define DS_PORT    PORTC   // Data pin
#define DS_PIN     1
#define ST_CP_PORT PORTC   // Latch pin
#define ST_CP_PIN  0
#define SH_CP_PORT PORTC   // Clock pin
#define SH_CP_PIN  2

/************************/
//V2

//The pins used to operate the shift register:
#define ShiftPort    PORTC
#define ShiftDDR   DDRC
#define LatchPin   (1 << 0)
#define DataPin      (1 << 1)
#define ClkPin      (1 << 2)

/************************/
 
#define DS_low()  DS_PORT&=~_BV(DS_PIN)
#define DS_high() DS_PORT|=_BV(DS_PIN)
#define ST_CP_low()  ST_CP_PORT&=~_BV(ST_CP_PIN)
#define ST_CP_high() ST_CP_PORT|=_BV(ST_CP_PIN)
#define SH_CP_low()  SH_CP_PORT&=~_BV(SH_CP_PIN)
#define SH_CP_high() SH_CP_PORT|=_BV(SH_CP_PIN)
 
//Define functions
//======================
void ioinit(void);
void output_led_state(unsigned long int LED_state);
void Shift_Int(int32_t shiftData);
//======================
 
 int columns=16;  // 24 //32
 
int main (void)
{
    DDRC  = 0b00000111; //1 = output, 0 = input
    PORTC = 0b00000000;
 
   while(1)
   {
     Shift_Int(0b1000110110000101); // 100111011000110110000101  // 10111101100111011000110110000101
   }
}
 

void Shift_Int(int32_t shiftData)         //Function used to shift in data
{
   ShiftPort &= ~(LatchPin | ClkPin | DataPin);     //All pins low: LatchPin low signals a write operation
   
   for (int i=0; i<columns; i++)
   {
      ShiftPort &= ~ClkPin;            //Set ClkPin low

      if (shiftData & (1<<i)) ShiftPort |= DataPin;      //Set DataPin high if current bit is 1
      else ShiftPort &= ~DataPin;         //Set DataPin low if current bit is 0

      ShiftPort |= ClkPin;            //Set ClkPin high to increment shift register
      ShiftPort &= ~DataPin;            //Set DataPin low to prepare for next write
   }

   ShiftPort |= LatchPin;              //Set LatchPin high to signal end of write operation
   ShiftPort &= ~(ClkPin | DataPin);           //Reset ClkPin and DataPin to low
}
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MitjaN
Član
Član



Pridružen-a: Sre 17 Avg 2011 15:40
Prispevkov: 91
Aktiv.: 0.59
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jul 02, 2015 11:32 am    Naslov sporočila:   Odgovori s citatom

Ali ti prevajalnik poda kakšno opozorilo, ali vsaj obvestilo?

Precej verjetno prevajalnik konstanto 1 v izrazu
"if (shiftData & (1<<i)) ShiftPort |= DataPin; //Set DataPin high if current bit is 1 "

privzeto vzame kot klasičen int. Ne poznam tvojega sistema ampak nekje so int široki 16 bitov. seveda ga potem ne moreš premakniti v levo za več kot 15 bitov.

Poizkusi ga pretvoriti(cast) v 32 bitno konstanto:
"(1<<i)" spremeni v"(((int32_t)1)<<i)"
ali pa:
"(1<<i)" spremeni"(1L<<i)"
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jozzze2000
Član
Član



Pridružen-a: Pet 25 Nov 2011 8:36
Prispevkov: 167
Aktiv.: 1.11
Kraj: Novo mesto

PrispevekObjavljeno: Čet Jul 02, 2015 12:12 pm    Naslov sporočila:   Odgovori s citatom

Boo hoo! Boo hoo! Boo hoo!

Hvala lepa, deluje Dancing
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Osnove programiranja AVR-jev Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group