|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jozzze2000 Član
Pridružen-a: Pet 25 Nov 2011 8:36 Prispevkov: 167 Aktiv.: 1.11 Kraj: Novo mesto
|
Objavljeno: Čet Jul 02, 2015 11:23 am Naslov sporočila: Atmega8 in shift registri |
|
|
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 |
|
|
MitjaN Član
Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.59 Kraj: Ljubljana
|
Objavljeno: Čet Jul 02, 2015 11:32 am Naslov sporočila: |
|
|
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 |
|
|
jozzze2000 Član
Pridružen-a: Pet 25 Nov 2011 8:36 Prispevkov: 167 Aktiv.: 1.11 Kraj: Novo mesto
|
Objavljeno: Čet Jul 02, 2015 12:12 pm Naslov sporočila: |
|
|
Hvala lepa, deluje |
|
Nazaj na vrh |
|
|
|
|
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: 73 dni
Powered by phpBB © 2001, 2005 phpBB Group
|