Hjäp med I2C

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Hjäp med I2C

Inlägg av SeniorLemuren »

Så här ser det ut:
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();
}
Hur kan man bryta denna låsning t.ex efter en viss tids hängning (~10ms) och automatiskr göra en reset bara till OLED så man slipper stänga ner systemt och starta om, det kanske man inte hinner innan det blir för dyrt. :)

Edit: Jag kom nu att tänka på att kanske watchdog är lösningen, får studera lite hur det funkar.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46908
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hjäp med I2C

Inlägg av TomasL »

Det är nackdelen med dåliga biblioteksfunktioner.
Du får nog skriva en egen driver, där du kan ha en time-out på acken.
Watchdogen resettar och bootar om, det vill du nog inte.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjäp med I2C

Inlägg av sodjan »

Det går ju att känna av i början av koden ("reset-koden") om det var en
watchdog-reset, och i så fall görna något speciellt, annars köra den vanlig
reset sekvensen. Man kan även ha ett register som man sätter till olika
värden beroende på vad som ska "skyddas" av watchdog, så att man
kan ha olika "rollback" funktioner beroende på var i koden man var...

EDIT:
Det är väl just detta som watchdog funktionen "är bra på"... :-)
Att komma loss då allt har hängt sig...
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46908
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hjäp med I2C

Inlägg av TomasL »

WD'n ressettar en del register samt PCn, så det är omöjligt att veta var det hängde upp sig.
Det enda alternativen är att antingen skriva en egen driver för I2C eller ha ett eget timerinterrupt, och på så sätt kan hantera hängande funktioner (Under förutsättning att funktionen inte stänger av interrupten förståss).
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjäp med I2C

Inlägg av sodjan »

> WD'n ressettar en del register samt PCn, så det är omöjligt att veta var det hängde upp sig.

Inte alls. Antag att jag vill "skydda" ett anrop "CALL XYZ".
Jag kan då sätta en variabel till ett värde "Kör_ZYX".
Om watchdogen triggar så kan jag sedan kolla denna
variabel och se att det var under "CALL XYZ" som
watchdogen löste ut och eventuellt göra något speciellt.

Det finns även statusbitar som skiljer mellan vanlig
"reset", "brownout-reset", "watchdog-reset" o.s.v. just för att
man ska kunna göra olika saker beroende på vad som hände.

Visst, det kanske inte är rätt metod just här, och det finns andra
sätt att hanterade det, men du har fel kring watchdog'en... :-)

Den aktuella processorn (PIC18F46K22) har följande reset-källor:

The PIC18(L)F2X/4XK22 devices differentiate between various kinds of Reset:
a) Power-on Reset (POR)
b) MCLR Reset during normal operation
c) MCLR Reset during power-managed modes
d) Watchdog Timer (WDT) Reset (during execution)
e) Programmable Brown-out Reset (BOR)
f) RESET Instruction
g) Stack Full Reset
h) Stack Underflow Reset

Alla dessa kan identifieras i den startup kod man har och man kan
göra olika saker beroende på hur processorn har resetats.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46908
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hjäp med I2C

Inlägg av TomasL »

Nej, jag har inte fel om WDT, den nollställer PC samt även andra register, se tabell4-3 i databladet.
Följaktligen kan man inte använda WDT till annat än att boota om processorn.
Man får visserligen reda på att det skett en WDT-reset, men det är knappast användbart annat än i debugg-syfte.
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjäp med I2C

Inlägg av SeniorLemuren »

Bota om är inga problem såvida man kan se om det är en WDT-reset och därmed kan hoppa förbi vissa steg i programmet.

Vid normal start av systemet (nyckel på) innan motorerna startas så görs en kontroll av backslaget, det går till sina ändlägen och därefter till neutralläge. Samma gäller trottle, den går till fullgas sedan till tomgång. Först när dessa tester är passerade och Ok så startar man motorerna.

Så tanken är att om det blir strul med displayen så det hänger sig så vill jag ju inte inte initiera den efter en reset eftersom man förmodligen har något fel där och riskerar ytterligare hängning. Sedan vill jag ju inte gå igenom startsekvensen som tar 4-5 s, utan hoppa förbi denna och låta motorerna gå till tomgång och backslagen till neutral direkt. Det tar ca. en sekund och sedan har man åter full kontroll och gör vad son skall göras.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46908
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hjäp med I2C

Inlägg av TomasL »

Å andra sidan, har iofs inte studerat din prolle någåt djupare, utgår ifrån att den har hw-stöd för I2C master, då är ju drivrutinerna rätt enkla. Och tar kanske typ 20 minuter att skriva.
Jag använder i princip aldrig libbar till sådana saker.
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Hjäp med I2C

Inlägg av SeniorLemuren »

För någon som kan ja. För mig tar det flera dagar att läsa databladet bara för att förstå alla register som är inblandade i proceduren. :) Det nämns på flera ställen på nätet att just I2C för P46K22 är väldigt besvärlig att få ordning på.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Hjäp med I2C

Inlägg av janno »

Pröva den koden som autogenereras i MPLAB-X för I2C, om du inte vill köra i MPLAB-X så porta den till MicroC Pro, det kan inte ta mer än nån timme i alla fall.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hjäp med I2C

Inlägg av sodjan »

> den [WDT] nollställer PC samt även andra register, se tabell4-3 i databladet.

Ja, men betydligt färre än en "vanlig" reset. "TABLE 4-3: STATUS BITS, THEIR
SIGNIFICANCE AND THE INITIALIZATION CONDITION FOR RCON REGISTER"
visar enbart RCON och hur man ser vilken typ av reset som det faktiskt.

Och som det står: "Most registers are not affected by a WDT wake-up,
since this is viewed as the resumption of normal operation."

> Följaktligen kan man inte använda WDT till annat än att boota om processorn.

Visst kan man det. Man kan larma, kanske köra någon speciell testrutin
för det ställe det där hängde upp sig, o.s.v.

> Man får visserligen reda på att det skett en WDT-reset...

Och man kan genom att ställa någon egen extra flagga få reda på
*var* det hängde upp sig.

> ...men det är knappast användbart annat än i debugg-syfte.

Tja, det beror ju helt på hur man "använder" det.. :-)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46908
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Hjäp med I2C

Inlägg av TomasL »

Beror naturligtvis på processor också, just denna verkar inte påverka så många register, andra processorer typ 18f8722 så påverkas en hel mängd register.
Skriv svar