4x74HC595 a Atmega16 nefunguje [vyřešeno]

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

4x74HC595 a Atmega16 nefunguje [vyřešeno]

Príspevok od používateľa jirka.jirka. » 06 Jan 2013, 20:16

Ahojte.
Tady se snažím rozchodit 74HC595 abych si vypsal jakékoli číslo. Použil jsem program, který se mi podařilo rozjet, ale pouze v simulátoru Proteus. :-D A ono ejhle, teď v reálu nefunguje a já ne a ne přijít na chybku. Pomůže někdo?

Takt krystalu 16MHz, prcák: Atmega16

kód zde.

Kód: Vybrať všetko


#include <avr/io.h>
#include <util/delay.h>
#include "avr/pgmspace.h"
#include "stdlib.h"
#include "avr/interrupt.h"
 
#define DS_PORT    PORTC
#define DS_PIN     0
#define ST_CP_PORT PORTC
#define ST_CP_PIN  1
#define SH_CP_PORT PORTC
#define SH_CP_PIN  6
 
#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 char __led_state);
//======================
 

const char textdata[] PROGMEM=
{
	0b11000000,//0
	0b11111001,//1
	0b10100100,//2
	0b10110000,//3
	0b10011001,//4
	0b10010010,//5
	0b10000010,//6
	0b11111000,//7
	0b10000000,//8
	0b10010000,//9
	0b10011100,//°
	0b11000110,//C
};

//*******************************************************************************
//*********************************Proměnné**************************************
//*******************************************************************************
unsigned char jed_hodin,des_hodin,jed_minut,des_minut,minuty,hodiny,sekundy;	//jednotky hodin, desítky hodin, jednotky minut, desítky minut 
																				//minuty, hodiny, druhý

//*******************************************************************************
//*******************************Funknce atd..***********************************
//*******************************************************************************

void ioinit (void)		//inicializace
{
    DDRC  = 0b01000011; //1 = output, 0 = input
    PORTC = 0b00000000; //pullup off
	
	minuty=0;
	hodiny=0;
	sekundy=0;
}

void clock_74595()		//hodinový pulz 74HC595
{
	SH_CP_high();
	SH_CP_low();
}


void kirimbyte74595(unsigned char data_led)		//zápis BYTE
{	
	if(bit_is_set(data_led,7)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,6)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,5)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,4)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,3)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,2)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,1)) DS_high();else DS_low();
	clock_74595();
	if(bit_is_set(data_led,0)) DS_high();else DS_low();
	clock_74595();
}
void zapis_na7segment()		//zobrazovač na 4x7-segmentovce
{
	des_hodin=pgm_read_byte(&textdata[des_hodin]);
	kirimbyte74595(des_hodin);
	jed_hodin=pgm_read_byte(&textdata[jed_hodin]);
	kirimbyte74595(jed_hodin);
	des_minut=pgm_read_byte(&textdata[des_minut]);
	kirimbyte74595(des_minut);
	jed_minut=pgm_read_byte(&textdata[jed_minut]);
	kirimbyte74595(jed_minut);
	ST_CP_high();
	_delay_ms(30);
	ST_CP_low();
}
void prevod()	//prevod cisla
{
	des_hodin=hodiny/10;	//destíky hodiny
	jed_hodin=hodiny%10;	//jednotky hodiny
	des_minut=minuty/10;	//desítky minut
	jed_minut=minuty%10;	//jednotky minut
}
//*******************************************************************************
//*******************************Hlavní smyčka***********************************
//*******************************************************************************
int main (void)
{
   ioinit(); //inicializace
 
   while(1)	//nekonecnik
   {
		prevod();	//fce prevod prevede cislo na jednotky a desitky
		zapis_na7segment();

		minuty=5;
		hodiny=5;
		sekundy=5;
   }
}

0
Naposledy upravil/-a jirka.jirka. v 06 Jan 2013, 21:08, upravené celkom 1 krát.

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: 4x74HC595 a Atmega16 nefunguje

Príspevok od používateľa jaromir » 06 Jan 2013, 20:23

Prepac, mam vestecku gulu v cistiarni, tak sa pytam trochu blbo :D

Co znamena nefunguje?
Bezi ti vobec program?
Deje sa nieco na pinoch, ktore su pripojene k 74HC595?
Mozes ukazat schemu ako si to zapojil?

Programy sa nepisu tak, ze do MCU nakydam dve obrazovky kodu v zdrojakoch a dufam, ze to bude fungovat. Takto to robia bud absolutni profici, alebo absolutni zaciatocnici. :wink:
Treba program skladat od najjednoduchsich veci, tie otestovat a potom postupovat k zlozitejsim. Ty si si mal najprv napisat rutinku pre 74HC595 (cca 10 riadkov kodu) a tu otestovat (dalsich 10 riadkov kodu). Az ked toto funguje, tak riesit dalsie veci.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: 4x74HC595 a Atmega16 nefunguje

Príspevok od používateľa jirka.jirka. » 06 Jan 2013, 20:27

No sepsal jsem si easy program na test, kterž vypadá takto, tímto jsem si pouze ověřil, že mám ty 74HC595 dobře zopojené. Tak proto problém v zapojení nevidím. ;-)

Kód: Vybrať všetko

#include <avr/io.h>
#include <util/delay.h>
#include "avr/pgmspace.h"
 
#define DS_PORT    PORTC
#define DS_PIN     0
#define ST_CP_PORT PORTC
#define ST_CP_PIN  1
#define SH_CP_PORT PORTC
#define SH_CP_PIN  6
 
#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 char __led_state);
//======================
 

const char textdata[] PROGMEM=
{
	0b11000000,//0
	0b11111001,//1
	0b10100100,//2
	0b10110000,//3
	0b10011001,//4
	0b10010010,//5
	0b10000010,//6
	0b11111000,//7
	0b10000000,//8
	0b10010000,//9
	0b10011100,//°
	0b11000110,//C
};

int main (void)
{
   ioinit(); //Setup IO pins and defaults
 
   while(1)
   {
    for (int i=7;i>=0;i--)
      {
         output_led_state(_BV(i));
         _delay_ms(100);
      }
     
      for (int i=1;i<7;i++)
      {
         output_led_state(_BV(i));
         _delay_ms(100);
      }

   }
}
 
 
void ioinit (void)
{
    DDRC  = 0b01000011; //1 = output, 0 = input
    PORTC = 0b00000000; //pullup off
}
 
void output_led_state(unsigned char __led_state)
{
   SH_CP_low();
   ST_CP_low();
   for (int i=0;i<8;i++)
   {
      if (bit_is_set(__led_state, i))
         DS_high();
      else  
         DS_low();
     
 
      SH_CP_high();
      SH_CP_low();
   }
   ST_CP_high();
}
A teď k tomu předchozímu. Program neudělal vůbec nic. Nerozsvítil se ani jeden segment.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: 4x74HC595 a Atmega16 nefunguje

Príspevok od používateľa jaromir » 06 Jan 2013, 20:55

Ja ti verim, ze to mas dobre zapojene, inak by si to tak nezapajal, ale chcem vidiet ako to mas zapojene :)

Ked program neurobil vobec nic, bezi vobec? Deje sa nieco na pinoch k 74HC595?

Skus robit posielanie udajov do 74HC595 furt dokola a po kazdom odosleni zmen stav jedneho IO pinu, mozes si tam dat trebars LEDku alebo osciloskop. Uvidis bud rychle blikanie (malo pravdepodobne) alebo trvaly svit (velmi pravdepodobne) na polovicnej intenzite. Voltmetrom na tom pine zmerias asi polovicu napajacieho napatia. Kazdopadne by si mal nieco na tej LEDke vidiet.
Potom skus tu LEDku pripajat na piny 74HC595 a aj tam by si mal vidiet nejaku aktivitu.
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: 4x74HC595 a Atmega16 nefunguje

Príspevok od používateľa jirka.jirka. » 06 Jan 2013, 21:00

:-D No jo, tak problém byl asi odhalen. Měl jsem programově prohozené piny ST_CP a CH_CP. :-D

A jako druhé problém mám v buzení segmentů.

1 segment svítí
0 segment nesvítí

Takže ještě předělat tabulku a dám vědět jestli to už funguje. ;-)
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1538
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: 4x74HC595 a Atmega16 nefunguje

Príspevok od používateľa jirka.jirka. » 06 Jan 2013, 21:06

Tak je to tak. V programu jsem měl přehozené ty 2 datové kabely a u těch čísel stačí přehodit 0 za 1 a 1 za 0.

Proč jenom ty nejjednodušší chyby bývají ty nejtěžší? :-D
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: 4x74HC595 a Atmega16 nefunguje [vyřešeno]

Príspevok od používateľa jaromir » 06 Jan 2013, 21:14

No prosim.
Taketo chyby ja dobre poznam,preto som si pytal tu schemu :)
Vela zdaru - kiez by vsetky chyby vbuducnosti boli takto trivialne.
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok