Mikroprocessor till reglersystem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Mikroprocessor till reglersystem

Inlägg av TotteBasicPic »

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
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Mikroprocessor till reglersystem

Inlägg av vfr »

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. :)
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

sodjan: Aha. :)
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
Jaha, okej, man får en liten fördröjning där ja som motverkar studset.

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
~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.
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

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:

Kod: Markera allt

IF counter = 7 THEN 
counter = 0
ENDIF
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.
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Mikroprocessor till reglersystem

Inlägg av TotteBasicPic »

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
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

Jaha, smart!
Jag hade varit jätteglad över att kodexempel. :)
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Mikroprocessor till reglersystem

Inlägg av TotteBasicPic »

Hej

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

edit OSC 20 Mhz

H.Thomas
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

Underbart!

Vissa frågtecken måste dock rätas ut:

Kod: Markera allt

 if ( BLED_BlinkCnt > 499 ) Then
   
          ' Change state of blue LED
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:

Kod: Markera allt

if BLED_BlinkCnt > 999 then 
BLED_BlinkCnt = 0 
endif
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?
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Mikroprocessor till reglersystem

Inlägg av TotteBasicPic »

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
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

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. :)
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

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:

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. :)
Användarvisningsbild
Icecap
Inlägg: 26625
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Mikroprocessor till reglersystem

Inlägg av Icecap »

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?)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Mikroprocessor till reglersystem

Inlägg av v-g »

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
Kretskort
Inlägg: 182
Blev medlem: 5 februari 2008, 08:07:45
Ort: Göteborg

Re: Mikroprocessor till reglersystem

Inlägg av Kretskort »

v-g: Men hur fungerar det när demoprogrammets register sätts då?

Kod: Markera allt

' Initialize Internal Registers

ANSEL =   1         ' Intialize AN0 to A/D only
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.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Mikroprocessor till reglersystem

Inlägg av v-g »

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å?
Skriv svar