[elektro] Hol a hiba?

Fuzesi Arnold arnold.fuzesi.lista at gmail.com
Thu Mar 27 22:55:48 CET 2008


Ket RC OSC-s proci beszelget soros porton.
Atmegy jopar byte, majd hosszu szunet.... megint ugyan ez.

Hosszu szunetre szinkronizalok.
Ha megvolt, akkor elesitem a PortChange IT-t.
Ami a Timer1 segitsegevel megmeri a kommunikacio elso bitidejet...
Igy akarnam a homerseklet stb kulonbsegbol adodo korrekciot elvegezni az OSCCAL-al szabalyozva a proci orajelet.

Neha beBUGzik, 170 kornyeki szamok jonnek (sys.bitstop), de be-be esik pl. 70 kornyeke...

Nincs mas IT a rendszerben csak a TMR0, ami lenn latszik is.
Ha a TMR0 IT-t letiltom amig a PortChangeIT aktiv akkor nem tapasztaltam ezt...

Asztalon probalom, zavarmentes, egzakt minden.
Azaz a master felol jovo elso bitido tuti ugyan annyi... nincs zavar, glitch stb.

Nem talalom a hibat egyszeruen, holnap reggelre jo kellene legyen...
Orvosolni tudom min/max szuressel amit meg is kap hogy a kornyezeti zajok stb kiessenek.
De eleve hibasat nincs kedvem hasznalni.

Az algoritmus nem a legszebb, de hirtelen a faradt agyamtol ennyi tellett:

#define COMM_TIMEOUT 15
/******************************************************************************/
#pragma vector=PCINT2_vect
__interrupt void PCINT2_handler(void)
{
 sys.bitstop=TCNT1;        //Save TNCT1
 if(sys.comm_timer==(COMM_TIMEOUT+1)){
  TCNT1=0;         //@ 1st state Clear TCNT1 & prescaler 
  sys.comm_timer++;       //Next State
 }else{           //@ 2nd state
  PCICR=b00000000;       //Disable PCINT2 IT
  sys.comm_timer=0;       //Reset state cnt
  TIMSK0=b00000001;       //Re-enable TMR0 IT (ha ez benne van akkor jo)
 }
}
/******************************************************************************/
#pragma vector=TIMER0_OVF_vect
__interrupt void TIMER0_OVF_handler(void)
{
    uchar loop0;

 if(sys.comm_timer<COMM_TIMEOUT){    //Wait for Timeout
  sys.comm_timer++;       //Inc. Timeout Cnt
  if(PCIFR&b00000100){      //If Change on RxD
   PCIFR=b00000100;      //Clr IT flag
   sys.comm_timer=0;      //Clr Timeout Cnt
  }
 }
 else if(sys.comm_timer==COMM_TIMEOUT){   //Timeout elapsed
  sys.comm_timer++;
  PCIFR=b00000100;         //Clr IT flag
  PCICR=b00000100;       //Enable PCINT2 IT
  TIMSK0=b00000000;       //Disable TMR0 IT (ha ez benne van akkor jo)
 }


Köszi előre is,
Arnold


More information about the Elektro mailing list