Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Direttiva .org AVR assembly (atmega8535)

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[41] Re: direttiva .org avr assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 2 giu 2013, 21:25

Rabeluk ha scritto:
come mai nell'esempio che ho postato io mette il nome della label sia in ZH che in ZL?
non dovrebbe metterlo in tutto Z?


ok si ora ho capito :mrgreen: :mrgreen:

non avevo capito la funzione del simbolo << e della parte quando scrive high e low... ma ora credo di aver capito :D

visto che ci siamo... potresti spiegarmi cortesemente cosa vuol dire questo? ( a titolo informativo :D)

Codice: Seleziona tutto
ldi r16, (1<<IVCE)

ci provo: mette in r16 il valore 1 spostato a sinistra ivce volte?
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

1
voti

[42] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto Utentexyz » 3 giu 2013, 0:49

Rabeluk ha scritto:mmm quindi da quello che ho capito se voglio usare una LUT non mi serve usare .org per specificare l'indirizzo.
basta mettere in Z il nome della label dove inizia la LUT e poi fa da solo?

Non serve solo per LUT ma anche per le stringhe e per tutti i dati statici in sola lettura. Se serve puoi usare ".org", ma devi essere in grado di individuare una locazione valida libera. Con la label il compilatore conosce la prima cella di memoria libera dopo l'ultima istruzione.

come mai nell'esempio che ho postato io mette il nome della label sia in ZH che in ZL?
non dovrebbe metterlo in tutto Z?

Ti ricordo che stai usando una MCU con registri a 8 bit ;-)

Rabeluk ha scritto:ci provo: mette in r16 il valore 1 spostato a sinistra ivce volte?

Il valore di "IVCE" deve essere noto al momento della compilazione di quella riga altrimenti segnala un errore. Quel codice esegue l'operazione che hai descritto, visto che "r16" è un registro a 8 bit "IVCE" può valere tra 0 e 7 altrimenti è come scrivere 0. L'istruzione è equivalente in base dieci alle potenze di 2: $2^{\mbox{IVCE}}$.

Ogni compilatore ha il suo manuale con tutti gli operandi utilizzabili.
Avatar utente
Foto Utentexyz
6.380 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1683
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[43] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 3 giu 2013, 11:05

bene credo di aver capito

xyz ha scritto: Se serve puoi usare ".org", ma devi essere in grado di individuare una locazione valida libera. Con la label il compilatore conosce la prima cella di memoria libera dopo l'ultima istruzione.



mentre qui ancora vorrei capire il concetto di locazione valida libera.....
-ogni riga di codice vale un indirizzo di word?
-se inizio con il vettore degli interrupt all'indirizzo 0x0000 come hai fatto tu,all'indirizzo 0x0001 (sempre di word) cosa troverò

Codice: Seleziona tutto
ldi      temp,low(RAMEND)
oppure
Codice: Seleziona tutto
reti      ;External Interrupt0 Vector Address


cioè troverò la riga successiva oppure la chiamata alla label RESET?
mi viene da pensare che su RESET ci si sposta il program counter ma l'indirizzo in memoria di RESET è 0x005 ma non ne sono del tutto sicuro
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

3
voti

[44] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto Utentexyz » 3 giu 2013, 12:26

Rabeluk ha scritto:-ogni riga di codice vale un indirizzo di word?

No, gli opcode del linguaggio macchina degli AVR sono in generale lunghi 2 byte (1 word) ma ci sono delle eccezioni come la "call" con un indirizzo assoluto, occupa 4 byte (2 word).

Rabeluk ha scritto:-se inizio con il vettore degli interrupt all'indirizzo 0x0000 come hai fatto tu,all'indirizzo 0x0001 (sempre di word) cosa troverò

Questo è per me scritto chiaramente nel datasheet. Una delle prime cose che uno guarda quando inizia a programmare un nuovo microcontrollore è la prima locazione eseguita dopo il reset . Per Atmega8535 è la tabella "Interrupt Vectors in ATmega8535" (pag. 46 del mio PDF):

Codice: Seleziona tutto
1 0x000 RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
2 0x001 INT0 External Interrupt Request 0
3 0x002 INT1 External Interrupt Request 1
4 0x003 TIMER2 COMP Timer/Counter2 Compare Match
5 0x004 TIMER2 OVF Timer/Counter2 Overflow
6 0x005 TIMER1 CAPT Timer/Counter1 Capture Event
7 0x006 TIMER1 COMPA Timer/Counter1 Compare Match A
8 0x007 TIMER1 COMPB Timer/Counter1 Compare Match B
9 0x008 TIMER1 OVF Timer/Counter1 Overflow
10 0x009 TIMER0 OVF Timer/Counter0 Overflow
11 0x00A SPI, STC Serial Transfer Complete
12 0x00B USART, RXC USART, Rx Complete
13 0x00C USART, UDRE USART Data Register Empty
14 0x00D USART, TXC USART, Tx Complete
15 0x00E ADC ADC Conversion Complete
16 0x00F EE_RDY EEPROM Ready
17 0x010 ANA_COMP Analog Comparator
18 0x011 TWI Two-wire Serial Interface
19 0x012 INT2 External Interrupt Request 2
20 0x013 TIMER0 COMP Timer/Counter0 Compare Match
21 0x014 SPM_RDY Store Program Memory Ready


Per un ATmega128 è questa:

Codice: Seleziona tutto
1 $0000 RESET External Pin, Power-on Reset, Brown-out Reset, Watchdog Reset, and JTAG AVR Reset
2 $0002 INT0 External Interrupt Request 0
3 $0004 INT1 External Interrupt Request 1
4 $0006 INT2 External Interrupt Request 2
5 $0008 INT3 External Interrupt Request 3
6 $000A INT4 External Interrupt Request 4
7 $000C INT5 External Interrupt Request 5
8 $000E INT6 External Interrupt Request 6
9 $0010 INT7 External Interrupt Request 7
10 $0012 TIMER2 COMP Timer/Counter2 Compare Match
11 $0014 TIMER2 OVF Timer/Counter2 Overflow
12 $0016 TIMER1 CAPT Timer/Counter1 Capture Event
13 $0018 TIMER1 COMPA Timer/Counter1 Compare Match A
14 $001A TIMER1 COMPB Timer/Counter1 Compare Match B
15 $001C TIMER1 OVF Timer/Counter1 Overflow
16 $001E TIMER0 COMP Timer/Counter0 Compare Match
17 $0020 TIMER0 OVF Timer/Counter0 Overflow
18 $0022 SPI, STC SPI Serial Transfer Complete
19 $0024 USART0, RX USART0, Rx Complete
20 $0026 USART0, UDRE USART0 Data Register Empty
21 $0028 USART0, TX USART0, Tx Complete
22 $002A ADC ADC Conversion Complete
23 $002C EE READY EEPROM Ready
24 $002E ANALOG COMP Analog Comparator
25 $0030 TIMER1 COMPC Timer/Countre1 Compare Match C
26 $0032 TIMER3 CAPT Timer/Counter3 Capture Event
27 $0034 TIMER3 COMPA Timer/Counter3 Compare Match A
28 $0036 TIMER3 COMPB Timer/Counter3 Compare Match B
29 $0038 TIMER3 COMPC Timer/Counter3 Compare Match C
30 $003A TIMER3 OVF Timer/Counter3 Overflow
31 $003C USART1, RX USART1, Rx Complete
32 $003E USART1, UDRE USART1 Data Register Empty
33 $0040 USART1, TX USART1, Tx Complete
34 $0042 TWI Two-wire Serial Interface
35 $0044 SPM READY Store Program Memory Ready


Ogni modello di microntrollore ha una propria tabella, cambiano le varie funzioni (tranne la prima il RESET) e la grandezza, anche se fanno parte della stessa famiglia.

Quella tabella è un salto a un interrupt decisa dall'unità centrale, ci può essere un salto a un'altra istruzione con "rjmp LABEL" o un ritorno a un interrupt con "iret" (ritorna subito senza eseguire nessun altro codice). Se vedi un'altra istruzione di solito è un baco.
Avatar utente
Foto Utentexyz
6.380 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1683
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[45] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 3 giu 2013, 12:33

xyz ha scritto:
    1 0x000 RESET External Pin, Power-on Reset, Brown-out Reset and Watchdog Reset
    2 0x001 INT0 External Interrupt Request 0
    3 0x002 INT1 External Interrupt Request 1
    4 0x003 TIMER2 COMP Timer/Counter2 Compare Match
    5 0x004 TIMER2 OVF Timer/Counter2 Overflow
    6 0x005 TIMER1 CAPT Timer/Counter1 Capture Event
    7 0x006 TIMER1 COMPA Timer/Counter1 Compare Match A
    8 0x007 TIMER1 COMPB Timer/Counter1 Compare Match B
    9 0x008 TIMER1 OVF Timer/Counter1 Overflow
    10 0x009 TIMER0 OVF Timer/Counter0 Overflow
    11 0x00A SPI, STC Serial Transfer Complete
    12 0x00B USART, RXC USART, Rx Complete
    13 0x00C USART, UDRE USART Data Register Empty
    14 0x00D USART, TXC USART, Tx Complete
    15 0x00E ADC ADC Conversion Complete
    16 0x00F EE_RDY EEPROM Ready
    17 0x010 ANA_COMP Analog Comparator
    18 0x011 TWI Two-wire Serial Interface
    19 0x012 INT2 External Interrupt Request 2
    20 0x013 TIMER0 COMP Timer/Counter0 Compare Match
    21 0x014 SPM_RDY Store Program Memory Ready



bene anche quello che uso io ha questo vettore degli interrupt... quindi io posso usare la direttiva org a partire dall 'indirizzo 22 giusto?
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

3
voti

[46] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto Utentexyz » 3 giu 2013, 16:49

Gli indirizzi del segmento di codice sotto tutti word quindi la prima locazione dopo la tabella dei vettori è in base 16 "0x11" (tu hai indicato 22 un numero in base 10 se non si specifica la base e/o il prefisso della base). Questo vale per ATmega8535 o AT90s8535 il vecchio modello.

Ti consigli di leggere la documentazione del compilatore assembler usato dal Atmel (io sotto Linux utilizzo altri software, alcuni hanno la sintassi compatibile):

http://www.atmel.com/Images/doc1022.pdf

P.S. Errata corrige, ho scoperto che AT90s8535 e ATmega8535 sono simili ma non uguali. Per AT90s8535 la prima locazione è appunto 0x11 per ATmega8535 0x15.
Avatar utente
Foto Utentexyz
6.380 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1683
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[47] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 3 giu 2013, 16:52

sisi in base 16 una cosa cosi va bene?

Codice: Seleziona tutto
.cseg
.org 0x00
rjmp Init      ; Reset Handler
reti          ; IRQ0 Handler
reti          ; IRQ1 Handler
reti           ; Timer2 Compare Handler
reti           ; Timer2 Overflow Handler
reti           ; Timer1 Capture Handler
rjmp           ; Timer1 Compare A Handler
reti           ; Timer1 Compare B Handler
reti          ; Timer1 Overflow Handler
rjmp          ; Timer0 Overflow Handler
reti          ; SPI Transfer Complete Handler
reti           ; USART RX Complete Handler
reti          ; UDR Empty Handler
reti           ; USART TX Complete Handler
reti          ; ADC Conversion Complete Handler
reti          ; EEPROM Ready Handler
reti          ; Analog Comparator Handler
reti          ; Two-wire Serial Interface Handler
reti           ; IRQ2 Handler
reti           ; Timer0 Compare Handler
reti           ; Store Program Memory Ready Handler

;LUT
.org 0x17
.db 0b00011000,0b00000000
.db 0b00111100,0b00000000
.db   0b00111100,0b00000000
.db 0b00000000,0b00000001
.db 0b00001101,0b00000001
.db 0b00000000,0b00000000
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

0
voti

[48] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto Utentexyz » 3 giu 2013, 17:21

Guarda l'errata corrige del mio precedente messaggio. Credevo che i due microcontrollori fossero uguali, uno con la vecchia sigla uno con la nuova, invece Atmel oltre ad aver aggiornato il nome ha aggiunto alcuni vettori rendendoli non binariamente compatibili (ho fatto un confronto tra i due datasheet).

Per ATmega8535 la word 0x17 è utilizzabile (crei un buco non utilizzato), non si soprappone con la tabella degli interrupt e non supera la massima locazione utilizzabile.
Avatar utente
Foto Utentexyz
6.380 2 4 5
G.Master EY
G.Master EY
 
Messaggi: 1683
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[49] Re: Direttiva .org AVR assembly (atmega8535)

Messaggioda Foto UtenteRabeluk » 3 giu 2013, 17:26

xyz ha scritto:
Per ATmega8535 la word 0x17 è utilizzabile (crei un buco non utilizzato), non si soprappone con la tabella degli interrupt e non supera la massima locazione utilizzabile.


si ho il datasheet ed è cosi.. la prima word libera è a 0x16.. per il buco, beh l'ho fatto volutamente per sapere cosa può causare :mrgreen:
Avatar utente
Foto UtenteRabeluk
116 1 4 9
Sostenitore
Sostenitore
 
Messaggi: 765
Iscritto il: 30 gen 2011, 22:26

Precedente

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti