Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

ATMega 168 PWM in ASM

Pagina: 1
Acties:

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik ben al een tijdje bezig met atmel microcontroller. Ben begonnen met programeren in asm en toen overgestapt naar C omdat dat toch een stuk makkelijker is. Nu had ik veel compiler problemen met men C programma dus heb ik besloten om het programma maar stap voor stap naar asm om te zetten.
Ik ben begonnen met het omzetten van de PWM routine naar asm, maar nu krijg ik bij het compilen de volgende error:
"error: Operant 1 out of range: 0x6E"
Dit is op de regel waar ik "TIMSK0" wil setten op 0x06. Ik snap niet wat daar fout aan is.

GAS:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
.device     ATmega168
.include    "m168def.inc"

.def    temp = r16

.CSEG
.ORG        $0000
    rjmp    RESET
.ORG        OC0Aaddr
.ORG        OC0Baddr

;***********************************************************
RESET:
    rcall   POORTINIT
    rcall   TIMER0INIT
    rcall   TIMER0INT
    sei
    rcall   LOOP

;***********************************************************
POORTINIT:
    ldi   temp, 0xFF
    out   ddrb, temp    

    ldi   temp, 0x00
    out   ddrc, temp

    ldi   temp, 0x8B
    out   ddrd, temp

    ret
    
;**********************************************************
TIMER0INIT:
    ldi     temp,   0xA3
    out     TCCR0A, temp
    ldi     temp,   0x02
    out     TCCR0B, temp
    ldi     temp,   0x00
    out     TCNT0,  temp
    ldi     temp,   0x09
    out     OCR0A,  temp
    ldi     temp,   0x0A
    out     OCR0B,  temp
    ret

;***********************************************************
TIMER0INT:
    ldi     temp,   0x06
    out     TIMSK0, temp
    ret

;***********************************************************
LOOP:
    rjmp    LOOP

Op de regel "out TIMSK0, temp" geeft avrstudio dus de error. Ik snap niet wat er fout aan is, heb nog gecontroleerd in de data sheet of TIMSK0 op adres 0x6E staat (wat ook in de include file staat) maar dat klopt gewoon helemaal. Ik snap er niets meer van want in C werkt het gewoon perfect (het PWM gedeelte dan).

C:
1
2
3
4
5
6
7
    TCCR0A=0xA3;
    TCCR0B=0x02;
    TCNT0=0x00;
    OCR0A=0xFF;
    OCR0B=0xFF;

    TIMSK0=0x06;

  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
OK, heb et probleem gevonden alleen snap ik et niet helemaal. In plaats van "out IMSK0, temp" moet ik "sts TIMSK0, temp" gebruiken. Warom moet je het ene register via de "out" insturctie aanspreken en de andere via "sts"?

Maar dan nog, als ik het zooitje comileer meet ik niets op de uitgangen.

[ Voor 14% gewijzigd door kippy op 15-07-2007 15:46 ]


  • Sissors
  • Registratie: Mei 2005
  • Niet online
Ah je hebt het zelf al gevonden. Was paar weekjes geleden tegen hetzelfde aangelopen. Omdat bij de atmegas ze al het complete adresbereik hadden gebruikt dat ze normaal gebruiken voor zulk soort dingen (dus die je met 'out' aanstuurt), zijn ze verder gegaan met adresseren alsof het SRAM is. En daar hoort het 'sts' commando bij ipv 'out'.


EDITje:
uit datasheet van atmega162 die ik nog op computer had staan:
The ATmega162 is a complex microcontroller with more peripheral units than can be
supported within the 64 location reserved in the Opcode for the IN and OUT instructions.
For the Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD and
LD/LDS/LDD instructions can be used.
Over je andere probleem: Heb je gesimuleerd in avr studio?

[ Voor 91% gewijzigd door Sissors op 15-07-2007 17:06 ]


  • kippy
  • Registratie: September 2004
  • Laatst online: 21-11 13:02
Ik heb em werkend. Was al weer zo lang geleden dat ik met asm had gewerkt :P en dat was altijd met een at90s1200 en at90s2313.
En nog bedankt voor de uitleg van et gebruik van OUT en STS.