|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
jakar Član
Pridružen-a: Sob 22 Maj 2004 21:34 Prispevkov: 190 Aktiv.: 0.85 Kraj: Primorska
|
Objavljeno: Sob Jan 02, 2010 6:42 pm Naslov sporočila: Mehki zagon s pwm-jem PIC 16F877A |
|
|
Pozdravljeni,
Prilagam program, ki mi dela sive lase. Delovanje: najprej sledi inicializacija PWM-ja in timer-ja. Za izhod je določen pin RC2. Po inicializaciji sledi branje EEPROM-a na lokaciji 0x00, kje je predhodno zapisna konstanta za razmerje PWM-ja. Sledi mehek zagon, kjer se PWM »pobere« od 0 do 100% v približno dveh sekundah. Tu preverjam kdaj dosežem vrednost, ki je bila zapisana v EEPROM-u, ko je dosežena skočim nazaj v glavno zanko. Če debagiram z MPLAB SIM dela kot mora in se PWM ustavi pri razmerju 50-50 . Ko pa vpišem program v PIC se mi signal spreminja od 0 do 100% in se ne ustavi pri pred nastavljeni vrednosti v EEPROM-u. Ker nimam še izdelanega ICD2 clona ne moram debagirati, zato prosim, če mi lahko kdo pomaga poiskati kaj delam narobe.
Koda: |
include p16f877a.inc
errorlevel -302 ;če želimo da MPASMWIN kakega opzorila ne kaže
__CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _CP_OFF & _DEBUG_OFF
STEVEC1 EQU 0X20
STEVEC2 EQU 0X21
NASLOV_EE EQU 0X22
PODATEK_EE EQU 0X23
ZAGON EQU 0X24
org 0x2100 ;pripravim zeljeno vrednost v eeprom
de 0x80
ORG 0
call INACIALIZACIJA
CALL BRANJE_EE
CALL MEHKI_ZAGON
GLAVNA_ZANKA
NOP
GOTO GLAVNA_ZANKA
;******************************************************************
;****************************** M E H K I Z A G O N *****************
MEHKI_ZAGON
CLRF ZAGON
MOVF ZAGON,W
MOVWF CCPR1L ;NASTAVLJAM ŠIRINO PWM-ja
CALL ZAKASNITEV ;ZAKASNITEV, DA TRAJA POSTAVITEV
INCF ZAGON,F ;PWM-ja OD 0% DO 100% PRIBLIŽNO 2 SEKUNDI
MOVF ZAGON,W
SUBWF PODATEK_EE,W ;ALI SEM ŽE DOSEGEL SHRANJENO VREDNOST?
BTFSS STATUS,Z
GOTO $-7
RETURN
;******************************B R A N J E E E P R O M A************
BRANJE_EE
MOVF NASLOV_EE,W ;LOKACIJA BRANJA EEPROMA
BSF STATUS,RP1
MOVWF EEADR
BSF STATUS,RP0
BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
BCF STATUS,RP1 ;BANKA 0
MOVWF PODATEK_EE ; PREBRANO SHRANIM V PODATEK_EE
RETURN
;****************************** Z A K A S N I T E V ******************
ZAKASNITEV
MOVLW .20
MOVWF STEVEC2
_ZACETEK
MOVLW .255
MOVWF STEVEC1
_DELAJ
DECFSZ STEVEC1,F
GOTO _DELAJ
DECFSZ STEVEC2,F
GOTO _ZACETEK
RETURN
;***********************INACIALIZACIJA********************************
INACIALIZACIJA
BSF STATUS,RP0 ;BANKA1
BCF STATUS,RP1
MOVLW 0XFF
MOVWF PR2
BCF STATUS,RP0 ;BANKA 0
; MOVLW 0X60 ; ŠIRINO PREKLOPA NASTAVIM V PODPROGRAMU
; MOVWF CCPR1L ; ZA MEHKI ZAGON
MOVLW B'00001100'
MOVWF CCP1CON
BSF STATUS,RP0
BCF TRISC,2
BCF STATUS,RP0
MOVLW B'00000100'
MOVWF T2CON ;PWM INC
RETURN
END
|
Lp,
Jaka |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Sob Jan 02, 2010 6:47 pm Naslov sporočila: |
|
|
Vrednost v EEPROM tudi zapišeš, ali samo program? _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
jakar Član
Pridružen-a: Sob 22 Maj 2004 21:34 Prispevkov: 190 Aktiv.: 0.85 Kraj: Primorska
|
Objavljeno: Sob Jan 02, 2010 6:53 pm Naslov sporočila: |
|
|
Vrednost v EEPROM sem zaenkrat zapisal kar v tabeli pred programiranjem v programu PICFLASH pred vpisom .hex datoteke v PIC. Poskušal sem tudi z funkcijo randomise EEPROMA, ki vpiše naključne vrednosti v EEPROM ampak mi gre program po vsakem resetu PIC-a od 0 do 100%. |
|
Nazaj na vrh |
|
|
Highlag Član
Pridružen-a: Pet 23 Jan 2004 20:42 Prispevkov: 4034 Aktiv.: 18.11 Kraj: Črnuče
|
Objavljeno: Sob Jan 02, 2010 9:44 pm Naslov sporočila: |
|
|
Hm, koliko sem se sam igral s tem se bila moja koda takšna:
Koda: |
Branje
MOVLW 0x00 ; naloži vrednost adrese prvega bajta EEproma v W
MOVWF EEADR ; naslov se prepiše v EEADR register (da ve s katere lokacije brati)
BSF STATUS, RP0 ; select bank 1
BSF EECON1, RD ; EPROM nastavljen na branje (RD -> read)
BCF STATUS, RP0 ; select bank 0
MOVF EEDATA, W ; vrednost lokacije 0x00 EEproma prenešena v W register
MOVWF Ure_dela_LOW_BYTE ; shranjena vrednost se iz Eproma prenese preko W registra v Stevec_1a
|
Ti vmes še menjaš banko. Mogoče je potrebno, moja koda je za 16F84A.
Sem pa opazil, da podatek v eeprom vpišeš na lokacijo 0x00, bereš jo pa iz 0x22 ter 0x23 je mogoče to narobe? _________________ If at first you don't succeed, destroy all evidence that you tried. |
|
Nazaj na vrh |
|
|
jakar Član
Pridružen-a: Sob 22 Maj 2004 21:34 Prispevkov: 190 Aktiv.: 0.85 Kraj: Primorska
|
Objavljeno: Sob Jan 02, 2010 10:45 pm Naslov sporočila: |
|
|
Citiram: |
Ti vmes še menjaš banko. Mogoče je potrebno, moja koda je za 16F84A. |
Pri 16f84a ni treba menjati banke, ker imaš v banki 0 register EEDATA. 16F877a pa ima EEDATA v banki 2, podatek_EE imam pa v banki 0, zato vmes skočim v banko 0.
Sem pa dobil hrošča, nikjer v programu nisem pobrisal Registra NASLOV_EE, ki se je nahajal na naslovu 0x22, MPLAB SIM je že imel privzeto vrednost 0x00. V PIC-u je bila pa očitno drugačna vrednost
Citiram: |
Sem pa opazil, da podatek v eeprom vpišeš na lokacijo 0x00, bereš jo pa iz 0x22 ter 0x23 je mogoče to narobe? |
Koda: |
NASLOV_EE EQU 0X22
PODATEK_EE EQU 0X23 |
Si mislil ta del? Kolikor sem jaz razumel (sem začetnik asm-ja) s tem definiraš dva prosta registra na naslovih 0x22 in 0x23 ne pa njihove vrednosti. |
|
Nazaj na vrh |
|
|
gumby Član
Pridružen-a: Sob 28 Apr 2007 12:32 Prispevkov: 4066 Aktiv.: 19.67
|
Objavljeno: Ned Jan 03, 2010 10:05 am Naslov sporočila: |
|
|
V EEADR vpišeš naslov eeproma, ki ga hočeš prebrat. V tvojem primeru prebereš vrednost na naslovu 0x22 in to zapišeš, kot naslov v EEADR. Problem je, ker te vrednosti nikoli ne nastaviš, torej bo naključna.
V inicializacijo dodaj še "clrf NASLOV_EE", da boš naslov eeproma postavil na 0.
Lahko tudi izpustiš to spremenljivko, saj je ne rabiš (bereš itak vedno iz naslova 0). _________________ Tule nisem več aktiven. |
|
Nazaj na vrh |
|
|
dkone Član
Pridružen-a: Sre 07 Mar 2007 18:53 Prispevkov: 2104 Aktiv.: 10.09 Kraj: Krško
|
Objavljeno: Ned Jan 03, 2010 4:43 pm Naslov sporočila: |
|
|
Število korakov je včasih zavajajoče. Poskusi takole:
Koda: |
MEHKI_ZAGON
CLRF ZAGON
MehkiZ
MOVF ZAGON,W
MOVWF CCPR1L ;NASTAVLJAM ŠIRINO PWM-ja
CALL ZAKASNITEV ;ZAKASNITEV, DA TRAJA POSTAVITEV
INCF ZAGON,F ;PWM-ja OD 0% DO 100% PRIBLIŽNO 2 SEKUNDI
MOVF ZAGON,W
SUBWF PODATEK_EE,W ;ALI SEM ŽE DOSEGEL SHRANJENO VREDNOST?
BTFSS STATUS,Z
GOTO MehkiZ ;$-7
RETURN
|
_________________ Denis |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 70 dni
Powered by phpBB © 2001, 2005 phpBB Group
|