Hjälp med USB-kommunikation och timer interrupt
Postat: 18 november 2013, 08:42:54
Jag håller på med ett projekt med en USB styrd radiosändare, liknande TELstick, som styrs av en PIC18F25K50. Hittills har jag lyckats få både dataströmmen till radiomodulen och USB kommunikationen till PC att fungera var för sig. Dataströmmen till radiomodulen sköts med interrupt med 300µs mellanrum där jag beroende på hur dataströmmen ser ut togglar en pinne. USB kommunikationen är mer eller mindre Microchips CDC basic demo exempel där den interrupt drivna varianten används.
Det stora problemet kom när jag lade ihop de båda funktionerna i ett och samma projekt. Då ville PICen inte längre ansluta till PCn via USB och interrupten fungerade inte heller. Gissar på att anledningen till att det inte fungerar är att interrupten stör varandra på något sätt. USB kommunikationen lär väl vara ganska känslig och kräver sitt interrupt varje 1 ms. Men jag tycker ändå det borde fungera då Timer0 interruptet bara togglade en diod och borde således inte ta särskilt lång tid att köra igenom. Men det är väl några goto-instruktioner för att nå interruptet som tar tid också kanske. USB interruptet är satt som high-priority och Timer0 som low-priority. Radioprotokollet är Manchester-kodat och klarar ganska så stor spridning. Om det varierar mellan 275 µs och 325 µs spelar inte så stor roll.
Nu är frågan, hur löser jag detta? Har funderat och kommit fram till några alternativ men tänkte även höra med er hur ni skulle löst det? USB och timerinterrupt måste ju gå att köra samtidigt?
De alternativ jag kommit på är..
-Använda Capture/Compare/PWM modulen. Har dock ingen erfarenhet av denna och har därför svårt att bedöma om det kommer fungera eller inte. Tanken är då att istället för att ha en dataström bestående av 1or och 0or göra en ström av tidsintervall som sedan laddas in i CCP modulens compare register och bestämmer när datat ska toggla.
-Är det möjligt att stänga ner USB kommunikationen? I så fall skulle en ide kunna vara att efter mottagen dataström från PCn stänga av USB interrupten och därefter sköta kommunikationen via Timer0 interrupt till radiomodulen. När hela datastömmen är ivägskickad återupptas USB interrupten igen. Ett möjligt problem med denna lösning är att enheten ska drivas av USB-bussen. Suspend-mode får alltså inte användas då det begränsar strömförbrukningen till 2.5 mA.
-Just nu används den inbyggda klockan på 16 MHz. Jag har möjlighet att montera en extern kristall på 48 MHz och använda denna. Det skulle ge 3 gånger snabbare beräkningar och kanske kan man då klara av interrupten tillräckligt snabbt för att hinna serva nästa.
Ge mig gärna era synpunkter. Hur har ni löst liknande problem?
Det stora problemet kom när jag lade ihop de båda funktionerna i ett och samma projekt. Då ville PICen inte längre ansluta till PCn via USB och interrupten fungerade inte heller. Gissar på att anledningen till att det inte fungerar är att interrupten stör varandra på något sätt. USB kommunikationen lär väl vara ganska känslig och kräver sitt interrupt varje 1 ms. Men jag tycker ändå det borde fungera då Timer0 interruptet bara togglade en diod och borde således inte ta särskilt lång tid att köra igenom. Men det är väl några goto-instruktioner för att nå interruptet som tar tid också kanske. USB interruptet är satt som high-priority och Timer0 som low-priority. Radioprotokollet är Manchester-kodat och klarar ganska så stor spridning. Om det varierar mellan 275 µs och 325 µs spelar inte så stor roll.
Nu är frågan, hur löser jag detta? Har funderat och kommit fram till några alternativ men tänkte även höra med er hur ni skulle löst det? USB och timerinterrupt måste ju gå att köra samtidigt?
De alternativ jag kommit på är..
-Använda Capture/Compare/PWM modulen. Har dock ingen erfarenhet av denna och har därför svårt att bedöma om det kommer fungera eller inte. Tanken är då att istället för att ha en dataström bestående av 1or och 0or göra en ström av tidsintervall som sedan laddas in i CCP modulens compare register och bestämmer när datat ska toggla.
-Är det möjligt att stänga ner USB kommunikationen? I så fall skulle en ide kunna vara att efter mottagen dataström från PCn stänga av USB interrupten och därefter sköta kommunikationen via Timer0 interrupt till radiomodulen. När hela datastömmen är ivägskickad återupptas USB interrupten igen. Ett möjligt problem med denna lösning är att enheten ska drivas av USB-bussen. Suspend-mode får alltså inte användas då det begränsar strömförbrukningen till 2.5 mA.
-Just nu används den inbyggda klockan på 16 MHz. Jag har möjlighet att montera en extern kristall på 48 MHz och använda denna. Det skulle ge 3 gånger snabbare beräkningar och kanske kan man då klara av interrupten tillräckligt snabbt för att hinna serva nästa.
Ge mig gärna era synpunkter. Hur har ni löst liknande problem?