Jag har ett spak som ökar/minskar motorvarv, den består av en encoder som ger pulser till en stegmotor. Den har ett mittenläge så när man för spaken framåt eller bakåt ifrån sitt mittenläge så ökar varvtalet och vise versa. Jag har lagt ett dödband i mittenläget där jag ger ut signal till backslaget som har ett separat styrkort om det skall gå framåt eller bakåt eller i neutral, innan motorn ökar varv. Detta fungerar fint så länge OLED fungerar. Tidigare hade jag vanliga icke grafiska LCD.
Under resans gång så har jag fått modifiera styrkortet för gaspådrag i och med att OLED är ansluten till andra pinnar och att jag även bytt µC från P4550 till P4622 (vilket ni säkert sett).
Det är 1 st kort till varje motor dvs. 2 st. Det ena kortet fungerade direkt efter modifiering men det andra kortet har strulat och strulat. Jag kollade kallödningar och alla andra tänkbara fel på kortet. I morse hittade jag problemet.
Det som skiljer de 2 korten åt är att på det som krånglade hade jag för skoj skull kopplat in 3 st LED på de pinnar som styr backslaget för att kolla att det hela fungerade. Dessa 3 LED visade sig störa OLED så att den hängde sig mitt i en skrivning. Den var ju programmerad att skriva ut FRAM ELLER back samtidigt som LED tändes eller släktes. Jag kopplade bort LED:arna och det fungerar nu perfekt.
Allt är väl frid och fröjd då kan man tycka? Nej tyvärr, om OLED misslyckas med en skrivning på grund av någon störning så hänger sig hela systemet och det måste resetas för att komma igång igen. Det är ju inte så himla kul om man mister motorkontroll vid full fart fram mot bryggan.
Det jag alltså behöver ideér till är ju hur man skall lösa problemet. Som jag förstått så inväntas en ack (internt i bibliotekstutinen) när skrivkommandot är klart. kommer ingen ack så ligger proceduren och vänta och därmed låser det hela systemet.
Där det hänger sig är här:
Kod: Markera allt
void Oled_WriteRam(uchar dat){
I2C2_Start();
I2C2_Wr(0x78); //******** här fastnar programexekveringen vid störning **********
I2C2_Wr(0x40); // Co = 0, D/C = 1
I2C2_Wr(dat);
I2C2_Stop();
}

Edit: Jag kom nu att tänka på att kanske watchdog är lösningen, får studera lite hur det funkar.