Imam jedan veliki problem koji me vec danima muci! Pravimo nekog robota za takmicenje i ima par sklopova koji medjusobno komuniciraju preko USART-a...
Imam dva drajvera (za sada) i jednu da tako kazem maticnu plocu sa ATMEGA128 kontrolerom... Posto koristim CodeVisionAVR, a ATMEGA128 ima 2 USARTA, jedan sam
iskoristio za komunikaciju sa jednim drajverom i to radi super, a drugi nisam iskoristio jer mi je i on u startu pravio probleme, pa sam ga zamenio sa "vestackim" USART-om
koji provereno znam da radi i testiran je mnogo puta (prosle godine smo ga koristili na isti nacin i radio je)... Evo koda :
interrupt [TIM0_COMP] void timer0_comp_isr(void) //interapt se poziva onoliko brzo koliko je potrebno za baud rate od 9600
{
switch(status_kineski)
{
case CEKA_BAJT_KINESKO:
if(brojBajtovaKinesko!=0) //ako ima bajtova za slanje
{
//smesta bitove tog bajta u buffer
for(poslaoBitovaKinesko=0;poslaoBitovaKinesko<8;poslaoBitovaKinesko++)
{
kineski_tx_buffer[poslaoBitovaKinesko]=kineski_buffer[kineskiBrojac] & 0x01;
kineski_buffer[kineskiBrojac]>>=1;
}
if(kineskiBrojac==1024) kineskiBrojac=0;
else kineskiBrojac++;
status_kineski=SLANJE_START_KINESKO; //menjam stanje softverskog uarta
}
break;
case SLANJE_START_KINESKO:
TX_PIN_KINESKI=1; //start bit
poslaoBitovaKinesko=0;
status_kineski=SALJE_BAJT_KINESKO; //pocinjem sa slanjem bajta
break;
case SALJE_BAJT_KINESKO:
if(poslaoBitovaKinesko==8) //ako je poslao svih osam bitova
{
TX_PIN_KINESKI=0; //stop bit
//poslaoBitovaKinesko=0;
status_kineski=SLANJE_STOP_KINESKO; //zavrsavam slanje
// break;
}else //ako jos uvek saljem bajt
{
//invertujem bitove zbog optokaplera na drajveru
if(kineski_tx_buffer[poslaoBitovaKinesko]==1) TX_PIN_KINESKI=0;
else TX_PIN_KINESKI=1;
//povecavam broj poslatih bitova
poslaoBitovaKinesko++;
}
break;
case SLANJE_STOP_KINESKO:
brojBajtovaKinesko--; //smanjujem broj bajtova za slanje
//vracam se na proveru dali ima nesto za slanje
status_kineski=CEKA_BAJT_KINESKO;
break;
}
} //OVO SE SVE ZOVE KINESKO ZATO STO TAKO ZOVEMO MOTORE KOJIMA UPRAVLJAMO POMOCU DRAJVERA :)
Primeticete da koristim invertovano slanje (jos jedan razlog zasto sam presao sa onog koda koji mi generise CodeVision) jer imam optokapler na drajveru sa kojim komuniciram...
E sad, snifovanjem te "magistrale" kojom su povezani drajver i glavna ploca dosao sam do zakljucka da prosto glavna ploca ne posalje komandu kada bi trebala!
E drugi problem je sto ja bafer ovog USART-a punim i interaptu nekom drugom koji se javlja svake milisekunde. I funkcija u kojoj to radim izgleda ovako :
void salji_motorima(volatile char motor,volatile unsigned char parametri)
{
#asm("cli")
kineski_buffer[kineskiWrIndex]=motor; //ubacujem bajt u transmit buffer
kineskiWrIndex++; //povecavam index
if(kineskiWrIndex==1024) kineskiWrIndex=0;
kineski_buffer[kineskiWrIndex]=parametri; //ubacujem bajt(brzina motora) u transmit buffer
kineskiWrIndex++; //povecavam index
if(kineskiWrIndex==1024) kineskiWrIndex=0;
brojBajtovaKinesko+=2; //povecavam broj bajtova za slanje - videti interapt timera0
#asm("sei")
}
E sad, ja u interaptu pozivam ovu funkciju kada treba da posaljem nesto (a sve to radim u interaptu da bi bilo protocno i da bih dok robot radi nesto drugo, radio nesto trece). Dugo mi je ovo pravilo probleme i stavljanjem ovog #asm("cli") i #asm("sei") bio sam "resio" problem (tacnije nedelju dana svaki dan je radio bez greske ), medjutim opet se javio isti problem i sada jos cesce nego ranije! Postalo je toliko iritantno i sve sam pokusao da uradim kako bih to resio, ali ne ide.
Takodje da napomenem da imam dva tajmerska interapta i jos interapte za USART (TX i RX) koji se jako cesto koriste! Pozivaju se bas cesto… A i sada sam dosao sa testiranja i primetio sam da kontroler posalje nesto sto ne treba, pa sumnjam na bafere koje sam stavio da budu preveliki, ali i kada su bili manji opet ke gresio…
Zato sam resio da pitam vas ljudi, mozda je neko imao slican problem ili zna kako da resim ovaj moj problem?
Ako treba jos neka informacija, recite iznecu vam je :) Verovatno sam nesto od vaznosti zaboravio :)
Ako treba stavicu i ceo kod…
Unapred hvala,
Lestrigonac :)