 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
laco Član

Pridružen-a: Pon 06 Jun 2011 19:32 Prispevkov: 13 Aktiv.: 0.08 Kraj: Hrvatska
|
Objavljeno: Sob Apr 13, 2013 9:21 pm Naslov sporočila: Konvertiranje MicroC u Bascom Avr PWM sine wave 50Hz |
|
|
Napravio sam konverziju MicroC koda u Bascom Avr za mikrokontroler ATMEGA 16 sa taktom 16MHZ. Trebam pomoć kako prevesti par linija koda iz MicroC-a u Bascom, označene su sa CRVENONOM BOJOM
U privitku prilažem detaljan opis sa MicroC Pro kodom.
[/code]
'*******************************************************************************
'* Programmer: Syed Tahmid Mahbub in MicroC
'* Program Convert to Bascom Avr: Ivica Lacmanovic
'* Target Microcontroller: ATMEGA16
'* Compiler: Bascom AVR 2.0.7.3
'*******************************************************************************
$regfile = "m16def.dat" ' specify the used micro
$crystal = 16000000 ' used crystal frequency
$baud = 19200 ' use baud rate
$hwstack = 128 ' default use 128 for the hardware stac
$swstack = 64 ' default use 64 for the SW stack
$framesize = 64
' variable
'------------------------------
Dim Sin_table(32) As Integer ' Half period Sine wave table 32 segments
Dim Index As Byte
' Config Ports
'------------------------------
Config Portd = Output
Mosa Alias Pind.0 ' #define MOSA PORTD0_bit
Mosb Alias Pind.1 ' #define MOSB PORTD1_bit
Mosc Alias Pind.2 ' #define MOSC PORTD2_bit
Mosd Alias Pind.3 ' #define MOSD PORTD3_bit
For Index = 0 To 31
Sin_table(index + 1) = Lookup(index , Sine_dat) ' Read sine_dat "1 to 32"
Next Index
Dim Flagreg As Byte ' unsigned char FlagReg;
'********************************************************************************
#define Direction Flagreg.b0 'OVU LINIJU NA ZNAM KONVERTIRATI U BASCOM.
'********************************************************************************
' 0 -> MOS A + D
' 1 -> MOS B + C
Dim Tbl_pointer_new As Integer , Tbl_pointer_old As Integer
Dim Tbl_pointer_shift As Integer , Set_freq As Integer
Dim Tbl_temp As Integer
Dim Duty_cycle As Byte
Enable Ovf0
On Ovf0 Timer1_ovf
Do
Set_freq = 410
Tbl_pointer_shift = 0
Tbl_pointer_new = 0
Tbl_pointer_old = 0
Duty_cycle = 0
Ddrc = &B11111111 ' DDRC = 0xFF;
Ddrd = &B11111111 ' DDRD = 0xFF;
Ocr1ah = 0
Ocr1al = 0
Tccr1a = &B10000010 ' TCCR1A = 0x82;
Icr1h = &B00000011 ' ICR1H = 0x03;
Icr1l = &B11100111 ' ICR1l = 0xe7;
' ICR1 = 999 -> TOP -> 16kHz
Timsk = &B00000100 ' Timsk = 0x04;
Tccr1b = &B00011001 ' Tccr1b = 0x19;
'*******************************************************************************
Sreg_i_bit = 1 ' Mogu li je zamijeniti sa Enable Interrupts
'*******************************************************************************
Loop
End ' End Program
'***********************************************Interrupt0**********************
Void Interrupt() Org Ivt_addr_timer1_ovf{
' MOGU LI OVU LINIJU ZAMITI SA Timer1_ovf:'*******************************************************************************
Tbl_pointer_new = Tbl_pointer_new + Set_freq
If Tbl_pointer_new < Tbl_pointer_old Then
If Direction = 0 Then
Mosa = 0
Mosd = 0
Mosb = 1
Mosc = 1
Direction = 1
Else
Mosb = 0
Mosc = 0
Mosa = 1
Mosd = 1
Direction = 0
End If
End If
Tbl_pointer_shift = Tbl_pointer_new : Shift Tbl_pointer_shift , Right , 11 'TBL_POINTER_SHIFT = TBL_POINTER_NEW >> 11;
Duty_cycle = Tbl_pointer_shift
Tbl_pointer_shift = Sin_table(duty_cycle)
Ocr1ah = Tbl_pointer_shift : Shift Ocr1ah , Right , 8 'OCR1AH = TBL_POINTER_SHIFT >> 8;
Ocr1al = Tbl_pointer_shift And &B00001111 'OCR1AL = TBL_POINTER_SHIFT & 0x0F;
Tbl_pointer_old = Tbl_pointer_new
Return
'************* Sine Table data for 32 samples ****************************
Sine_dat:
Data 0 , 100 , 199 , 296 , 390 , 480 , 566 , 645 , 718 , 783 , 840 , 889 , 928 , 958 , 979 , 989 , 989 , 979 , 958 , 928 , 889 , 840 , 783 , 718 , 645 , 566 , 480 , 390 , 296 , 199 , 100 , 0
Opis: |
|
 Download |
Ime datoteke: |
Sine Wave Generation with ATMEGA16.pdf |
Velikost datoteke: |
361.21 KB |
Downloadano: |
4 krat |
_________________ Lijep pozdrav,
Ivica Lacmanovic |
|
Nazaj na vrh |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.01
|
Objavljeno: Ned Apr 14, 2013 1:36 am Naslov sporočila: Re: Konvertiranje MicroC u Bascom Avr PWM sine wave 50Hz |
|
|
laco je napisal/a: |
do
Read-inputs
Measure-ADC
Call-subrutines
Calculate-variables
R/W-EE
Write-lcd
Write-outputs
WaitMs(18)
Loop |
Izbaci komplet inicializaciju iz "do - loop", jer inicializira se samo jednom na početku, a do-loop onda radi non stop.
Kad se dogodi Interrupt, program negdje između do i loop prestane, servisira interrupt, a onda ide dalje od tamo, gdje je prije prestao.
_________________ Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor |
|
Nazaj na vrh |
|
 |
laco Član

Pridružen-a: Pon 06 Jun 2011 19:32 Prispevkov: 13 Aktiv.: 0.08 Kraj: Hrvatska
|
Objavljeno: Pon Apr 15, 2013 2:50 pm Naslov sporočila: Konvertiranje MicroC u Bascom Avr PWM sine wave 50Hz |
|
|
Program sam malo preuredio i sad izgleda ovako.
Dobijam na MOSA i MOSC signal koji nije pravilni pravokutnik, dok je signal na MOSB i MOSD u redu.
Molim savjetda li su signali u redu.
Koda: |
'***********************************************************************
'* Programmer: Ivica Lacmanovic
'* Target Microcontroller: ATMEGA16
'* Compiler: Bascom AVR
'***********************************************************************
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 128
$swstack = 64
$framesize = 64
'Ddrc = &B11111111 not used in code
Ddrd = &B11111111
Mosa Alias Portd.0
Mosb Alias Portd.1
Mosc Alias Portd.2
Mosd Alias Portd.3
Dim Sin_table(32) As Byte ' Sine_table
Dim Index As Byte
Dim Direction As Bit
Dim Tbl_pointer_new As Word , Tbl_pointer_old As Word
Dim Tbl_pointer_shift As Word , Set_freq As Word
Dim Tbl_temp As Word
Dim Duty_cycle As Word
Config Base = 0
For Index = 0 To 31
Sin_table(index) = Lookup(index , Sine_dat) ' Read sine_dat
Next Index
Ocr1ah = 0
Ocr1al = 0
Tccr1a = &B10000010
Icr1h = &B00000011
Icr1l = &B11100111
Timsk = &B00000100
Tccr1b = &B00011001
Enable Ovf1
On Ovf1 Timer1_ovf
Set_freq = 410
Tbl_pointer_shift = 0
Tbl_pointer_new = 0
Tbl_pointer_old = 0
Duty_cycle = 0
Enable Interrupts
Do
!nop
Loop
End
'************************** TIMER1 Overflow ********************************
Timer1_ovf:
Tbl_pointer_new = Tbl_pointer_new + Set_freq
If Tbl_pointer_new < Tbl_pointer_old Then
If Direction = 0 Then
Reset Mosa
Reset Mosd
Set Mosb
Set Mosc
Set Direction
Else
Reset Mosb
Reset Mosc
Set Mosa
Set Mosd
Reset Direction
End If
End If
Tbl_pointer_shift = Tbl_pointer_new
Shift Tbl_pointer_shift , Right , 11
Duty_cycle = Tbl_pointer_shift
Tbl_pointer_shift = Sin_table(duty_cycle)
Ocr1ah = High(tbl_pointer_shift)
Ocr1al = Low(tbl_pointer_shift)
Tbl_pointer_old = Tbl_pointer_new
Return
'************ Sine Table data for 32 samples ****************************
Sine_dat:
Data 0 , 100 , 199 , 296 , 390 , 480 , 566 , 645 , 718 , 783 , 840 , 889 , 928 , 958 , 979 , 989
Data 989 , 979 , 958 , 928 , 889 , 840 , 783 , 718 , 645 , 566 , 480 , 390 , 296 , 199 , 100 , 0 |
Opis: |
|
Velikost datoteke: |
90.59 KB |
Pogledana: |
7 krat |

|
Opis: |
|
Velikost datoteke: |
178.03 KB |
Pogledana: |
2 krat |

|
_________________ Lijep pozdrav,
Ivica Lacmanovic |
|
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: 493 dni
Powered by phpBB © 2001, 2005 phpBB Group
|