AVR32 - jak ruszyc z tym prockiem - Page 2

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Polish to

Threaded View
Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Poeksperymentuj - gcc czesto jest 'dosc' pomyslowy. Mi sie juz od kilku
lat nie kalkuluje czasowo pisanie w ASM. Jedynie krytyczne czasowo
przerwania pisze w ASM (a i to staram sie to ograniczyc do wrzucenia
danej do kolejki do dalszego przetwarzania w C).

Quoted text here. Click to load it

AVR32 (na pewno UC3A0512) ma to samo - jak za wolno napiecie narasta to
procek sie zatrzaskuje i grzeje, wiec uwazaj. W pdfie nigdzie o tym nie
znalazlem.


--
Jerry1111

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Nieee. Tylko nie to! A czy pomaga zewnętrzny reset? Zewnętrzny układ
który trzyma reset procka, zamiast jego wewnętrznego brownout.
Może tylko jego wewnętrzny układ kontroli napięcia działa niepoprawnie?
Może na zewnętrznym resecie będzie OK?

Ale byłby numer jakby znów wpakował się w atmela co zastartować
nie potrafi. Zaraz zrobię testy.

SM

Re: AVR32 - jak ruszyc z tym prockiem
SM pisze:
Quoted text here. Click to load it

Zrobiłem szybki test. Bardzo wolno podawałem na LDO (obniża napięcie
z 5V do 3,3V dla procka) napięcie od 0 to 5V. Procek zastartował
poprawnie. Oczywiście ostateczne potwierdzenie wyjdzie dopiero
w kompletnym docelowym układzie - główne zasilanie odkłócone
przez filtr LC, podpięte do procka pozostałe elementy (np. mały
CPLD). Może być tak że coś "zbiera" przez zabezpieczenia przepięciowe
wejść i podaje to sobie gdzieś wewnątrz na zasilanie i głupieje
bo brownout czy reset tego nie widzi. Kaşda nóşka dostaje róşne
napięcia w różnym czasie. Niektóre te same 3V3 które ma procek
na VCCIO, inne 5V (np. z CPLD) ktĂłre przecieĹź narasta inaczej niĹź
to co on widzi na 3V3 czy resecie.

SM

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

LC na zasilaniu? OczywiB6%cie sprawdziB3%eB6%, jak siEA% ten filtr zachowuj=
e
(co pojawia siEA% na jego wyjB6%ciu) w stanach przejB6%ciowych, zwB3%aszcza
przy wB3%B1czaniu zasilania i nagB3%ych skokach obciB1%BFenia?

Re: AVR32 - jak ruszyc z tym prockiem
shg pisze:
Quoted text here. Click to load it

Tak. Bardzo ładnie wszystko filtruje. Miałem problemy w mocno
zakłóconym środowisku, zakłócenia na zasilaniu, itp. Teraz
jest OK.

SM

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

A napiecie za LDO roslo powoli? Bo u mnie lockup jest dosc powtarzalny -
musialem zadbac o dobre zasilanie.

Z drugiej strony - pierwszy procek Atmela jaki uzylem i dosc duza wpadka
(poza tym nie nowa - Altera to miala z 5 lat temu z Cyclonami).

--
Jerry1111

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Bardzo wolno. Powoli kręciłem zasilaczem od 0 do 5V.
Napięcie 5V narastało powoli, za LDO 3,3V też powoli,
napięcie 1,8V z VDDOUT powoli. Nóżka reset bez zewnętrznego
układu reset (rezystor 10k, kondensator 100nF, dioda BAS85
równolegle do rezystora). Na resecie napięcie też narastało
powoli. Procek za każdym razem prawidłowo startuje.
(uĹźywam 32UC3B0256).

Quoted text here. Click to load it

Po testach z AT91SAM7S64 doszukałem się w PDFie takiego zdania:

"During startup, core supply voltage (VDDCORE) slope must be superior or
equal to 6V/ms."

Oczywiście już po tym jak gotowy prototyp i brałem się za jego
oprogramowanie :)

SM

Re: AVR32 - jak ruszyc z tym prockiem
SM pisze:

Quoted text here. Click to load it

No to pościgaj się z gcc. Duet kompilator+optymalizator potrafi czasami
tak wymyślić sekwencję instrukcji, dodatkowo ze zmienioną kolejnością,
że w ASM musiałbyś długo siedzieć i kombinować, czy W OGÓLE da się to
napisać jeszcze optymalniej. A biorąc pod uwagę czas zużyty na pisanie
programu (czyli kasa w firmie na to wydana) - to ASM jest kompletnie
nieopłacalny. Dolicz jeszcze czas usuwania błędów z tysięcy linii kodu w
asemblerze, brrrr.

--
Adam Dybkowski
        http://dybkowski.net /

We've slightly trimmed the long signature. Click to see the full one.
Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

No to może trochę się nim pobawie. Tak z ciekawości zobaczę jaki kod
mu wyjdzie z włączona na maksa optymalizacją. Tym bardziej że muszę
napisać sobie obsługę USB-CDC w ASMie. Raz już pisałem dla
SAM7S, teraz muszę ją przepisać na AVR32. Zobacze jak to wyjdzie w ASM
i GCC.

Quoted text here. Click to load it

Mam taką metodę pisania programów że błędy raczej mi się nie zdarzają,
więc ASM to nie problem.

SM

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Mam zrobione USB CDC więc mogę podać "wyniki":

Całość w ASMie i jednej pętli. Program wygląda tak:

Na starcie:
   Inicjalizacja procka (flahs, clock,...).
   Inicjalizacja timera 0 (i przerwań).
   Inicjalizacja USART.
   Inicjalizacja USB.

W głównej pętli:
   Obsługa USART
   Obsługa USB

Program to co odbierze na USB wysyła na USART, to co
odbierze na USART wysyła na USB.

Poza główną pętla obsługa przerwania od timera 0 co 1ms
(tak dla celów testowo-poznawczych przerwań)

Całość (razem ze strukturami USB) zajęła mi 1920 bajtów.

SM

Re: AVR32 - jak ruszyc z tym prockiem
SM pisze:

Quoted text here. Click to load it

No to teraz przerób główną pętlę na przerwania aby program mógł robić
też coś pożytecznego. Bo zniżenie całego procka AVR32 do roli konwertera
USB-RS232 to dla niego zniewaga. :)

--
Adam Dybkowski
        http://dybkowski.net /

We've slightly trimmed the long signature. Click to see the full one.
Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Oczywiście nie ma sprawy, aby wrzucić to w przerwanie czy też
obsłuĹźyć na dodatkowym tasku,  ale ja właśnie mam potrzebę
aby główna pętla zajmowała się "mniej ważnymi" operacjami
(jak np. transmisja z USB), a najważniejsza część programu
będzie wywoływana co dokładnie odmierzany czas - czyli przerwaniu.

Przygotowałem sobie także "środowisko" aby pisać soft
na procka w C+ASM. Korzystam z edytora ConTEXT i
środowiska GCC.

Te AVR32 spodobały mi się na tyle, że chyba dłużej przy nich
zabawię. Przyznaję że wzięła mnie już ochota na stworzenie
własnego środowiska i kompilatora dla niego. No chyba że
zagłębie się w źródła gcc i go przerobię tak, aby
generował kod wynikowy bardziej podobny do sposobu w jaki
pisze w asm-ie (chodzi mi przede wszystkim o sposĂłb
dostępo do zmiennych globalnych w SRAM. Kompilator
używa lddpc, a ja zwykłego ld i adresowanie pośrednie
z przesunięciem - poświęcam na to jeden rejestr r7.
adresuję r7[adres_zmiennej] - offset jest 16bit więc
wystarcza na całe 32KB SRAM. No chyba że jest jakaś
opcja gcc która coś takiego potrafi wymusić).
Jeszcze się trochę przyjrzę jaki kod generuje gcc.

Ale same AVR32 zaczynają mi się niezmiernie podobać.
Mam pomysł na większy (jak sądzę bardzo ciekawy)
projekt, ale muszę gdzieś dorwać kilka AT32UC3A3128
w jakiejś rozsądnej cenie.

Pozdrawiam,
   SM

Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Oczywiście nie ma sprawy, aby wrzucić to w przerwanie czy też
obsłuĹźyć na dodatkowym tasku,  ale ja właśnie mam potrzebę
aby główna pętla zajmowała się "mniej ważnymi" operacjami
(jak np. transmisja z USB), a najważniejsza część programu
będzie wywoływana co dokładnie odmierzany czas - czyli przerwaniu.

Przygotowałem sobie także "środowisko" aby pisać soft
na procka w C+ASM. Korzystam z edytora ConTEXT i
środowiska GCC.

Te AVR32 spodobały mi się na tyle, że chyba dłużej przy nich
zabawię. Przyznaję że wzięła mnie już ochota na stworzenie
własnego środowiska i kompilatora dla niego. No chyba że
zagłębie się w źródła gcc i go przerobię tak, aby
generował kod wynikowy bardziej podobny do sposobu w jaki
pisze w asm-ie (chodzi mi przede wszystkim o sposĂłb
dostępo do zmiennych globalnych w SRAM. Kompilator
używa lddpc, a ja zwykłego ld i adresowanie pośrednie
z przesunięciem - poświęcam na to jeden rejestr r7.
adresuję r7[adres_zmiennej] - offset jest 16bit więc
wystarcza na całe 32KB SRAM. No chyba że jest jakaś
opcja gcc która coś takiego potrafi wymusić).
Jeszcze się trochę przyjrzę jaki kod generuje gcc.

Ale same AVR32 zaczynają mi się niezmiernie podobać.
Mam pomysł na większy (jak sądzę bardzo ciekawy)
projekt, ale muszę gdzieś dorwać kilka AT32UC3A3128
w jakiejś rozsądnej cenie.

Pozdrawiam,
   SM


Re: AVR32 - jak ruszyc z tym prockiem
In the darkest hour on Thu, 19 Nov 2009 08:41:33 +0100,
Quoted text here. Click to load it

Rozmiar nie jest tak istotny, jak czas, który zajęło pisanie.

--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:223B ]
[ 19:41:16 user up 12266 days,  7:36,  1 user, load average: 0.97, 0.71, 0.02 ]

We've slightly trimmed the long signature. Click to see the full one.
Re: AVR32 - jak ruszyc z tym prockiem
Quoted text here. Click to load it

Rozgryzanie procka - 3dni.
USB-CDC - 2dni.

Więc pryszcz, biorąc pod uwagę to że będę używał tej samej
mojej procedury USB-CDC w wielu projektach.

Cała obsługa USB-CDC jest niewielka - 460 linii. Pisania
dużo nie było. Gorzej z rozgryzaniem procka.

W wolnej chwili zrobię mu test szybkości. Zakupiłem
DAC stereo 16bit i zobaczę czy wyrobi się w roli
syntezatora FM (emulacja Yamahy DX-7). Jak da radę
z polifonią przynajmniej 8 to robię sobie kompletny
syntezator na dwĂłch AVR32 i SDRAMie.

SM

Re: AVR32 - jak ruszyc z tym prockiem
AK pisze:
Quoted text here. Click to load it

Niestety wszystko w C.

SM

Re: AVR32 - jak ruszyc z tym prockiem
...walczę dalej

wyczytałem że BatchISP:
- kasuje flash pomijając bootloader
- programuje flash nadpisując bootloader
więc trzeba go dołączyć do swojego programu.

zgrałem go więc (flash od adresu 0x80000000 do 0x80001FFF) dołączyłem
jak BIN do swojego źródła - nie działa:

    .equ    GPIO_BASE, 0xFFFF1000
    .equ    GPIO_GPERS, 0x04
    .equ    GPIO_ODERS, 0x44
    .equ    GPIO_OVRS, 0x54

    .macro    mov.w    rd, imm
    mov    \rd, LO(\imm)
    orh    \rd, HI(\imm)
    .endm

    .text

    .global    _start

_start:
    .incbin    "isp.bin"    // 8192bytes (saved flash from 0x0000 to 0x1FFF)

program_start:
    mov.w    R0, GPIO_BASE

    mov.w    R1, (1 << 3)
    st.w    R0[GPIO_GPERS], R1

    mov.w    R1, (1 << 3)
    st.w    R0[GPIO_ODERS], R1

    mov.w    R1, (0 << 3)
    st.w    R0[GPIO_OVRS], R1

always:
    rjmp    always

_stop:

zgrałem jeszcze raz pomijając dwa pierwsze bajty i wstawiając tam
"trampoline" - nie działa:

    .equ    GPIO_BASE, 0xFFFF1000
    .equ    GPIO_GPERS, 0x04
    .equ    GPIO_ODERS, 0x44
    .equ    GPIO_OVRS, 0x54

    .macro    mov.w    rd, imm
    mov    \rd, LO(\imm)
    orh    \rd, HI(\imm)
    .endm

    .text

    .global    _start

_start:
    rjmp    program_start

    .incbin    "isp.bin"    // 8190bytes (saved flash from 0x0002 to 0x1FFF)

program_start:
    mov.w    R0, GPIO_BASE

    mov.w    R1, (1 << 3)
    st.w    R0[GPIO_GPERS], R1

    mov.w    R1, (1 << 3)
    st.w    R0[GPIO_ODERS], R1

    mov.w    R1, (0 << 3)
    st.w    R0[GPIO_OVRS], R1

always:
    rjmp    always

_stop:

asemblacja:
avr32-as.exe -R -march=ucr1 -o main.out main.s

linkowanie:
avr32-ld.exe --oformat ihex -m avr32elf_uc3b0256 -Ttext 0x80000000 -Tbss
0x00000000 -o main.hex main.out

programowanie:
batchisp -device at32uc3b0256 -hardware usb -operation erase f memory
flash blankcheck loadbuffer main.hex program verify start reset 0

BatchISP pisze że programuje, weryfikuje, wszystko OK, a i tak
pin PA3 nie chce przyjąć poziomu niskiego. (Pomijam już to, że
flash jest od 80000000 a BatchISP wszystko pokazuje od 0).
Generuje plik HEX od 80002000, BatchISP i tak ładuje od 0.
No i teraz nie wiem co właściwie to zero oznacza. Ale gówno.

No to zabrałem się za prosty przykład z AVR Studio - sterowanie wyjście.
Załadowałem. Działa. Chciałem podejrzeć co gdzie sie ładuje.
Przerabiam ELF na HEX poprzez ObjCopy - wywala błąd!


Ale syf. Powoli wymiękam. Robiłem już na chyba 8 różnych rodzinach
procków (od 8bit do ARMów) ale takiego problemu z uruchomieniem
to jeszcze nie miałem!

SM

Re: AVR32 - jak ruszyc z tym prockiem

MAM! DZIAŁA!

Dla zainteresowanych podaję przepis na uruchomienie AT32UC3B0256
bez całego zbędnego "bagażu".

1. Programem BatchISP zgrać bootloader (potrzebny gdy programujemy
używając BatchISP poprzez USB - zawsze zadeptuje bootloader nie
uwzględniając adresów ładowania):

batchisp -device at32uc3b0256 -hardware usb -operation erase f memory
flash addrange 0x0 0x01FFF read savebuffer "C:\isp.hex" hex386

2. Programem Hex2Bin przerobić "isp.hex" na "isp.bin"

3. Napisać prosty program, np. taki jak poniżej (generowanie
przebiegu prostokątnego na PA3): Zapisać pod nazwą "main.s".

    .equ    GPIO_BASE, 0xFFFF1000
    .equ    GPIO_GPERS, 0x04
    .equ    GPIO_ODERS, 0x44
    .equ    GPIO_OVR, 0x50

    .text

    .global    _start

_start:
    .incbin    "isp.bin"

program_start:
    
    // init

    mov    R0, LO(GPIO_BASE)
    orh    R0, HI(GPIO_BASE)
    mov    R1, (1 << 3)
    st.w    R0[GPIO_GPERS], R1
    mov    R1, (1 << 3)
    st.w    R0[GPIO_ODERS], R1

    // pętla

main_loop:

    // zerowanie PA3

    mov    R1, (0 << 3)
    st.w    R0[GPIO_OVR], R1

    // opóźnienie

    mov    R2, 1000
del1:    sub    R2, R2, 1
    brne    del1

    // ustawienie PA3

    mov    R1, (1 << 3)
    st.w    R0[GPIO_OVR], R1

    // opóźnienie

    mov    R2, 1000
del2:    sub    R2, R2, 1
    brne    del2

    // powrót do pętli

    rjmp    main_loop

_stop:

4. Asemblacja poprzez:

avr32-as.exe -R -march=ucr1 -o main.out main.s

5. Linkowanie poprzez:

avr32-ld.exe --oformat ihex -m avr32elf_uc3b0256 -Ttext 0x80000000 -Tbss
0x00000000 -o main.hex main.out

6. Ładowanie do procka poprzez:

batchisp -device at32uc3b0256 -hardware usb -operation erase f memory
flash blankcheck loadbuffer main.hex program verify start reset 0

Po załadowaniu program sam się uruchomi. Będzie się także uruchamiał
po resecie. Aby znów zaprogramować procek należy zewrzeć do masy
PA13 i zresetować go - wejdzie do bootloadera (programowania ISP
poprzez USB).

SM

Re: AVR32 - jak ruszyc z tym prockiem
Znowu trochę posiedziałem nad prockiem.
Ale masakra.
Chyba z żadnym prockiem nie miałem tyle
kombinowania (chociażby ze samą strukturą
programu że asembler i linker poprawnie
przygotowali dane do ładowania do procka).
Skonfigurowałem procka, ruszyłem przerwania
na timerze.

Wszystko lekko rąbnięte przez sam fakt, że
Atmel dał flash od adresu 0x80000000 a to
w integer jest liczba ujemna! Asembler
głupieje przy bezpośrednim ustawieniu
sekcji org na ten adres, bo dla niego to
liczba ujemna i stwierdza że kompilacja
odbywa się w ujemną stronę. Trzeba więc
robić offset w linkerze. Ale tu kolejny
zgrzyt bo stałe zdefiniowane jako różnica
adresów wychodzą wtedy Linkerowi błędnie
(np. offset autoprzerwania względem EVBA).

Ostatecznie rozwiązałem to tak:

//
===========================================================================
//    Start of data memory.
//
===========================================================================

    .section    .bss, "", @nobits
    .org    0

stack_beg:
    .skip    256
stack_end:

//
===========================================================================
//    Start of program memory.
//
===========================================================================

    .section    .text, "ax", @progbits

    .global    _start

_start:
    .incbin    "isp.bin"    // original bootloader saved from flash memory

//
===========================================================================
//    Ints vectors.
//
===========================================================================

StartEVBA:

program_begin:
    rjmp    program_start

    rjmp    Int0Handler
    rjmp    Int1Handler
    rjmp    Int2Handler
    rjmp    Int3Handler

    .equ    Int0Offset, 4 >> 1
    .equ    Int1Offset, 8 >> 1
    .equ    Int2Offset, 12 >> 1
    .equ    Int3Offset, 16 >> 1

//
===========================================================================
//    Timer 0 interrupt.
//
===========================================================================

Int0Handler:

    // reset int flag

    mov.w    r8, TC0_BASE
    ld.w    r9, r8[TC_SR]

    // change PA3 pin

    mov.w    r8, LBM_BASE
    mov    r9, (1 << 3)
    st.w    r8[LBM_OVR0T], r9

    // int exit

    rete

//
===========================================================================
//    Program start.
//
===========================================================================

program_start:

// ---    stack

    mov.w    sp, stack_end

****************************************************************************

i ustawiam:

    // set EVBA pointer

    mov.w    r0, StartEVBA
    mtsr    SYSREG_EVBA, r0

    // set autovector offset for group 14

    mov.w    r0, INTC_BASE
    mov.w    r1, Int0Offset
    st.w    r0[INTC_IPR0 + 4*14], r1

i oczywiście wszystko działa, ale ile musiałem czasu stracić
żeby coś tak prostego zrobić.

Nie mogli dać flasha od 0x40000000. Przeciez mieliby wtedy 1GB
na rozbudowę RAM i 1GB (minus rejestry) na FLASH.

SM

Site Timeline