[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