Problemy z uruchomieniem przetwornika AC i funkcji przerwania w AVR-GCC

[AVR-GCC] przetwornik AC





Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 15:49:55 +0200


Witam niżej zamieszczem kod programu który przynajmniej teoretycznie miał
uruchomić przetwornik AC w trybie single conversion mode niestety nie
wygląda to tak jak miało ;) a miało wyglądać tak: Stworzyłem sobie funkcje
przerwania SIGNAL(SIG_ADC) ta funkcja powinna się uruchamiać po każdej
konwersji, niestety nie uruchamia się ani razu, jej uruchomienie spowodowało
by zapalenie się diody na czas 0,5s. Konwersje uruchamiają linijki kodu:

outp(0,ADMUX);
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);
sei();

Przepisałem je słowo w słowo z przykładu z dokumentacji AVR_GCC według mnie
program ten powinien działać ale jakoś tego nie widzę ;). Niżej zamieszczam
kompletny program który nie działa. Co więcej zauważyłem że po komędzie
sei(); program tak jakby nie powracał z przerwania bo jeśli po tej komędzie
chce mignąć raz diodą czyli diode(1) to dioda zapala się ale nie gaśnie !!!
także coś tu jest naburaczone ;( a funkcja mrugania jest na pewno dobra bo
mrugałem nią nie raz ;) także coś tu jest nie tak. Proszę o pomoc.
Pozdrawiam

#define __AVR_ATmega8__ ;
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void diode(int im);
void sleep(int ms);

SIGNAL(SIG_ADC)
{
diode(1);
}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}


int main(void)
{

outp(0,ADMUX);
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);
sei();

// diode(1) jeśli tu wywołam tą funkcje to działa nieprawidłowo (dioda
zapala się ale nie gaśnie a powinna zgasnąć po 0,5s). Opisywany przypadek
jednak zakłada że nie ma tu tej instrukcji wtedy dioda w ogóle się nie
zapala a powinna bo funkcja diode(1) wywoływana jest w funkcji przerwania.

while(1);

return(0);
}



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_Sok=F3=B3?= <el_es_at_nospam_p0cz74.0n37.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 17:20:37 +0200


Użytkownik BT napisał:

SIGNAL(SIG_ADC)
{
diode(1);
}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}


Wyciąłem co nieco...
ale powiedz: wychodzi z tego, że w przerwaniu zatrzymujesz wykonywanie
programu na 0.5s ? A watchdoga nie wyłączyłeś? Ogólnie: NIE wolno w
procedurze obsługi przerwania dawać żadnych sleep'ow (to nie system
operacyjny w ktorym sleep() oddaje do niego kontrolę ;) )
Ja bym zrobił to tak:

int diode_is_on(void)
{
// wczytaj ten bit na ktorym dioda wisi - nie mam manuala pod reka

}

void diode_on(void)
{
sbi(DDRD,4);
cbi(PORTD,4);
}

void diode_off(void)
{
sbi(DDRD,4);
sbi(PORTD,4);
}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

SIGNAL(SIG_ADC)
{
if (!diode_is_on) diode_on;
}

int main(void)
{

outp(0,ADMUX);
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);
sei();

int i;

while(1)
{
if (!diode_is_on) i=50;
if (i==0) diode_off;
i--;
// tu reset WD
sleep(10);
};

}

Czyli jak się program gdzieś wykrzaczy, to nie wróci do main i nastąpi
reset.
TO nie jest precyzyjny ;J pomiar czasu, jeśli chcesz precyzji to musisz
wykorzystac timer.
Nie mam pod ręką mana do gcc, ale ja bym tak to napisał :J

--
eL eS

========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 19:59:30 +0200




Wyciąłem co nieco...
ale powiedz: wychodzi z tego, że w przerwaniu zatrzymujesz wykonywanie
programu na 0.5s ? A watchdoga nie wyłączyłeś? Ogólnie: NIE wolno w
procedurze obsługi przerwania dawać żadnych sleep'ow (to nie system
operacyjny w ktorym sleep() oddaje do niego kontrolę ;) )
Ja bym zrobił to tak:

Pewnie masz racje ;) i sleep() trwający w przerwaniu przez 0,5 to nie jest
za rozsądne rozwiązanie, nie zwróciłem na to uwagi ;). W każdym razie
poprzeni przykład miał na celu pokazanie czegoś innego niżej zamieszczam
przykład numer 2 który też irracjonalnie się zachowuje. Przejawia się to tym
że dioda cały czas jest zapalona a powinna mrugnąć na 0,5s. W przerwaniu
dałem teraz jakąś instrukcje, która nie ma nic wspólnego z mruganiem diody
ale pokazuje to że coś jest nie tak ;( a watchdoga nie używam i o ile jest
on standardowo wyłączony w ATmega8 to ja go nie włączałem.

#define __AVR_ATmega8__ ;
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void diode(int im);
void sleep(int ms);

SIGNAL(SIG_ADC)
{
sbi(DDRD,5); // Jakaś przykładowa instrukcja, na potrzeby przykładu.
}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}


int main(void)
{

outp(0,ADMUX);
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);
sei(); //jeśli wytnę z kodu sei() to dioda mrugnie
jeden raz, jeśli sei() jest to dioda cały czas świeci !

diode(1);

while(1);

return(0);
}



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 20:33:09 +0200


Dnia czw 10. czerwca 2004 19:59 BT napisał(a):
void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}

1. Co zapala diodę: cbi czy sbi? Tzn. czy podpiąłeś anodą czy katodą do
portu?
2. Brakuje mi opóźnienia na sbi, żeby dioda miała mrugać im razy.

--
Marcin Stanisz

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 20:48:40 +0200



"Marcin Stanisz" <mstanisz_at_nospam_poczta.bzdury.onet.pl> wrote in message
news:1530972.j28rKM5jXC_at_nospam_cita...
Dnia czw 10. czerwca 2004 19:59 BT napisał(a):
void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}

1. Co zapala diodę: cbi czy sbi? Tzn. czy podpiąłeś anodą czy katodą do
portu?
2. Brakuje mi opóźnienia na sbi, żeby dioda miała mrugać im razy.

Dioda jest podpięta do zasilania także zapala ją cbi. Funkcja mrugania jest
dobra jako jej parametr nie podaje się ilośći mrugnięć a czas mrugnięcia.
Wiem że funkcja jest trochę namotana, przerobiłęm ją na prędce z funkcji
która właśnie mrugała x razy diodą.



========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.task.gda.pl!newsfeed00.sul.t-online.de!newsmm00.sul.t-online.de!t-online.de!news.t-online.com!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Waldemar Krzok <waldemar.krzok_at_nospam_t-online.de>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 21:16:51 +0200


BT wrote:

void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}

1. Co zapala diodę: cbi czy sbi? Tzn. czy podpiąłeś anodą czy katodą do
portu?
2. Brakuje mi opóźnienia na sbi, żeby dioda miała mrugać im razy.

Dioda jest podpięta do zasilania także zapala ją cbi. Funkcja mrugania
jest dobra jako jej parametr nie podaje się ilośći mrugnięć a czas
mrugnięcia. Wiem że funkcja jest trochę namotana, przerobiłęm ją na prędce
z funkcji która właśnie mrugała x razy diodą.

hmm, mój mózgowy kompilator i egzekutor zapala diodę na 0.5 sekundy
następnie wyłącza na ok. 500ns (zależy od taktu), a następnie znowu ją
załącza. Nie wierzę, że uda ci się wyłączyć LEDa bezproblemowo na 500ns.
Czyli dioda świeci się cięgiem.

Waldek


========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.atman.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 21:31:44 +0200



void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--)
{
cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
}

cbi(DDRD,4);
}

hmm, mój mózgowy kompilator i egzekutor zapala diodę na 0.5 sekundy
następnie wyłącza na ok. 500ns (zależy od taktu), a następnie znowu ją
załącza. Nie wierzę, że uda ci się wyłączyć LEDa bezproblemowo na 500ns.
Czyli dioda świeci się cięgiem.

Nie nie nie ;-) to nie o to chodzi popatrzcie gdzie jest wywołanie tej
funkcji diode(1) jest na samym końcu programu zaraz przed while(1). Także
wywołanie tej funkcji powinno zapalić diode na 500ns a później ją zgasić i
wejść w niekończącą się pętle while(1). I wtedy dioda powinna być zgaszona
na wieki tymczasem jak odpalę przerwanie czyli wydam komęde sei() to dioda
świeci wiecznie. Coś tu jest poprostu nie tak z przerwaniami. Zaraz
sprawdzę czy z innymi przerwaniami też jest coś nie w porządku czy tylko z
ADC



========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 21:52:30 +0200


Ha a co ciekawe sprawdziłem niemal że identyczny kod jeśli chodzi o timer0 i
wszystko ładnie działa dioda mruga dokładnie jeden raz instrukcje które są
wewnątrz SIGNAL(SIG_OVERFLOW0) też się wykonują prawidłowo. Także problem
dotyczy chyba tylko przerwania ADC i niestety nie wiem o co chodzi ;(


#define __AVR_ATmega8__ ;
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void diode(void);
void sleep(int ms);

SIGNAL(SIG_OVERFLOW0)
{
sbi(DDRD,5); // przykładowa instrukcja która tym razem się wykonuje
}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode()
{
sbi(DDRD,4);

cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);

cbi(DDRD,4);
}


int main(void)
{

outp((1<<TOIE0),TIMSK);
outp(0,TCNT0);
outp(5,TCCR0);

sei();
diode();

while(1);
return(0);
}



========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.onet.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: =?ISO-8859-2?Q?=A3ukasz_Sok=F3=B3?= <el_es_at_nospam_p0cz74.0n37.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 22:01:11 +0200


Użytkownik BT napisał:
hmm, mój mózgowy kompilator i egzekutor zapala diode^ na 0.5 sekundy
naste^pnie wy^(3)?cza na ok. 500ns (zale?y od taktu), a naste^pnie znowu j?
za^(3)?cza. Nie wierze^, ?e uda ci sie^ wy^(3)?czy? LEDa bezproblemowo na 500ns.
Czyli dioda ?wieci sie^ cie^giem.


Nie nie nie ;-) to nie o to chodzi popatrzcie gdzie jest wywo^(3)anie tej
funkcji diode(1) jest na samym kon~cu programu zaraz przed while(1). Tak?e
wywo^(3)anie tej funkcji powinno zapali? diode na 500ns a pó1/4niej j? zgasi? i
wej?? w niekon~cz?c? sie^ pe^tle while(1). I wtedy dioda powinna by? zgaszona
na wieki tymczasem jak odpale^ przerwanie czyli wydam kome^de sei() to dioda
?wieci wiecznie. Co? tu jest poprostu nie tak z przerwaniami. Zaraz
sprawdze^ czy z innymi przerwaniami te? jest co? nie w porz?dku czy tylko z
ADC


Pan Krzok ma rację !!!
(że też sam na to nie wpadłem wcześniej...)

>>>>>void diode(int im)
>>>>>{
>>>>> sbi(DDRD,4);
>>>>>
>>>>> for (;im!=0;im--) / od tego miejsca powtóż (im) razy
>>>>> {
>>>>> cbi(PORTD,4); / zaswiec
>>>>> sleep(500); / poczekaj 500ms
>>>>> sbi(PORTD,4); / zgas
>>>>> } / do tego miejsca
>>>>>
>>>>> cbi(DDRD,4);
>>>>>}
zgadza się ?

eL eS

========
Path: news-archive.icm.edu.pl!mat.uni.torun.pl!news.man.torun.pl!news2.icm.edu.pl!newsfeed.atman.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 22:22:57 +0200



Pan Krzok ma rację !!!
(że też sam na to nie wpadłem wcześniej...)

void diode(int im)
{
sbi(DDRD,4);

for (;im!=0;im--) / od tego miejsca powtóż (im) razy
{
cbi(PORTD,4); / zaswiec
sleep(500); / poczekaj 500ms
sbi(PORTD,4); / zgas
} / do tego miejsca

cbi(DDRD,4);
}
zgadza się ?

Nie o to chodzi ;-) ja wiem o co wam chodzi Waldkowi ale to nie to, problem
w ogole nie dotyczy tego kawałka kodu dlateog niżej zamieszcam kolejny
przykład który też nie działa. Bo dioda cały czas się świeci ;(

#define __AVR_ATmega8__ ;
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

void diode(void);
void sleep(int ms);

SIGNAL(SIG_ADC)
{

}

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode()
{
sbi(DDRD,4);

cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
sleep(500);

cbi(DDRD,4);
}


int main(void)
{
outp(0,ADMUX);
outp((1<<ADEN) | (1<<ADSC) | (1<<ADIF) | (1<<ADIE),ADCSR);

sei(); // Jak wytnę sei() to dioda mrugnie jeden raz a jak sei() jest to
dioda świeci się cały czas ;( już mnie to wku.........

diode();
while(1);
return(0);
}

Teraz chyba nie powiecie że coś jest nie tak w kodzie. Bo tak jak mówiłem
sprawdzałem prawie że identyczny kod z Timer0 i dioda poprostu mrugneła a
tutaj świeci się cały czas. Jest to bez sensu zwłaszcza że wywołanie funkcji
diode jest na samym końcu. Wydaje mi się że to jest tak że rozpoczęta
konwersja nie może się zakończyć ablo coś w tym stylu i program resetuje się
i zaczyna wszystko od nowa nigdy nie dochodząc do momętu wyłączenia diody.
Już zaczynam podejrzewać jakąś usterkę ADC w uC, albo jakiś błąd w AVR-GCC
no bo co to może jeszcze być ?



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 22:43:00 +0200


Dnia czw 10. czerwca 2004 22:22 BT napisał(a):

sei(); // Jak wytnę sei() to dioda mrugnie jeden raz a jak sei() jest to
dioda świeci się cały czas ;( już mnie to wku.........

Nie denerwuj się. Urzekła mnie twoja historia ;-) i od jakiegoś czasu
wpatruję się w twój kod, ale na razie nic nie wypatrzyłem. Zaraz wrzucę w
gcc i popatrzymy na kod wynikowy.

wyłączenia diody. Już zaczynam podejrzewać jakąś usterkę ADC w uC, albo
jakiś błąd w AVR-GCC no bo co to może jeszcze być ?

Jeśli podejrzewasz przetwornik, możesz spróbować odczytu bez przewań, tzn.:

ADMUX = 0; //0x00 - nap. odniesienia: AVCC, PRZETW. KAN. 0

cli();
ADCSR|=_BV(ADSC); //poczatek konwersji
while((ADCSR&(_BV(ADSC)))); //poczekaj na wynik

I tu wstaw sobie mrugnięcie.

Pozdrawiam

--
Marcin Stanisz

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.onet.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Thu, 10 Jun 2004 23:43:31 +0200


Dnia czw 10. czerwca 2004 22:43 Marcin Stanisz napisał(a):
<ciach>

Szczerze mówiąc to skompilowało i kod wynikowy nie zawiera jakichś
oczywistych zonków :-(

Wektor przerwań dobrze ustawiony:
1c: 1f c0 rjmp .+62 ; 0x5c
[...]

0000005c < _vector14>:

SIGNAL(SIG_ADC)
{
5c: 1f 92 push r1
5e: 0f 92 push r0
60: 0f b6 in r0, 0x3f ; 63
62: 0f 92 push r0
64: 11 24 eor r1, r1
66: 0f 90 pop r0
68: 0f be out 0x3f, r0 ; 63
6a: 0f 90 pop r0
6c: 1f 90 pop r1
6e: 18 95 reti
}

[...]

0000009e <main>:

int main(void)
{
9e: cf e5 ldi r28, 0x5F ; 95
a0: d4 e0 ldi r29, 0x04 ; 4
a2: de bf out 0x3e, r29 ; 62
a4: cd bf out 0x3d, r28 ; 61
outp(0,ADMUX);
a6: 17 b8 out 0x07, r1 ; 7
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);
a8: 88 ed ldi r24, 0xD8 ; 216
aa: 86 b9 out 0x06, r24 ; 6

sei();
ac: 78 94 sei

diode();
ae: ec df rcall .-40 ; 0x88
while(1);
b0: ff cf rjmp .-2 ; 0xb0

Czyli w mainie też jakby dobrze. Nie mam, niestety, megi8. Za jakieś 2 dni
będę składał coś na 32, to jeszcze sprawdzę.

Kompilowane:
[mstanisz_at_nospam_cita /]$ avr-gcc -v
Reading specs from /usr/local/avr/lib/gcc-lib/avr/3.3.2/specs
Configured with: ../configure --prefix=/usr/local/avr --target=avr
--enable-languages=c --disable-nls
Thread model: single
gcc version 3.3.2

A twoje gcc w której wersji?

Pozdrawiam i życzę powodzenia

--
Marcin Stanisz

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.internetia.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Fri, 11 Jun 2004 12:37:17 +0200


Hmm dobra ;-) to niżej jest następny program który nie działa. Teraz z diodą
jest wszystko w porządku mruga jeden raz ale nie dostaje żadnego wyniku.
Podpiąłem sobie do kanału 7 czyli do ADC7 (obudowa TQFP) drabinkę
rezystorową i mam na tym wyprowadzeniu 0,5V a przetwornik zwraca mi zawsze
wartość 0 ;( dla obu bajtów HI i LO. Mam do ciebie jeszcze prośbę wysyłam ci
na emaila plik bin tego programu poniżej możesz mi sprawdzić czy u ciebie
skompilowało się to tak samo jak u mnie ?

#define __AVR_ATmega8__ ;
#include <math.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/delay.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include <avr/interrupt.h>

int eposition;

void diode(void);
void sleep(int ms);

void sleep(int ms)
{
for (int l=0;l<ms;l++)
{
delay_loop2(4000);
}
}

void diode()
{
sbi(DDRD,4);

cbi(PORTD,4);
sleep(500);
sbi(PORTD,4);
sleep(500);

cbi(DDRD,4);
}

void debug(char * dstr)
{

int sposition=0;
while(dstr[sposition])
{
eeprom_wb(eposition,dstr[sposition++]);
eposition++;
}
eeprom_wb(eposition++,' ');

}

void debugint(int dint)
{
char *dstr;
char tmp[10];
dstr=itoa(dint,tmp,10);
debug(dstr);
}

int main(void)
{
//outp(7,ADMUX);
ADMUX = 7; //0x00 - nap. odniesienia: AVCC, PRZETW. KAN. 7

cli();
ADCSR|=_BV(ADSC); //poczatek konwersji
while((ADCSR&(_BV(ADSC)))); //poczekaj na wynik

uint8_t a,b;
a=inp(ADCL);
b=inp(ADCH);

debugint(a);
debugint(b);

diode();

while(1);
return(0);
}



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Fri, 11 Jun 2004 14:18:56 +0200


Jeszcze jedno bo zmierzyłem sobie napięcie na nóżce AREF i u mnie wynosi ono
0V czy to jest normalne ? bo wydaje mi się że nie ;( i powinno wynosić 2,5V
albo coś w tym stylu.



========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.ipartners.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: 11 Jun 2004 13:01:00 GMT


W artykule <cac81s$r08$1_at_nospam_nemesis.news.tpi.pl> BT napisal(a):

Jeszcze jedno bo zmierzyłem sobie napięcie na nóżce AREF i u mnie wynosi ono
0V czy to jest normalne ? bo wydaje mi się że nie ;( i powinno wynosić 2,5V
albo coś w tym stylu.

Musisz włączyć wewnętrzne źródło napięcia odniesienia (ca. 2,56V) lub AVCC

Marcin Stanisz
--

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!newsfeed.tpinternet.pl!atlantis.news.tpi.pl!news.tpi.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: "BT" <kurciok_at_nospam_poczta.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Fri, 11 Jun 2004 15:39:10 +0200



Musisz włączyć wewnętrzne źródło napięcia odniesienia (ca. 2,56V) lub AVCC
- patrz w manualu ustawienia rejestru ADMUX.

Marcin Stanisz

Właśnie sobie z tym poradziłem ;) ściąłem jakiś gotowy kod i działa.
Skonfrontowałem go na szybko z manualem ale dalej nie mam pojęcia dlaczego
ADEN w ADCSR musi być ustawiony. ;-) no ale inaczej nie chce działać. Druga
sprawa to oczywiście REFS0 i FERS1 które muszą być ustawione jeśli chce się
korzystać z wewnętrznego źródła odniesienia. Dzięki za pomoc pozdrawiam.

void ADC_init(void)
{
outp((1<<ADEN) | (1<<ADPS2) | (ADPS1), ADCSR);
}

int ADC_getreading(int channel)
{
int temp_valueH;
outp((1<<REFS0)|(1<<REFS1)|(1<<ADLAR), ADMUX);

ADMUX=ADMUX & 0xF8;
ADMUX=ADMUX | channel;
sbi(ADCSR, ADSC);
loop_until_bit_is_set(ADCSR, ADIF);

temp_valueH = inp(ADCH);
sbi(ADCSR, ADIF);
ADMUX=0;
return temp_valueH;
}



========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.ipartners.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Marcin Stanisz <mstanisz_at_nospam_poczta.bzdury.onet.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: 11 Jun 2004 15:57:05 GMT


W artykule <caccjp$drb$1_at_nospam_atlantis.news.tpi.pl> BT napisal(a):
Właśnie sobie z tym poradziłem ;) ściąłem jakiś gotowy kod i działa.
Skonfrontowałem go na szybko z manualem ale dalej nie mam pojęcia dlaczego
ADEN w ADCSR musi być ustawiony. ;-) no ale inaczej nie chce działać. Druga

Aha. ADEN. No tak. Za dużo masła ;-)

Marcin Stanisz
--

"A lie will go round the world before the truth has got its boots on"
Terry Pratchett, "Truth"

========
Path: news-archive.icm.edu.pl!newsfeed.gazeta.pl!news.astercity.net!news.aster.pl!not-for-mai

Poprzedni Następny
Wiadomość
Spis treści
From: Adam Dybkowski <adybkows_at_nospam_amwaw.edu.pl>
Subject: Re: [AVR-GCC] przetwornik AC
Date: Sun, 13 Jun 2004 23:03:36 +0200


BT wrote:

outp(0,ADMUX);
outp((1<<ADEN)|(1<<ADSC)|(1<<ADIF)|(1<<ADIE),ADCSR);

BTW: Nie używaj outp/inp ani cbi/sbi bo te makra są już "deprecated" i w
następnej wersji avr-gcc mogą po prostu zniknąć. Zamiast tego lepiej
napisać (i IMHO dużo bardziej wygodnie):

ADMUX = 0;
ADCSR = (1<<ADEN) | (1<<ADSC) | (1<<ADIF) | (1<<ADIE);

A makra _BV nie polecam, bo ani ono ładne, ani wygodne.

--
Adam Dybkowski
adybkows_at_nospam_amwaw.edu.pl
http://www.amwaw.edu.pl/~adybkows/


========
Path: news-archive.icm.edu.pl!news2.icm.edu.pl!news.pw.edu.pl!not-for-mai