ATmega328P SPI i 74HC595 - Čudno ponašanje

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
sonata
Napredujem
Napredujem
Posts: 121
Joined: 08-01-2013, 18:01

ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by sonata »

Igrao sam se malo sa postavljanjem vrijednosti 8 bitnog serijsko/paralelnog latch registra (74HC595) i provjeravao prethodna stanja. Upišem bajt preko SPI-a, upišem drugi bajt preko SPI-a i pročitam primljeni bajt koji mora biti jednak onom prethodnom (74HC595 ima i izlaz pa kako dobiva bitove na ulaz, tako shifta "svoje" bitove na izlaz).

I sad - problem. "monitoring" preko Serial.print-a (arduino, dakako) pokazuje da se povremeno javljaju greške u čitanju iz registra, odnosno, da primljeni bajt ne odgovara onom prethodnom poslanom. Npr. bio je broj 55 pa je sad na redu broj 56, pošalje na SPI broj 56, a ne primi sa SPI-a prethodni 55, nego 54, dakle, ne prošlu vrijednost, nego pretprošlu. To se događa na svim prescalerima, dakle, i na najvećoj i na najmanjoj brzini komunikacije. Otprilike je 5-10% bajtova krivih, ostali su OK. Jasno bi mi bili da ne valja niti jedan, ali ovo mi ne štima.

Pojava se javlja i kod svih brzina UART komunikacije prema računalu, s tim da je izraženija kod 115200 nego kod 9600 kbps.

I onda - očajnički potez pa šok i nevjerica. Postavim serisjku vezu prema PC-u na 500000 kbps i odjednom sistem radi bez ikakvih problema, ostavio sam ga sat vremena, nije prijavio niti jednu grešku (osim prve odmah u startu koja je posljedica stava "ne da mi se programirati bezveze").

Kakve veze ima brzina UART-a sa SPI komunikacijom?

prilog - kôd:

Code: Select all

byte i=0;
byte j=0;
int err=0;

void setup() {

  /* Postavi MOSI, SCK i SS kao izlaze */
  DDRB |= (1<<DDB5)|(1<<DDB3) |(1<<DDB2);

/*

SPCR:   7     6     5     4     3     2     1     0
      SPIE   SPE   DORD  MSTR  CPOL  CPHA  SPR1  SPR0
      
      SPR1, SPR0:   0  0  = f/4
                    0  1  = f/16
                    1  0  = f/64
                    1  1  = f/128

SPSR:   7     6    -----   0
      SPIF  WCOL         SPI2X

*/
  SPCR = B01010000; //Omogući SPI, postavi Master, mod rada 0, prescaler na "najbrže"
  SPSR |=1; //brzina SPI x 2


pinMode(4,OUTPUT);
pinMode(9,OUTPUT);
pinMode(6, OUTPUT);

//Reset registra 74HC595
digitalWrite(4,LOW);
digitalWrite(4, HIGH);

//Postavljanje registra 74HC595 na izlaze
   digitalWrite(6,HIGH);
   digitalWrite(6,LOW);
 
 //Enable 74HC595
 digitalWrite(9,LOW);


Serial.begin(500000);

}

void loop() {


  
  for(i=0; i<=255;i++){

//SPI komunikacija  
    SPDR = i;
   while(!(SPSR & (1<<SPIF)))
   j=SPDR;
   
//Postavljanje registra 74HC595 na izlaze

    PORTD |=B01000000;
//   digitalWrite(6,HIGH);
    PORTD &=B10111111;
//   digitalWrite(6,LOW);
   
   Serial.print(i);
   Serial.print("\t");
   Serial.print(j);
  j++;
   if (i==j){
     Serial.print("\t OK");
   }else{
	if (i!=1) {
		err++;
		Serial.print("\t ERROR");
    }
   }
   
   Serial.print("\t Broj gresaka:");
   Serial.println(err);

}
  
  
  
}
Nullius addictus iurare in verba magistri
sonata
Napredujem
Napredujem
Posts: 121
Joined: 08-01-2013, 18:01

Re: ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by sonata »

Jao, krivi podforum sam kliknuo. Ako može admin prebaciti na AVR :D ....
Nullius addictus iurare in verba magistri
sonata
Napredujem
Napredujem
Posts: 121
Joined: 08-01-2013, 18:01

Re: ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by sonata »

Ovo se zbiva kad imam serijsku komunikaciju na 115200... Imam dojam da mi promične nešto trivijalno :-)

http://www.igreklik.com/slike/images/11 ... 020919.jpg
Nullius addictus iurare in verba magistri
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7876
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by pedja089 »

Ne znam sta pametno da ti kazem. Ne razumem se u to sranje, ali probaj pratiti izlaze, pa pogledaj da li greska nastaje pri upisu, ili citanju.
Ne znam da li taj atmel pati od RMW problema pri ovakvim izrazima PORTD |=B01000000;
EDIT: Problem mogu i da prave smetnje ukoliko su zice duge. A moze biti i los spoj...
Izgleda da sam dzaba pisao, nista pametno rekao nisam :lol:
sonata
Napredujem
Napredujem
Posts: 121
Joined: 08-01-2013, 18:01

Re: ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by sonata »

Taman mi nešto usfalilo jumper žica, ali spojit ću izlaze latcha na ulaze kontrolera čim stignem, ne smije ovo ovako završiti.

Žice sad jesu bezveze, ali nevjerojatno mi je da na najvećoj brzini (što je praktički 8 MHz) uredno radi ako šaljem tekst računalu preko UART-a na 500.000 kbps, a radi probleme ako šaljem sa 115.200 kbps. U oba slučaja SPI radi jednakom brzinom, koristi iste naredbe i što je najbolje, serijska komunikacija prema računalu obavlja se kad SPI svoje odradi. Duhovi? U tehnici ih nema, valjda :-)

Što se tiče RMW problema, nisam ih susreo do sad, a kompletna manipulacijama portovima na AVR-u se obično radi tako. Konkretne dvije linije kôda dižu i spuštaju pin na kojeg sam spojio "upisni pin" shift/latch čipa, tek toliko da vidim jel dovoljno brz da mu trajanje impulsa od 125ns dovoljno (dva takta 16 MHz-a) - dovoljno je. A taj dio ionako nema veze, shift registar unutar HC595 mora primiti i poslati bajt neovisno o tome hoće li ga "prepisati" na svoje izlaze ili neće.

U stvari, ni ne znam kako bi uopće došlo do RMW problema, osim ako zbog nekog krivog spajanja u krugu postavim izlaz na 1, a nekakav potrošač ga nastavi držati na nuli, ili ako postavim pin kao ulaz, uključim pull-up, a pin fizički preko malog otpora spojim na masu - tada će mi krivo očitati stanje, tj. očitat će nulu iako sam postavio jedinicu. No za takve slučajeve se koriste stanja portova u varijablama pa se manipulira varijablama i nakon svake manipulacije varijablom ista se prepiše u port, ali to već spada u fail safe programiranje, što nikako nije tema... Uglavnom, na AVR-u je normalno peti pin porta F paliti sa PORTF |= B00100000; i gasiti sa PORTF &=B11011111; . Ili još bolje, PORTF |= 1<<5; i tako dalje.

Za one koji su "zapeli" na Arduinu, tu je "digitalWrite" naredba koja traje red veličine duže, ali za većinu aplikacija je to nevažno, a čitljivost kôda raste u beskraj.

Evo, sad sam se i ja raspisao, a ništa nisam zaključio :-)
Nullius addictus iurare in verba magistri
User avatar
Black
Odlično uznapredovao
Odlično uznapredovao
Posts: 981
Joined: 17-12-2008, 15:44

Re: ATmega328P SPI i 74HC595 - Čudno ponašanje

Post by Black »

Ma arduinu su nekako povezani.
Tako sam imao problemsa ekranom(komunikacija preko SPI) džaba što dižem brzimu SPI, ekran nije ispisivao ništa brže dok nisam digao i UART brzinu
Post Reply