Mikroprocessor till reglersystem
-
- Inlägg: 36
- Blev medlem: 30 december 2008, 11:38:08
- Ort: Halmstad
Re: Mikroprocessor till reglersystem
counter VAR BYTE
hjälpminne var bit
IF porta.3 = 0 and hjälpminne = 0 THEN
counter = counter + 1
hjälpminne = 1
ENDIF
If porta.3 = 1 and hjälpminne = 1 then
hjälpminne = 0
endif
Så här kan man göra
men ett filter på ingången skulle inte skada
H.Thomas
hjälpminne var bit
IF porta.3 = 0 and hjälpminne = 0 THEN
counter = counter + 1
hjälpminne = 1
ENDIF
If porta.3 = 1 and hjälpminne = 1 then
hjälpminne = 0
endif
Så här kan man göra
men ett filter på ingången skulle inte skada
H.Thomas
Re: Mikroprocessor till reglersystem
Många som försöker hjälpa trots att trådskrivaren ännu inte talat om vad han får för fel i kompilatorn. 

Re: Mikroprocessor till reglersystem
sodjan: Aha.
Jag hittade lite färdig kod för switchavläsning nu btw:
~Kommandot inverterar värdet på switchstate. I mitt fall kan jag ju nu byta ut switchstate = ~switchstate till counter = counter +1.
vfr: Det är för mycket fel.
MPLAB visar numer en massa fel då jag kompilerar utan närmare förklaring då det fungerade förut.
MicroCode visar felet "fatal: out of memory (pbwdemo.exe)"
Har installerat om samtliga program ett par gånger utan resultat. På en annan dator jag har fungerar dock MicroCode Studio perfekt.

Jaha, okej, man får en liten fördröjning där ja som motverkar studset.TotteBasicPic skrev: counter VAR BYTE
hjälpminne var bit
IF porta.3 = 0 and hjälpminne = 0 THEN
counter = counter + 1
hjälpminne = 1
ENDIF
If porta.3 = 1 and hjälpminne = 1 then
hjälpminne = 0
endif
Så här kan man göra
men ett filter på ingången skulle inte skada
H.Thomas
Jag hittade lite färdig kod för switchavläsning nu btw:
Kod: Markera allt
Switchstate VAR BIT
'*** Read State of Switch with 100 msec Debounce
if PORTA.3 = 0 then 'Switch is pressed
pause 100 'Delay 100 msec
if PORTA.3 = 0 then 'Test switch again
switchstate = ~switchstate 'Toggle Switch State Flag
hold
if PORTA.3 = 0 then hold 'Wait for switch to be released
endif
endif
vfr: Det är för mycket fel.

MicroCode visar felet "fatal: out of memory (pbwdemo.exe)"
Har installerat om samtliga program ett par gånger utan resultat. På en annan dator jag har fungerar dock MicroCode Studio perfekt.
Re: Mikroprocessor till reglersystem
Nu fungerar räknaren! Jag motverkar studset i strömbrytaren med en pause på 100 ms.
Nästa fråga är hur jag ska kunna nollställa counter.
När counter = 5 så tänds ett par dioder. Jag har försökt reseta counter så här:
Men det fungerar inte, varför?
EDIT: Jag kom på det. Eftersom programmet ligger som en lång sekvens så ville inte programmet läsa switchen förrän sekvensen med dioder var slut. På något sätt måste jag lägga diodsekvensen parallellt med avläsningen av switchen.
Nästa fråga är hur jag ska kunna nollställa counter.
När counter = 5 så tänds ett par dioder. Jag har försökt reseta counter så här:
Kod: Markera allt
IF counter = 7 THEN
counter = 0
ENDIF
EDIT: Jag kom på det. Eftersom programmet ligger som en lång sekvens så ville inte programmet läsa switchen förrän sekvensen med dioder var slut. På något sätt måste jag lägga diodsekvensen parallellt med avläsningen av switchen.
-
- Inlägg: 36
- Blev medlem: 30 december 2008, 11:38:08
- Ort: Halmstad
Re: Mikroprocessor till reglersystem
Har gjort många styrningar med Pic och normalt är att inte man
inte göra paus i programmet,
Och skall helst inte efter som Pic inte kan gör något annat.
Man kan göra en 1:mS puls som går igenom programmet en gång vid varje puls.
På så sätt få alla timer funktioner att fungera och filter på ingångar.
Genom att räkna 1:mS pulserna.
Behöver man bättre upplösning så minska man klart denna tid.
Denna 1:mS sekund puls sätter man enklast upp med en av Timern i Picen
Så blir den mycket exakt.
H/Thomas
inte göra paus i programmet,
Och skall helst inte efter som Pic inte kan gör något annat.
Man kan göra en 1:mS puls som går igenom programmet en gång vid varje puls.
På så sätt få alla timer funktioner att fungera och filter på ingångar.
Genom att räkna 1:mS pulserna.
Behöver man bättre upplösning så minska man klart denna tid.
Denna 1:mS sekund puls sätter man enklast upp med en av Timern i Picen
Så blir den mycket exakt.
H/Thomas
Re: Mikroprocessor till reglersystem
Jaha, smart!
Jag hade varit jätteglad över att kodexempel.
Jag hade varit jätteglad över att kodexempel.

-
- Inlägg: 36
- Blev medlem: 30 december 2008, 11:38:08
- Ort: Halmstad
Re: Mikroprocessor till reglersystem
Hej
Här är ett Exempel skrivet till Pic16F628A
Det är lite gammalt och lite nytt därför lite på engelska i det.
edit OSC 20 Mhz
H.Thomas
Här är ett Exempel skrivet till Pic16F628A
Det är lite gammalt och lite nytt därför lite på engelska i det.
Kod: Markera allt
BLED_BlinkCnt VAR WORD ' Blue LED counter for blinking
CLOCKTIME1 VAR BIT ' flag for timer1 intervalls
IN1FILT VAR BYTE 'FILTER TID INGÅNG ETT
BLED VAR PORTA.4 ' Output. Blue activity LED
IN1 VAR PORTB.1 'INGÅNG ETT
IN1OUT VAR BIT 'INGÅNG FILTERAD
Clear ' Clear all varaiables
CMCON = %00000111 ' Turn off comparators and enable pins for I/O
INTCON = %00010000 ' Enable interrupt for RB0
OPTION_REG = %11111111 ' sätter optionreg se data bladet för PIC
TRISA = %00100110 ' Set PORTA 7,6,4,3,0 for output and 5,2,1 for input
TRISB = %00001111 ' Set PORTB 7,6,5,4 for output and 3,2,1,0 for input
T1CON = %00110001 ' Set Timer1 for Timing then filter and output Timers
MAINLOOP:
' TIMER UPDATE
CLOCKTIME1 = 0 ' RESET FOR TIMER1PULS TO PROGRAM.
If PIR1.0 then ' CHECKING TIMER1 OVERFLOW FLAG
PIR1.0 = 0 ' RESETING OVERFLOW FLAG
TMR1H = 253 ' SETTING THE TIMER HIGH BITS TO NEXT OVERFLOW
' VALUE 255 PULS REP C:A 0.42 mS
' VALUE 254 PULS REP C:A 0.82 mS
' VALUE 253 PULS REP C:A 1.21 MS
TMR1L = 172 ' SETTING THE TIMER L BITS TO 172
CLOCKTIME1 = 1 ' SETTING TO TIMER FLAG
ENDIF
BLED_BlinkCnt = BLED_BlinkCnt + CLOCKTIME1
if ( BLED_BlinkCnt > 499 ) Then
' Change state of blue LED
BLED_BlinkCnt = 0 'LEDEN BLINKAR
BLED = ~BLED
endif
'FILTER PÅ INGÅNG 1 _____________________________________
IF IN1 = 0 THEN ' KOLLAR OM INGÅNGEN LÅG
IN1FILT = IN1FILT + CLOCKTIME1 'RÄKNAR UPP
ELSE
IN1FILT = 0 'NOLLAR RÄKNARE OM IN1 HÖG
ENDIF
IF IN1FILT > 19 THEN 'KOLLAR RÄKNARENS VÄRDE OM 20 ELLER MER SÅ..
IN1FILT = 20 'SÄTTER RÄNKREN SÅ ATT DEN SLUTAR RÄKNA
IN1OUT = 1 'SÄTTER OUT SIGNALEN EFTER SOM FILTER TIDEN KLAR
ELSE
IN1OUT = 0 'ANNARS
ENDIF
'SLUT FILTER INGÅNG 1.
GOTO MAINLOOP
H.Thomas
Re: Mikroprocessor till reglersystem
Underbart!
Vissa frågtecken måste dock rätas ut:
Leden kommer inte blinka utan bara lysa efter 499 pulser va (vilket är ~0,5 s) ?
För att få leden att blinka med ~0,5 s intervall kanske man kan sätta en reset i stil med liknande:
Tänker jag rätt?
PIR1.0 är någon form av "tidsflagga", vars värde definieras av TMR1H eller? Är det inte bättre att lägga TMR1H innan "mainloop" isåfall?
Det måste ju ta en del tid för PIC:en att gå igenom programmet. Är den här tiden så liten att man kan försumma den?
Vissa frågtecken måste dock rätas ut:
Kod: Markera allt
if ( BLED_BlinkCnt > 499 ) Then
' Change state of blue LED
För att få leden att blinka med ~0,5 s intervall kanske man kan sätta en reset i stil med liknande:
Kod: Markera allt
if BLED_BlinkCnt > 999 then
BLED_BlinkCnt = 0
endif

PIR1.0 är någon form av "tidsflagga", vars värde definieras av TMR1H eller? Är det inte bättre att lägga TMR1H innan "mainloop" isåfall?
Det måste ju ta en del tid för PIC:en att gå igenom programmet. Är den här tiden så liten att man kan försumma den?
-
- Inlägg: 36
- Blev medlem: 30 december 2008, 11:38:08
- Ort: Halmstad
Re: Mikroprocessor till reglersystem
1. Leden är tänd i c:a 500mS och sen släckt i c:a 500mS = 1 Hz
Bled = ~Bled detta är Bled outgången efter varanan gång tänd nästa släck
~ är invertering tecken
Vill man blinka med lägre frekvens så ökar man BLED_BlinkCnt > 999 = 2Hz
TMR1H och TMR1L är register bitar till räknaren
Dom åter ställer jag varje gång till sitt värde när PIR1.0 Flagan är satt.
Obs tiden är för summbar om man inte sätter in några Pause i programet då går det Fel.
H.Thomas
Bled = ~Bled detta är Bled outgången efter varanan gång tänd nästa släck
~ är invertering tecken
Vill man blinka med lägre frekvens så ökar man BLED_BlinkCnt > 999 = 2Hz
TMR1H och TMR1L är register bitar till räknaren
Dom åter ställer jag varje gång till sitt värde när PIR1.0 Flagan är satt.
Obs tiden är för summbar om man inte sätter in några Pause i programet då går det Fel.
H.Thomas
Re: Mikroprocessor till reglersystem
Nu är projektet igång igen! Tyvärr fungerar inte timerkoden till min PIC16F690. Ska denna ha en annan kod? Jag har anpassat koden efter portarna på min PIC.
Jag kan inte heller hitta något som hjälper mig om timern varken i PBP manualen eller databladet till PIC:en. Någon som har tips på en bra sida mer med information?
Projektet ser lite annorlunda ut nu. Jag ska göra en egen reglerventil. Denna ska bestå av en skjutventil som manövreras av en skruvdragare. Som positionerade ska jag sätta en skiva på axeln som är perforerad i periferin med jämna intervaller och som sedan läses med en läsgaffel . En microcontroller med transistorförstärkning slår på strömmen till skruvdragaren i respektive riktning. Samma enhet ska också ha en temperaturgivare inkopplad och en P- och kanske även I regulator programmerad. Det känns helt klart genomförbart, jag måste bara komma igång ordentligt nu.
Jag kan inte heller hitta något som hjälper mig om timern varken i PBP manualen eller databladet till PIC:en. Någon som har tips på en bra sida mer med information?
Projektet ser lite annorlunda ut nu. Jag ska göra en egen reglerventil. Denna ska bestå av en skjutventil som manövreras av en skruvdragare. Som positionerade ska jag sätta en skiva på axeln som är perforerad i periferin med jämna intervaller och som sedan läses med en läsgaffel . En microcontroller med transistorförstärkning slår på strömmen till skruvdragaren i respektive riktning. Samma enhet ska också ha en temperaturgivare inkopplad och en P- och kanske även I regulator programmerad. Det känns helt klart genomförbart, jag måste bara komma igång ordentligt nu.

Re: Mikroprocessor till reglersystem
I'm back!
Nu har jag fått timern att fungera. Jag har också lyckats multiplexa 2 st 7 segments LED displayer och gjort en räknekod som jag tyckte blev väldigt smidig mha. lookup kommandot. Jag har köpt LM35CAZ givare som jag försöker läsa med ADC:en på PICen. Det verkar som att jag lyckats hyfsat, men dom avlästa värdena flukturerar ganska mycket. Jag tror detta beror på att jag inte ställt in ADC:en ordentligt.
Jag blir nämligen inte riktigt klok på är hur registren ska ställas. I Microchips ADC PicBasic program aktiverar dom AN0 så här:
Fråga 1: Det är detsamma som att skicka en binär etta till ANSEL registret? Men ANSEL registret börjar med AN7, då borde ju AN7 sättas som analog ingång. Det är något jag inte förstår i konverteringen mellan decimala och binära tal här tror jag.
Fråga 2: Jag ville sätta AN10 som analog ingång. AN10 ligger som bit 2 i ANSELH registret. Är detta korrekt då:
ANSELH=%00000100 ?
Microcontrollern som används är en PIC16F690. Datablad: https://www1.elfa.se/data1/wwwroot/asse ... 262e_1.pdf
Ja, jag vet, RTFM, men det är lite snurrigt så här i början oavsett hur många gånger jag bläddrar i alla datablad och manualer.
Nu har jag fått timern att fungera. Jag har också lyckats multiplexa 2 st 7 segments LED displayer och gjort en räknekod som jag tyckte blev väldigt smidig mha. lookup kommandot. Jag har köpt LM35CAZ givare som jag försöker läsa med ADC:en på PICen. Det verkar som att jag lyckats hyfsat, men dom avlästa värdena flukturerar ganska mycket. Jag tror detta beror på att jag inte ställt in ADC:en ordentligt.
Jag blir nämligen inte riktigt klok på är hur registren ska ställas. I Microchips ADC PicBasic program aktiverar dom AN0 så här:
Kod: Markera allt
' Initialize Internal Registers
ANSEL = 1 ' Intialize AN0 to A/D only
Fråga 1: Det är detsamma som att skicka en binär etta till ANSEL registret? Men ANSEL registret börjar med AN7, då borde ju AN7 sättas som analog ingång. Det är något jag inte förstår i konverteringen mellan decimala och binära tal här tror jag.
Fråga 2: Jag ville sätta AN10 som analog ingång. AN10 ligger som bit 2 i ANSELH registret. Är detta korrekt då:
ANSELH=%00000100 ?
Microcontrollern som används är en PIC16F690. Datablad: https://www1.elfa.se/data1/wwwroot/asse ... 262e_1.pdf
Ja, jag vet, RTFM, men det är lite snurrigt så här i början oavsett hur många gånger jag bläddrar i alla datablad och manualer.

Re: Mikroprocessor till reglersystem
Fråga 1: mycket slarvigt skrivit kommentar, se fråga 2.
Fråga 2: korrekt sätt att skriva det på, självklart med en kommentar till.
Ditt fluktuerande i A/D-avläsningen beror knappast på inställningar i A/D-register men kanske på fel timing, externa störningar (har du avkopplat ordentligt/rätt?)
Fråga 2: korrekt sätt att skriva det på, självklart med en kommentar till.
Ditt fluktuerande i A/D-avläsningen beror knappast på inställningar i A/D-register men kanske på fel timing, externa störningar (har du avkopplat ordentligt/rätt?)
Re: Mikroprocessor till reglersystem
Binära tal fungerar exakt som vanliga talsystemet. Om du tex har ett register (ej binärt) som går till 99 så blir det ju inte 10 om du sätter det till 1 eller hur? Talen shiftas in från vänster precis som vanligt och samma gäller det binära talsystemet.
Nu kan jag inte C så bra men det är oftast bäst att först rensa registret sen sätta alla BIT:ar som de skall vara. Iaf i assembler så är alla BIT:ar i alla register i processorn namngivna så man skriver tex BSF ADCON, CHS0 (BSF = Bit Set F dvs sätt BIT). Detta gör att koden blir tydlig och man kan även klara migreringar lättare.
ANSEL bör vara korrekt satt. Har du kollat på ACQUISITION TIME? (bla på sid118)
Kolla också vad du har som Vref
Nu kan jag inte C så bra men det är oftast bäst att först rensa registret sen sätta alla BIT:ar som de skall vara. Iaf i assembler så är alla BIT:ar i alla register i processorn namngivna så man skriver tex BSF ADCON, CHS0 (BSF = Bit Set F dvs sätt BIT). Detta gör att koden blir tydlig och man kan även klara migreringar lättare.
ANSEL bör vara korrekt satt. Har du kollat på ACQUISITION TIME? (bla på sid118)
Kolla också vad du har som Vref
Re: Mikroprocessor till reglersystem
v-g: Men hur fungerar det när demoprogrammets register sätts då?
Ovanstående kod sätter en etta på AN0, men borde i mina ögon sätta en etta på AN7. Detta är bit 7 i ANSEL registret och alltså längst till vänster.
Icecap: Jaså du förstod du inte att fråga 1 syftade tillbaka på koden var ovan den.
Vad menar du med avkoppling? Någon form avstörande koppling?
Det hela är kodat i Pic Basic Pro förresten.
Kod: Markera allt
' Initialize Internal Registers
ANSEL = 1 ' Intialize AN0 to A/D only
Icecap: Jaså du förstod du inte att fråga 1 syftade tillbaka på koden var ovan den.
Vad menar du med avkoppling? Någon form avstörande koppling?
Det hela är kodat i Pic Basic Pro förresten.
Re: Mikroprocessor till reglersystem
Registrenas namn börjar med 0 slutar med 7 därav när man sätter registret till 1 så sätter man pinnen eller registret med namnet 0 till vad det nu gör vid satt BIT. Det har med binära talsystemet att göra. 7 är 111 8 är 1000
Jag tror du tänker från fel håll
Om vi säger att ANSEL ser ut såhär AN7|AN6|...|AN1|AN0 så sätter såklart 1 (= B'0000 0001') att det är AN0 som påverkas.
Är det hela klar-t/are då?
Jag tror du tänker från fel håll
Om vi säger att ANSEL ser ut såhär AN7|AN6|...|AN1|AN0 så sätter såklart 1 (= B'0000 0001') att det är AN0 som påverkas.
Är det hela klar-t/are då?