Novinka:RC regulátor otáček
(Kategorie: Mikroprocesory)
Napsal NYX
08.10.2017 00:00

Zdravím lidi,
mám trochu problém s programem. Pomocí Atmega8 s 16megovym krystalem se snažím vyčítat signál z rc vysílačky a převádět ho na výstup pomocí PWM. Vysílačku mám připojenou na pin PB0 a tam dostávám signál o délce 1-2 ms přičemž 1ms = 0% a 2ms=100%. tento signál se snažím vyčítat pomocí 16b timeru což by měl bejt časovač 1, pomocí předděličky z toho dostanu hodnotu 250-500, od které odečtu 250 a mám cca zozumnej rozsah pro 8b PWM timer2. V debug modu to běží náramně krásně , ale jakmile to naleju do procáku tak mi to háže pořáte přetečení a už se z toho nemohu vymotat. Mám tam hozený ledky na výstupu abych vyděl asponě něakou reakci. Přikládám aspoň částečně komentovanej program pokud mi tam najdete chybu budu rád za opravu.
Předem děkuji.

;************************************************************************************************
;************************** RC na PWM **************************************************
;
;Xtal 16Mhz 62,5us/cikl
;PWM 31Hz 64ms 1/1024f
;Timer1 1/64f 4us
;
;
;
;Led green PD6
;Led RED PB2
;

.include "m8def.inc"

;Register and Pin definitions

.def tempL = r16
.def tempH = r17
.def Flags = r18
.def state = r19
.def null = r2
.def status = r21
.def SREGbuf = r5


.equ CHANNELS= 8
.equ SRAMbufer= 0x68
.equ SRAM_PWM= 0x6A
.equ ERRORS= 0x6F
.equ F_OSC= 16000000 ;

;***** special Flags

#define pwmMax (500) ; max hodnota T1 do které čítá 2ms=500


rjmp init ; RESET ; Reset Handler
reti ; EXT_INT0 ; IRQ0 Handler
reti ;EXT_INT1 ; IRQ1 Handler
rjmp PWM ; TIM2_COMP ; Timer2 Compare Handler
reti ; TIM2_OVF ; Timer2 Overflow Handler
rjmp read ; TIM1_CAPT ; Timer1 Capture Handler
reti ; TIM1_COMPA ; Timer1 CompareA Handler
reti ; TIM1_COMPB ; Timer1 CompareB Handler
reti ; TIM1_OVF ; Timer1 Overflow Handler
reti ; TIM0_OVF ; Timer0 Overflow Handler
reti ; SPI_STC ; SPI Transfer Complete Handler
reti ; USART_RXC ; USART RX Complete Handler
reti ; USART_UDRE ; UDR Empty Handler
reti ; USART_TXC ; USART TX Complete Handler
reti ; ADC Conversion Complete Handler
reti ; ANA_COMP ; Analog Comparator Handler
reti ; TWSI ; Two-wire Serial Interface
reti ; SPM_RDY ; Store Program Memory Ready


init:;
SP: ldi r16,high(RAMEND); Main program start
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,high(RAMEND)
out SPL,r16
; PortB
ldi tempL, 0b00001100 ;PB3 jako výstup PWM
out DDRB, tempL
ldi tempL, 0b00000001 ;PB0 nastaven jako vstup ICP1,PB2= LED RED
out PORTB, tempL
;PortC
ldi tempL, 0b1111111
out DDRC , tempL
ldi tempH, 0b0000000
out PortC, tempH

;PortD
ldi tempL, 0b11111111
out DDRD , tempL
ldi tempH, 0b00000000
out PortD, tempH




;Timer1
ldi tempL, (0< out TCCR1B, tempL

ldi tempL,low (pwmMax) ;nastaví se 16bit číslo pro max hodnotu čítače
ldi tempH, high (pwmMax) ;nastaví se 16bit číslo pro max hodnotu čítače
out OCR1AL, tempL
out OCR1AH, tempH ;po přetečení se čítač nuluje a počíta znovu CTC mod-WGM12


;Timer2 PWM

ldi tempL, (1< out TCCR2, tempL
clr tempL
out OCR2, tempL



ldi tempL, (1< out TIMSK, tempL







;set Register
clr null

clr Flags ;clear Flags

; memory
ldi ZH, high(SRAMbufer) ; nuluje v sram
ldi ZL, low(SRAMbufer) ; pripravi prostor pro data
ldi tempL, CHANNELS ; dle poctu kanalu
write_mem:
st Z+, null
dec tempL
brne write_mem




sei ; povol global iterupt

main: ;čeká na EXTERNÍ PULZ log1
sbis pinB, PB0 ;testuj vstup jeli 1 zapni timer
rjmp main ;vrťse když je 0

ldi tempL, (1< out TCCR1B, tempL
;přišel pulz čekej až bude konec
test0:





sbic pinB, PB0 ;testuj vstup jeli 0 /čekej na nulu/
rjmp test0 ;skoč když je 1
cbi portB, PB2 ;zhasni lED RED
rjmp main ;je 1 vrať se na main

;




;********************* PRERUSENI TIMER 1 ********************************
read:
in SREGbuf, SREG
push tempL
push tempH





in tempL, ICR1L ;načti zachytný registr Timeru 1
in tempH, ICR1H

ldi ZH,high(SRAMbufer) ;nastav adresu bufferu SRAM
ldi ZL,low(SRAMbufer);

st Z +, tempL ;ulož do sram a zvyš ukazovatko
st Z , tempH

ldi status , (0< out TCCR1B, STATUS

; nuluj Timer1;
out TCNT1L, null
out TCNT1H, null

; inc STATUS
subi tempL, low(250) ; odečte 250 pro 8bit rozlišení pro pwm
sbci tempH, high(250)
brcc pwmend
; testuje na zápornou hodnotu

clr tempL ;je záporna nastaví 0
pwmend:
sts SRAM_PWM, tempL ;uloží připravené PWM 0-255


pop tempH
pop tempL
out SREG, SREGbuf
reti

;*********************PWM************************************************


PWM: in SREGbuf, SREG
push tempL
push tempH

ldi ZH,high(SRAM_PWM) ;nastav adresu bufferu SRAM
ldi ZL,low(SRAM_PWM);


sbi PortD, PD6



; ERROR
in state, TIFR
sbrs state, OCF1A
rjmp pwmout

ldi state, (1< out TIFR, state


lds state, ERRORS
inc state
sts ERRORS, state
cpi state, 50
brne pwmout

sbi PortB, PB2 ; ON Red LRD
cbi PortD, PD6 ; OFF Green Led
clr null
sts SRAM_PWM, null
sts ERRORS, null

pwmout:
ld tempL, Z
out OCR2, tempL



pop tempH
pop tempL
out SREG, SREGbuf

reti


Tato novinka je z -MCU-mikroelektronika
( http://mcu.cz/news.php?extend.4014 )