pic dimmer?
Jag fattar ju som så om timer 1 modulen att det räknar från 0000hh till 0000ff,
och när den slår över då så skapas en interrupt som ska räkna ner t.ex led 1 ett steg. Men det man ställer in i Timer 1 modulen är ju vad länge den ska ta tid på/räkna upp till. Hur ska man då få 3500Hz?? De e de jag inte fattar.
och när den slår över då så skapas en interrupt som ska räkna ner t.ex led 1 ett steg. Men det man ställer in i Timer 1 modulen är ju vad länge den ska ta tid på/räkna upp till. Hur ska man då få 3500Hz?? De e de jag inte fattar.
Jag tror du behöver gnugga dom små grå lite. Mycket av det du frågar här har du ju fått svar på på förra sidan.
Det du skall ta reda på är:
1. Hur lång tid är en period om frekvensen är 3500Hz?
2. Hur mycket av den tiden skall utgånen vara 1 respektive 0? Den tiden som utgången är 1 är pulstiden (pulsbredden).
3. Enligt databladet så räknar timern upp 1 varje instruktionscykel om "operation mode" är satt till "timer", en instruktionscykel vid 4MHz är 1us (mao från det timern står på 0 till den räknat till 1 har det gått 1us). Vad behöver du mata för värde till timern för att få den att snurra runt vid den pulstid/pulsbredd du kom fram till i steg 2?
Detta är saker du skall kunna räkna ut själv med de uppgifter du fått här, utan att ens kolla i databladet. Sedan när du förstått hur detta hänger ihop kan du gå vidare.
Det du skall ta reda på är:
1. Hur lång tid är en period om frekvensen är 3500Hz?
2. Hur mycket av den tiden skall utgånen vara 1 respektive 0? Den tiden som utgången är 1 är pulstiden (pulsbredden).
3. Enligt databladet så räknar timern upp 1 varje instruktionscykel om "operation mode" är satt till "timer", en instruktionscykel vid 4MHz är 1us (mao från det timern står på 0 till den räknat till 1 har det gått 1us). Vad behöver du mata för värde till timern för att få den att snurra runt vid den pulstid/pulsbredd du kom fram till i steg 2?
Detta är saker du skall kunna räkna ut själv med de uppgifter du fått här, utan att ens kolla i databladet. Sedan när du förstått hur detta hänger ihop kan du gå vidare.
Jag använde den här formeln när jag räknade lite:
"The PWM period can be calculated using
the following formula:
PWM period = [(PR2) + 1] 4 TOSC
(TMR2 prescale value) "
Och jag räknade som så:
4000000/1141=3505.69676
Har ingen aning om jag räknar rätt eller fel. Så räknade jag ju tidigare i tråden.
Fattar inte riktigt hur man ska komma på formlerna och sånt(har aldrig varit bra på det).
Ni får järna hjälpa mig med formlerna så kan jag räkna själv.
"The PWM period can be calculated using
the following formula:
PWM period = [(PR2) + 1] 4 TOSC
(TMR2 prescale value) "
Och jag räknade som så:
4000000/1141=3505.69676
Har ingen aning om jag räknar rätt eller fel. Så räknade jag ju tidigare i tråden.
Fattar inte riktigt hur man ska komma på formlerna och sånt(har aldrig varit bra på det).
Ni får järna hjälpa mig med formlerna så kan jag räkna själv.
> Fattar inte riktigt hur man ska komma på formlerna och sånt
Vad är det du ska "komma på" ?
Det där finns väl i databladet ?
> Och jag räknade som så:
4000000/1141=3505.69676
Tja, det kan väl vara både rätt och fel...
Det beror på vad de olika siffrorna står för och vad det är du försöker räkna ut.
Vad är det du ska "komma på" ?
Det där finns väl i databladet ?
> Och jag räknade som så:
4000000/1141=3505.69676
Tja, det kan väl vara både rätt och fel...

Det beror på vad de olika siffrorna står för och vad det är du försöker räkna ut.
Hmm, började just läsa denna tråden (läser sällan trådar om PIC då jag nte använder dom...) men det känns verkligen som att budskapen inte går fram. Vad det beror på vet jag inte men jag läste från sida ett till sida fyra och hoppade sen till siata sidan och *fortfarande* är det samma frågor....
Varför inte göra som vanligt att börja med att få en lysdiod att blinka och sen tända flera i följd osv??
Jag förstår om man vill ösa på och göra något särskilt för att få det till något användbart men man måste lära sig gå innan man kan cykla.
En stor eloge iallafall från mig till er som verkligen hjälper till på detta beundransvärda sett får att hjälpa Basmicke.
Lycka till Basmicke.
Nu drar jag mig tillbaka och programmerar min AVR som borde varit färdig kodad vid detta laget :/
Varför inte göra som vanligt att börja med att få en lysdiod att blinka och sen tända flera i följd osv??
Jag förstår om man vill ösa på och göra något särskilt för att få det till något användbart men man måste lära sig gå innan man kan cykla.
En stor eloge iallafall från mig till er som verkligen hjälper till på detta beundransvärda sett får att hjälpa Basmicke.
Lycka till Basmicke.
Nu drar jag mig tillbaka och programmerar min AVR som borde varit färdig kodad vid detta laget :/
Jag tror björn har rätt angående att börja enkelt.
Basmicke: Du sa på första sidan i tråden att du fått en diod blinka. Har du förstått hur det programmet funkar? Det vi försöker förklara för dig är igentligen samma sak (generellt sett) bara det att du skall blinka "oftare" och att tiden dioden är "tänd" mellan blinkningarna skall variera.
Iomed att du inte svarade på någon av mina 3 frågor ovan, så vet jag inte ens om du förstått vad HZ är?
Dessutom är jag inte säker på att du vet hur respektive instruktion i PIC:ens instruktionsuppsättning igentligen fungerar. Vad gör movlw eller bcf instruktionerna t.ex?
Som björn sa, du måste lära dig gå innan du kan cykla. Det är också svårt att förklara/hjälpa om man inte säkert vet att du förstått det första svaret innan du ställer nästa fråga.
Som sagt börja enklare, en diod en blinkning och försök förstå hur det fungerar. Ge inte upp.
Basmicke: Du sa på första sidan i tråden att du fått en diod blinka. Har du förstått hur det programmet funkar? Det vi försöker förklara för dig är igentligen samma sak (generellt sett) bara det att du skall blinka "oftare" och att tiden dioden är "tänd" mellan blinkningarna skall variera.
Iomed att du inte svarade på någon av mina 3 frågor ovan, så vet jag inte ens om du förstått vad HZ är?
Dessutom är jag inte säker på att du vet hur respektive instruktion i PIC:ens instruktionsuppsättning igentligen fungerar. Vad gör movlw eller bcf instruktionerna t.ex?
Som björn sa, du måste lära dig gå innan du kan cykla. Det är också svårt att förklara/hjälpa om man inte säkert vet att du förstått det första svaret innan du ställer nästa fråga.
Som sagt börja enklare, en diod en blinkning och försök förstå hur det fungerar. Ge inte upp.
Movlw- flyttar litteralen till arbetsregistret.Dessutom är jag inte säker på att du vet hur respektive instruktion i PIC:ens instruktionsuppsättning igentligen fungerar . Vad gör movlw eller bcf instruktionerna t.ex?
BCF- bit clear f.
BSF- bit set f
Det kan jag och hänger med på det mesta. Kan ju visa ett demo exempel som man får med:
Kod: Markera allt
;**************************************************************************
;* VELLEMAN High-Q KIT K8048/VM111 SAMPLE SOFTWARE *
;**************************************************************************
;* DEMO1: Simple Running light for testing LD1...LD5 *
;* DEMO1: Program for testing K8048/VM111 with PIC16F627! *
;**************************************************************************
;* (C) VELLEMAN Components,2003 All rights reserved *
;**************************************************************************
;* Hardw. Rev: P8048'1 Softw. Rev: 1.20 *
;* OSC.......: XT 4MHz Max. POWER.....: 12V DC *
;**************************************************************************
W EQU H'0000'
F EQU H'0001'
;----- Register Files------------------------------------------------------
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
INTCON EQU H'000B'
OPTION_REG EQU H'0081'
TRISA EQU H'0085'
TRISB EQU H'0086'
CMCON EQU H'001F'
;----- STATUS Bits --------------------------------------------------------
IRP EQU H'0007'
RP1 EQU H'0006'
RP0 EQU H'0005'
NOT_TO EQU H'0004'
NOT_PD EQU H'0003'
Z EQU H'0002'
DC EQU H'0001'
C EQU H'0000'
;==========================================================================
;
; RAM Definition
;
;==========================================================================
__MAXRAM H'01FF'
__BADRAM H'07'-H'09', H'0D', H'13'-H'14', H'1B'-H'1E'
__BADRAM H'87'-H'89', H'8D', H'8F'-H'91', H'93'-H'97', H'9E'
__BADRAM H'105', H'107'-H'109', H'10C'-H'11F', H'150'-H'16F'
__BADRAM H'185', H'187'-H'189', H'18C'-H'1EF'
;==========================================================================
;
; Configuration Bits
;
;==========================================================================
_BODEN_ON EQU H'3FFF'
_BODEN_OFF EQU H'3FBF'
_CP_ALL EQU H'03FF'
_CP_75 EQU H'17FF'
_CP_50 EQU H'2BFF'
_CP_OFF EQU H'3FFF'
_DATA_CP_ON EQU H'3EFF'
_DATA_CP_OFF EQU H'3FFF'
_PWRTE_OFF EQU H'3FFF'
_PWRTE_ON EQU H'3FF7'
_WDT_ON EQU H'3FFF'
_WDT_OFF EQU H'3FFB'
_LVP_ON EQU H'3FFF'
_LVP_OFF EQU H'3F7F'
_MCLRE_ON EQU H'3FFF'
_MCLRE_OFF EQU H'3FDF'
_ER_OSC_CLKOUT EQU H'3FFF'
_ER_OSC_NOCLKOUT EQU H'3FFE'
_INTRC_OSC_CLKOUT EQU H'3FFD'
_INTRC_OSC_NOCLKOUT EQU H'3FFC'
_EXTCLK_OSC EQU H'3FEF'
_LP_OSC EQU H'3FEC'
_XT_OSC EQU H'3FED'
_HS_OSC EQU H'3FEE'
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
;==========================================================================
; Variable Definition
;==========================================================================
TIMER1 EQU H'20' ;Used in delay routine
TIMER2 EQU H'21' ; " " "
PATERN EQU H'22' ;Pattern data for effect's
ORG 0 ;Reset vector address
GOTO RESET ;goto RESET routine when boot.
; *********************************************
; * Example of a delay routine *
; *********************************************
DELAY_ROUTINE MOVLW D'255' ;54 Generate approx 10mS delay at 4Mhz CLK
MOVWF TIMER2
DEL_LOOP1 MOVLW D'255' ;60
MOVWF TIMER1
DEL_LOOP2 DECFSZ TIMER1,F
GOTO DEL_LOOP2
DECFSZ TIMER2,F
GOTO DEL_LOOP1
RETLW 0
; **********************************
; ** RESET : main boot routine **
; **********************************
RESET MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON
;
BSF STATUS,RP0 ;Switch to register bank 1
;Disable pull-ups
;INT on rising edge
;TMR0 to CLKOUT
;TMR0 Incr low2high trans.
;Prescaler assign to Timer0
;Prescaler rate is 1:256
MOVLW B'11010111' ;Set PIC options (See datasheet).
MOVWF OPTION_REG ;Write the OPTION register.
;
CLRF INTCON ;Disable interrupts
MOVLW B'11000000'
MOVWF TRISB ;RB7 & RB6 are inputs.
;RB5...RB0 are outputs.
MOVLW B'11111111' ;all RA ports are inputs
MOVWF TRISA
BCF STATUS,RP0 ;Switch Back to reg. Bank 0
CLRF PORTB
;
EFFECT_1 MOVLW B'00000001' ;Activate LD1 (RB0)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00000010' ;Activate LD2 (RB1)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00000100' ;Activate LD3 (RB2)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00001000' ;Activate LD4 (RB3)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00010000' ;Activate LD5 (RB4)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00100000' ;Activate LD6 (RB5)
MOVWF PORTB
CALL DELAY_ROUTINE
GOTO EFFECT_1
END
Håller med Icecap, skriv om koden så att den ser vettig ut, t.ex :
- Lägg till en #INCLUDE av rätt INC fil för den processor du använder.
- Plocka bort allt som har har definition av register, minne och config bitar.
(__CONFIG måste vara kvar så klart).
- Byt ut "RETLW 0" mot "RETURN". RETLW är en gammal kvarleva från äldre
processorer, och det ser väldigt oproffsigt ut att ha med det i dag.
- Byt ut alla "BSF STATUS,RPx" mot BANKSEL xxxx. Bara för att ta ett exempel på varför :För att vara korrekt ska det stå :Vilken bank man hamnar i beror på hur RP1 står !!.
Samma sak med :vilket bör vara :BANKSEL hanterar detta korrekt, om man har en processor med fler än 2 banker, så sätter BANKSEL alltid både RP0 och RP1.
På en processor med enbart två banker är den "smart enough" att bara sätta RP0...
Så koden behöver en riktig genomgång innan det finns någon anledning att
titta på själva funktionen...
- Lägg till en #INCLUDE av rätt INC fil för den processor du använder.
- Plocka bort allt som har har definition av register, minne och config bitar.
(__CONFIG måste vara kvar så klart).
- Byt ut "RETLW 0" mot "RETURN". RETLW är en gammal kvarleva från äldre
processorer, och det ser väldigt oproffsigt ut att ha med det i dag.
- Byt ut alla "BSF STATUS,RPx" mot BANKSEL xxxx. Bara för att ta ett exempel på varför :
Kod: Markera allt
BSF STATUS,RP0 ;Switch to register bank 1
Kod: Markera allt
BSF STATUS,RP0 ;Switch to register bank 1 or bank 3
Samma sak med :
Kod: Markera allt
BCF STATUS,RP0 ;Switch Back to reg. Bank 0
Kod: Markera allt
BCF STATUS,RP0 ;Switch Back to reg. Bank 0 or bank 2
På en processor med enbart två banker är den "smart enough" att bara sätta RP0...
Så koden behöver en riktig genomgång innan det finns någon anledning att
titta på själva funktionen...
Är den korrekt nu?
Kod: Markera allt
processor 16f627
include <p16f627.inc>
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
; *********************************************
; * Example of a delay routine *
; *********************************************
DELAY_ROUTINE MOVLW D'255' ;54 Generate approx 10mS delay at 4Mhz CLK
MOVWF TIMER2
DEL_LOOP1 MOVLW D'255' ;60
MOVWF TIMER1
DEL_LOOP2 DECFSZ TIMER1,F
GOTO DEL_LOOP2
DECFSZ TIMER2,F
GOTO DEL_LOOP1
RETURN
; **********************************
; ** RESET : main boot routine **
; **********************************
RESET MOVLW B'00000111' ;Disable Comparator module's
MOVWF CMCON
;
BANKSEL H'0006' ;Switch to register bank 1
;Disable pull-ups
;INT on rising edge
;TMR0 to CLKOUT
;TMR0 Incr low2high trans.
;Prescaler assign to Timer0
;Prescaler rate is 1:256
MOVLW B'11010111' ;Set PIC options (See datasheet).
MOVWF OPTION_REG ;Write the OPTION register.
;
CLRF INTCON ;Disable interrupts
MOVLW B'11000000'
MOVWF TRISB ;RB7 & RB6 are inputs.
;RB5...RB0 are outputs.
MOVLW B'11111111' ;all RA ports are inputs
MOVWF TRISA
BANKSEL H'0005' ;Switch Back to reg. Bank 0
CLRF PORTB
;
EFFECT_1 MOVLW B'00000001' ;Activate LD1 (RB0)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00000010' ;Activate LD2 (RB1)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00000100' ;Activate LD3 (RB2)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00001000' ;Activate LD4 (RB3)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00010000' ;Activate LD5 (RB4)
MOVWF PORTB
CALL DELAY_ROUTINE
MOVLW B'00100000' ;Activate LD6 (RB5)
MOVWF PORTB
CALL DELAY_ROUTINE
GOTO EFFECT_1
END