Hur gör man en snabb funktion i C?
Re: Hur gör man en snabb funktion i C?
Det skulle ju kunna fungera så här:
När processorn INTE är i interrupt så skrivs det till både vanliga och shadow samtidigt så fort nåt skrivs. Under en interrupt är "länken" bruten så det som skrivs till de vanliga hamnar inte i interrupt. Vid återhopp från interrupt skrivs innehållet från shadow över till de vanliga.
Det är ju relativt enkelt att testa. Skrivit något till ett register. Läs ut motsvarande shadown. Är det lika eller olika?
När processorn INTE är i interrupt så skrivs det till både vanliga och shadow samtidigt så fort nåt skrivs. Under en interrupt är "länken" bruten så det som skrivs till de vanliga hamnar inte i interrupt. Vid återhopp från interrupt skrivs innehållet från shadow över till de vanliga.
Det är ju relativt enkelt att testa. Skrivit något till ett register. Läs ut motsvarande shadown. Är det lika eller olika?
Re: Hur gör man en snabb funktion i C?
Grejen är att processorn aldrig "är i interrupt". Det är enbart
en konvention som *vi* använder för att beskriva det hela.
Ett interrupt är mer som en vanlig subrutin, det är bara det
att det triggas asynkront utan inverkan av koden i sig.
En RETFIE är i princip samma sak som "BSF INTCON, GIE" följt
av en vanlig RETURN. Förrutom shadow hanteringen då...
Men undet tiden som koden i ISR'en körs, så finns det inget sätt att
se från koden som körs att den faktiskt körs p.g.a ett interrupt.
en konvention som *vi* använder för att beskriva det hela.
Ett interrupt är mer som en vanlig subrutin, det är bara det
att det triggas asynkront utan inverkan av koden i sig.
En RETFIE är i princip samma sak som "BSF INTCON, GIE" följt
av en vanlig RETURN. Förrutom shadow hanteringen då...
Men undet tiden som koden i ISR'en körs, så finns det inget sätt att
se från koden som körs att den faktiskt körs p.g.a ett interrupt.
Re: Hur gör man en snabb funktion i C?
Ok, andra processorer har ju ofta en flagga som indikerar att processorn jobbar i interrupt så inga andra interrupt ska avbryta.
Re: Hur gör man en snabb funktion i C?
Ja, GIE flaggan (Global Interrupt Enable) clearas då ett interrupt
inträffar och den sätts automatiskt av RETFIE.
Men den kan lika gärna vara clearad när som helst (då man
inte *vill* att interrupt ska utföras). Och om man inte använder
interrupt så behöver man ju aldrig sätta GIE över huvudtaget.
Så nej, det finns inget inbyggt sätt för processorn att veta
att den "är i interrupt".
inträffar och den sätts automatiskt av RETFIE.
Men den kan lika gärna vara clearad när som helst (då man
inte *vill* att interrupt ska utföras). Och om man inte använder
interrupt så behöver man ju aldrig sätta GIE över huvudtaget.
Så nej, det finns inget inbyggt sätt för processorn att veta
att den "är i interrupt".

Re: Hur gör man en snabb funktion i C?
Nja... för en PIC stämmer detta men för andra kan det mycket väl finnas ett register som anger vilken interrupt-nivå som exekveras för tillfället. Men det är semantik, en ISR är ju ganska korrekt inget annat än en "gosub" som utlösas av en händelse.
Jag minns hur exotisk interrupt var då jag började med dom första gång - men när man väl har lärt sig är de oumbärliga.
Jag minns hur exotisk interrupt var då jag började med dom första gång - men när man väl har lärt sig är de oumbärliga.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Hur gör man en snabb funktion i C?
Den här tråden har ju minst sagt seglat lite åt olika håll vilket har varit otroligt intressant.
Om man anser att "kod"-biten anses avklarad, dvs nyttjandet av interrupt för att sätta utgången låg och kikar lite det vi var inne på tidigare i tråden, dvs snabba upp funktionerna "runt om".
Om jag ändrar frågeställning lite till och sätter upp ett nytt mål som är just grundidén:
Jag vill på ett otroligt snabbt sätt mäta spänningsfallet över ett shuntmotstånd och utifrån ett tröskelvärde sätta en utgång låg.
Detta görs antagligen snabbast genom att inte blanda in en µC men jag vill ändå göra det för att kunna vidare arbeta med värdena rent mjukvarumässigt.
De lösningar jag ser nu (tack vare er) ser ut så här men ni kanske har bättre idéer?
1. Shuntmotstånd -> "Gain förstärkare" -> Intern komparator i µC:n -> Utgång
2. Shuntmotstånd -> "Gain förstärkare" -> Extern snabb komparator -> Digital I i µC -> Utgång
3. Shuntmotstånd -> Operationsförstärkare med lämplig Gain -> Digital I i µC -> Utgång
4. Current sense IC med ställbar Gain (typ ZXCT1020) -> Digital I i µC -> Utgång
Börjar det bli larvigt det här? För min personliga del så var det längesen jag lärde mig så här mycket. Det blir så mycket lättare när man försöker lösa ett problem, även om det på ett sätt är ett påhittat problem...
EDIT: URL-fix
Om man anser att "kod"-biten anses avklarad, dvs nyttjandet av interrupt för att sätta utgången låg och kikar lite det vi var inne på tidigare i tråden, dvs snabba upp funktionerna "runt om".
Om jag ändrar frågeställning lite till och sätter upp ett nytt mål som är just grundidén:
Jag vill på ett otroligt snabbt sätt mäta spänningsfallet över ett shuntmotstånd och utifrån ett tröskelvärde sätta en utgång låg.
Detta görs antagligen snabbast genom att inte blanda in en µC men jag vill ändå göra det för att kunna vidare arbeta med värdena rent mjukvarumässigt.
De lösningar jag ser nu (tack vare er) ser ut så här men ni kanske har bättre idéer?
1. Shuntmotstånd -> "Gain förstärkare" -> Intern komparator i µC:n -> Utgång
2. Shuntmotstånd -> "Gain förstärkare" -> Extern snabb komparator -> Digital I i µC -> Utgång
3. Shuntmotstånd -> Operationsförstärkare med lämplig Gain -> Digital I i µC -> Utgång
4. Current sense IC med ställbar Gain (typ ZXCT1020) -> Digital I i µC -> Utgång
Börjar det bli larvigt det här? För min personliga del så var det längesen jag lärde mig så här mycket. Det blir så mycket lättare när man försöker lösa ett problem, även om det på ett sätt är ett påhittat problem...
EDIT: URL-fix
Senast redigerad av Magnus_K 27 juni 2014, 17:14:36, redigerad totalt 2 gånger.
Re: Hur gör man en snabb funktion i C?
Som ett tips kan man använda en "high side current sensor". Det är bara ett sätt att känna av strömmen på VDD-sidan men ändå få en spänning som har GND som referens.
Men vilket sätt du än gör det på kan du få µC'n att reagerar på det.
Men vilket sätt du än gör det på kan du få µC'n att reagerar på det.
Re: Hur gör man en snabb funktion i C?
Du kan även kombinera att låta extern elektronik bryta strömmen (om det
är det som ska göras) direkt och samtidigt läsa av signalen med processorn
för att eventuellt göra något annat.
När det gäller "nödstopp" så kan det finnas fördelar med att ha en direkt
elektrisk väg mellan avkänning och själva stoppet utan något programkod
mellan. D.v.s att det stannar även om processorn har "hängt sig".
är det som ska göras) direkt och samtidigt läsa av signalen med processorn
för att eventuellt göra något annat.
När det gäller "nödstopp" så kan det finnas fördelar med att ha en direkt
elektrisk väg mellan avkänning och själva stoppet utan något programkod
mellan. D.v.s att det stannar även om processorn har "hängt sig".
Re: Hur gör man en snabb funktion i C?
Det finns väl en konflikter här.
överströmskyddet vill man nog normalt ska reagera så snabbt som möjligt, varpå det kan vara bra att toppvärdeslikrikta signalen från den förstärkta shuntspänningen. Däremot vill man antagligen att strömindikering ska visa något som är lite mer av ett medelvärde.
Om du har gott om ingångar på mikrokontrollern (eller använder en mux) så kan du köra både analogt skapat toppvärde och analogt skapat medelvärde.
En fara med att reagera för snabbt på toppvärden är dock att sånt som att ansluta en krets kan ge så hög ström vid uppladdning av avkopplingskondensatorer att överströmskyddet löser ut.
Du skulle kunna ha justerbar karaktäristik på toppströmsdetektering: Potentiometern ställer hur snabb toppvärdesbildningen ska reagera. R1 ser till att långsammare ladda ur C1 när strömmen sjunkit. (Man kan diskutera om R1 verkligen är en bra lösning, en annan variant är att ha en konstantströmgenerator så faller värdet med konstant hastighet)
överströmskyddet vill man nog normalt ska reagera så snabbt som möjligt, varpå det kan vara bra att toppvärdeslikrikta signalen från den förstärkta shuntspänningen. Däremot vill man antagligen att strömindikering ska visa något som är lite mer av ett medelvärde.
Om du har gott om ingångar på mikrokontrollern (eller använder en mux) så kan du köra både analogt skapat toppvärde och analogt skapat medelvärde.
En fara med att reagera för snabbt på toppvärden är dock att sånt som att ansluta en krets kan ge så hög ström vid uppladdning av avkopplingskondensatorer att överströmskyddet löser ut.
Du skulle kunna ha justerbar karaktäristik på toppströmsdetektering: Potentiometern ställer hur snabb toppvärdesbildningen ska reagera. R1 ser till att långsammare ladda ur C1 när strömmen sjunkit. (Man kan diskutera om R1 verkligen är en bra lösning, en annan variant är att ha en konstantströmgenerator så faller värdet med konstant hastighet)
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Hur gör man en snabb funktion i C?
@Icecap: Om jag förstår dig rätt så var det även detta sodjan tidigare rekommenderade och som blev alt 4. i min lista? Oavsett, så är det absolut inget jag utesluter och kommer läsa mer om dessa sensorer och även ha kvar detta som alternativ.
@sodjan: Du har helt rätt! Har funderat en del och ska titta närmre på en lösning där extern elektronik och µC:n delar på signalen. Kanske någon slags lösning där en pMOSFET "dirigerar om" strömmen från den matade kresten, genom ett effektmotstånd. Samtidigt tar controllern hand om vidare bearbetning och stänger ner matningsagget. På så sätt borde man otroligt snabbt göra kresten strömlös och samtidigt låta matningsagget ta sin tid för att stänga av utgången.
Ja, hör vad du säger och detta ska grävas vidare i.
@MiaM:
Är fullt med på vad du skriver och ser problemet.
Då jag aldrig hört talas om vad toppvärdeslikriktning är så har jag gjort några tappra försök att hitta mer information om termen men utan speciellt bra framgång. Om jag förstår idén rätt så låter man en konding (som ligger parallellt över likriktningen) göra ett medelvärde av utgångens toppspänningsvärde genom att "jämna ut" mellan ingångens Vtopp och utgångens Vtopp på likriktningen?
Kanske fel men det är så jag tolkat det. Hur man nu gör detta över den förstärkta shuntspänning vet jag dock inte.
Eftersom jag än så länge bara är i planeringstadiet så är antal ingångar på µC:n inga problem. Hellre välja en större controller än att tumma på funktioner. Tycker också att det är en fantastiskt bra idé att göra som du säger; låta kresten agera på toppvärdet men visa medelvärdet. Sen kanske man tom kan vidareutveckla det och spara toppvärdet i controllern också, vilket på detta värde kan utläsas separat efter ett eventuellt "nödstopp".
Vilket värde elektroniken ska reagera på tycker jag ändå borde vara toppvärdet, även om det kan innebära att den bryter av "fel" orsak.
Ser inte riktigt hur man skulle kunna få elektroniken att göra skillnad på "normal" strömtopp och strömtopp pga kortslutning? I mitt huvud känns det snarare som att om strömbegränsningen löser ut pga av normal strömtopp så har man helt enkelt lagt denna för låg. Detta å andra sidan blir väldigt svårt att avgöra, i alla fall för mig.
Jag har tyvärr inte hunnit sätta mig in i kresten du ritat och vad för funktionen den skulle ha men ska givetvis göra det så snart som går. Om du känner att du har lust så för du hemskt gärna skriva ett par till rader om funktionen kring den... är lite trög förstår du...
EDIT: Renskrivning och raderat en onödig inledning i svaret till MiaM.
@sodjan: Du har helt rätt! Har funderat en del och ska titta närmre på en lösning där extern elektronik och µC:n delar på signalen. Kanske någon slags lösning där en pMOSFET "dirigerar om" strömmen från den matade kresten, genom ett effektmotstånd. Samtidigt tar controllern hand om vidare bearbetning och stänger ner matningsagget. På så sätt borde man otroligt snabbt göra kresten strömlös och samtidigt låta matningsagget ta sin tid för att stänga av utgången.
Ja, hör vad du säger och detta ska grävas vidare i.
@MiaM:
Är fullt med på vad du skriver och ser problemet.
Då jag aldrig hört talas om vad toppvärdeslikriktning är så har jag gjort några tappra försök att hitta mer information om termen men utan speciellt bra framgång. Om jag förstår idén rätt så låter man en konding (som ligger parallellt över likriktningen) göra ett medelvärde av utgångens toppspänningsvärde genom att "jämna ut" mellan ingångens Vtopp och utgångens Vtopp på likriktningen?
Kanske fel men det är så jag tolkat det. Hur man nu gör detta över den förstärkta shuntspänning vet jag dock inte.
Eftersom jag än så länge bara är i planeringstadiet så är antal ingångar på µC:n inga problem. Hellre välja en större controller än att tumma på funktioner. Tycker också att det är en fantastiskt bra idé att göra som du säger; låta kresten agera på toppvärdet men visa medelvärdet. Sen kanske man tom kan vidareutveckla det och spara toppvärdet i controllern också, vilket på detta värde kan utläsas separat efter ett eventuellt "nödstopp".
Vilket värde elektroniken ska reagera på tycker jag ändå borde vara toppvärdet, även om det kan innebära att den bryter av "fel" orsak.
Ser inte riktigt hur man skulle kunna få elektroniken att göra skillnad på "normal" strömtopp och strömtopp pga kortslutning? I mitt huvud känns det snarare som att om strömbegränsningen löser ut pga av normal strömtopp så har man helt enkelt lagt denna för låg. Detta å andra sidan blir väldigt svårt att avgöra, i alla fall för mig.
Jag har tyvärr inte hunnit sätta mig in i kresten du ritat och vad för funktionen den skulle ha men ska givetvis göra det så snart som går. Om du känner att du har lust så för du hemskt gärna skriva ett par till rader om funktionen kring den... är lite trög förstår du...
EDIT: Renskrivning och raderat en onödig inledning i svaret till MiaM.
Senast redigerad av Magnus_K 28 juni 2014, 09:11:20, redigerad totalt 1 gång.
Re: Hur gör man en snabb funktion i C?
Magnus_K: om du filtrerar spänningen som är ett uttryck för strömmen via ett RC-filter får du ett medelvärde. Men om om du med en diodfunktion ser till att uppladdningen av kondensatorn kan ske avsevärd snabbare än avladdningen kommer korta toppar att betyda en hel del mer i mätningen.
Men vad som är bäst beror ju på de exakta krav på responsen & maximal spetsbelastning.
Att något är möjligt betyder inte att man måste använde det.
Men vad som är bäst beror ju på de exakta krav på responsen & maximal spetsbelastning.
Att något är möjligt betyder inte att man måste använde det.
Senast redigerad av Icecap 18 augusti 2014, 10:27:21, redigerad totalt 1 gång.
Re: Hur gör man en snabb funktion i C?
För att gå från att snabba upp mjukvaran med sagda PIC så kan man utnttja hårdvaran i den.
Det finns en spänningsreferens(FVR), en digital-analog omvvandlara(DAC) och en komparator. Dessa går att sammankopplas.
DACcen kan matas från spänningsreferensen, med DACcen kan mata ena komparatoringången, på den andra matar du in din signal.
Med komparatorn kan du sedan generera ett interrupt som sätter utgången låg.
Det finns en spänningsreferens(FVR), en digital-analog omvvandlara(DAC) och en komparator. Dessa går att sammankopplas.
DACcen kan matas från spänningsreferensen, med DACcen kan mata ena komparatoringången, på den andra matar du in din signal.
Med komparatorn kan du sedan generera ett interrupt som sätter utgången låg.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Hur gör man en snabb funktion i C?
Det här har stått stilla över sommaren men ska ta tag i det framöver igen. Det du säger var sodjan inne på tidigare också. Fick det att fungera till slut med hjälp från denna tråden.
Får se vilken väg jag väljer att vandra till slut!
Får se vilken väg jag väljer att vandra till slut!