MoonWolf
Guest
Thu Mar 18, 2004 5:02 pm
Mam problem z ATtiny 12 i 15. Taki program:
#include <avr/io.h>
..global main
main:
ldi R16, 0xFF
out DDRB, R16
out PORTB, R16
rjmp main
asembluje sie (uzywam avr-gcc), daje sie zaprogramowac (Ponyprog i nie
tylko), odczytac z pamieci, itp. Ale procek nie dziala - wyglada jakby byl
na resecie, porty sa niepodbitymi wejsciami. CKSEL (w 15) to 1101, reset
jako reset. Nie mam juz pomyslu co robie zle...
--
Over And Out
MoonWolf, [Dark Jedi] Dark Follower
http://www.karakkhaz.prv.pl <:> moonwolf@polbox.com
This is the face that stones you cold
Adam Dybkowski
Guest
Thu Mar 18, 2004 5:19 pm
MoonWolf wrote:
Quote:
ldi R16, 0xFF
out DDRB, R16
out PORTB, R16
asembluje sie (uzywam avr-gcc), daje sie zaprogramowac (Ponyprog i nie
tylko), odczytac z pamieci, itp. Ale procek nie dziala - wyglada jakby byl
na resecie, porty sa niepodbitymi wejsciami. CKSEL (w 15) to 1101, reset
jako reset. Nie mam juz pomyslu co robie zle...
A jak stwierdzasz, ze nie dziala? Powyzsza sekwencja instrukcji ustawia
PORTB jako wyjscia w stanie wysokim - moze nie umiesz odroznic tego od
stanu po resecie (Hi-Z)?
Napisz program migajacy na przemian tym portem - wynik zobaczysz na
oscyloskopie. Albo jako polowe VCC w multimetrze.
--
Adam Dybkowski
adybkows@amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/
Waldemar Krzok
Guest
Thu Mar 18, 2004 5:20 pm
MoonWolf:
Quote:
Mam problem z ATtiny 12 i 15. Taki program:
#include <avr/io.h
.global main
main:
ldi R16, 0xFF
out DDRB, R16
out PORTB, R16
rjmp main
asembluje sie (uzywam avr-gcc), daje sie zaprogramowac (Ponyprog i nie
tylko), odczytac z pamieci, itp. Ale procek nie dziala - wyglada jakby byl
na resecie, porty sa niepodbitymi wejsciami. CKSEL (w 15) to 1101, reset
jako reset. Nie mam juz pomyslu co robie zle...
tak z ciekawości: fusy poustawiałeś poprawnie? Konkretnie zegar. Bo też
miałem: program nie chciał chodzić i okazało się, że fusa miałem na
zegar zewnętrzny, a potrzebowałem wewnętrznego. No i reset też by się
przydał (RC wystarczy). Aha, a wektory przerwań gdzieś masz? Bo ja mam
na początku programu dla świętego spokoju coś takiego:
..CSEG
..org 0
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
rjmp RESET
RESET:
ser R16 ; krócej niż ldi R16,0xFF
out DDRB,R16 ; set port B to output
.....
Waldek
Adam Dybkowski
Guest
Fri Mar 19, 2004 5:35 am
Waldemar Krzok wrote:
Quote:
ser R16 ; krócej niż ldi R16,0xFF
Tu bym się spierał. Obie instrukcje tyle samo trwają cykli zegara (1) i
tyle samo zajmują kodu (1 słowo). A jeżeli będzie trzeba kiedyś jeden
bicik w powyższym zmienić na zero - dużo lepiej od razu napisać ldi.
Poza tym podanie explicite wpisywanej wartości jest znacznie
czytelniejsze niż "ser".
--
Adam Dybkowski
adybkows@amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/
Waldemar Krzok
Guest
Fri Mar 19, 2004 4:31 pm
Adam Dybkowski:
Quote:
Waldemar Krzok wrote:
ser R16 ; krócej niż ldi R16,0xFF
Tu bym się spierał. Obie instrukcje tyle samo trwają cykli zegara (1) i
tyle samo zajmują kodu (1 słowo). A jeżeli będzie trzeba kiedyś jeden
bicik w powyższym zmienić na zero - dużo lepiej od razu napisać ldi.
Poza tym podanie explicite wpisywanej wartości jest znacznie
czytelniejsze niż "ser".
ja tam lubię ser ;-)
Waldek
MoonWolf
Guest
Sat Mar 20, 2004 8:16 am
Adam Dybkowski denied rebel lies:
Quote:
A jak stwierdzasz, ze nie dziala? Powyzsza sekwencja instrukcji ustawia
PORTB jako wyjscia w stanie wysokim - moze nie umiesz odroznic tego od
stanu po resecie (Hi-Z)?
Mozliwe - nie jestem elektronikiem (
Ale na mierniku mam napiecie rzedu dziesiatych czesci wolta a jak dotkne
palcem to sie zmienia... No i kumpel elektronik tez stwierdzil ze nie
dziala (
Quote:
Napisz program migajacy na przemian tym portem - wynik zobaczysz na
oscyloskopie. Albo jako polowe VCC w multimetrze.
Od tego zaczalem (Standardowy Program: Mrugajaca Diodka v0.0.0 (TM). Ale
jak nie zadzialalo to zrobilem to co wyzej. I lipa. Nawet myslalem, ze
procek walniety, ale mam kilka tiny12 i tiny15. Gdyby to o 12 chodzilo, to
podejrzewalbym, ze nie umiem ustawic FUSEs. No ale 15 nie da sie na
zewnetrznego kwarca ustawic, wiec juz nic nie wiem. Tym bardziej, ze
praktycznie identyczny programik (od mrugajacej diodki) dzialal na
mega8535.
--
Over And Out
MoonWolf, [Dark Jedi] Dark Follower
http://www.karakkhaz.prv.pl <:> moonwolf@polbox.com
Here kitty, kitty, kitty...
MoonWolf
Guest
Sat Mar 20, 2004 8:23 am
Waldemar Krzok denied rebel lies:
Quote:
tak z ciekawości: fusy poustawiałeś poprawnie? Konkretnie zegar. Bo też
miałem: program nie chciał chodzić i okazało się, że fusa miałem na
zegar zewnętrzny, a potrzebowałem wewnętrznego.
Hmm... Chyba nie. Za to resety powyłączałem we wszystkich (

. Ale mam
programator równoległy i je poprzestwiałem z powrotem. A 15 to AFAIR nie
da się na zewnętrzny ustawić?
BTW: z kwarcem zewnętrznym też nie działało...
No i daje się programować - znaczy procek chodzi :/
Quote:
No i reset też by się
przydał (RC wystarczy).
Hmm... To może przez to - ostatnia moja nadzieja...
Quote:
Aha, a wektory przerwań gdzieś masz? Bo ja mam
na początku programu dla świętego spokoju coś takiego:
[...]
avr-gcc sam sobie ustawia (w trochę pokręcony sposób) te wektory.
Quote:
RESET:
ser R16 ; krócej niż ldi R16,0xFF
Ale asembluje się do ldi r16, 0xFF - tak przynajmniej wynika z pliku
listingu (:)
Kurczę, przez taką pierdkę leży projekt już od miesiąca, po necie szukam i
nic :/
No nic, idę się dokumentacji na pamięć uczyć - jakieś rozwiązanie musi
przecież być?
--
Over And Out
MoonWolf, [Dark Jedi] Dark Follower
http://www.karakkhaz.prv.pl <:> moonwolf@polbox.com
The taste of leather on your lips
Artur Lipowski
Guest
Mon Mar 22, 2004 3:45 pm
MoonWolf wrote:
Quote:
Waldemar Krzok denied rebel lies:
Aha, a wektory przerwań gdzieś masz? Bo ja mam
na początku programu dla świętego spokoju coś takiego:
avr-gcc sam sobie ustawia (w trochę pokręcony sposób) te wektory.
avr-gcc nie ustawia wektorów przerwań. Jeżeli już to robi to avr-libc.
Ale dla takiego procka jak tiny12 to sam musisz się o to martwić, np. dając:
.section .text
rjmp main ; reset
rjmp _hang_on_ ; IRQ0
rjmp _hang_on_ ; pin change
rjmp _overflow0_ ; timer0 overflow
rjmp _hang_on_ ; EEPOM ready
rjmp _hang_on_ ; analog comparator
_hang_on_:
rjmp _hang_on_
BTW> Jeżeli juz używasz gnu to warto przyjąc konvencję "sięgania" do
portów taką jak w avr-libc np.:
sbi _SFR_IO_ADDR(ACSR), ACD
out _SFR_IO_ADDR(DDRB), work
Pozdrawiam,
--
Artur Lipowski