To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
-
kaliska5
- Użytkownik
- Posty: 348
- Rejestracja: 01 maja 2008, 8:24
- Lokalizacja: z nienacka
-
Kontakt:
Post
autor: kaliska5 » 24 sty 2010, 12:23
Witam.Po długiej przerwie wróciłem do zabawy z mikroprocesorami i mam problem z przetwornikiem analogowo-cyfrowym w Atmega8. Nie chce kopiować kogoś kodu wiec siedzę z nota katalogowa i próbuje sam coś zdziałać. Wyszło mi coś takiego ale nie działa.
Kod: Zaznacz cały
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
ISR(ADC_vect)
{
volatile unsigned char liczba1 ,liczba2;
liczba1 = ADCL;
liczba2 = ADCH;
PORTB = liczba1;
}
int main(void)
{
for(;;)
{
DDRD=255;
PORTD=0;
ADMUX = (1<<REFS0)|(1<<MUX2);
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);
sei();
_delay_ms(50);
}
}
Co jest źle? Przepraszam za zamieszanie brakło ustawienia portu B. Proszę o usuniecie postu
-
RcTomek
- Moderator
- Posty: 243
- Rejestracja: 27 wrz 2007, 21:15
- Lokalizacja: Głogów / Wrocław
Post
autor: RcTomek » 24 sty 2010, 15:06
A dlaczego cała konfiguracja portu i ADC jest w pętli nieskończonej? Takie rzeczy, łącznie z sei(), powinieneś umieścić przed for(;;){}. Ustaw port B jako wyjście, bo chyba o to chodzi? Na końcu funkcji main brakuje return 0.
-
kaliska5
- Użytkownik
- Posty: 348
- Rejestracja: 01 maja 2008, 8:24
- Lokalizacja: z nienacka
-
Kontakt:
Post
autor: kaliska5 » 25 sty 2010, 17:23
Nie chce zakładać nowego tematu wiec napisze w starym . Mam problem dalej z tym przetwornikiem napisałem prosty program wyświetlający zawartość ADC na 3 wyświetlaczach 7seg.Niestety nie działa w porządku wyświetlają sie rożne badziewia.
Nie mogę się doszukać błędu.
Kod: Zaznacz cały
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile char cyfra[10] = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x2, 0x78, 0x0, 0x10,};
volatile int wysw;
volatile int setki;
volatile int dziesiatki;
volatile int jednosci;
volatile unsigned char mlodszapolowka ,starszapolowka , wynikadc;
int main(void)
{
DDRD=255;
PORTD=255;
DDRB=255;
ADMUX = (1<<ADLAR)|(1<<REFS0)|(1<<MUX2);
ADCSRA = (1<<ADEN)|(1<<ADIE)|(1<<ADFR)|(1<<ADSC)|(1<<ADPS0)|(1<<ADPS1);
TCCR1B |= (1 << WGM12); // tryb CTC
OCR1A = 30000;
TCCR1B |= (1 << CS10);
TIMSK |= (1 << OCIE1A);
sei();
for (;;)
{
wynikadc=starszapolowka;
jednosci = wynikadc % 10;
wynikadc = wynikadc /10;
dziesiatki = wynikadc;
wynikadc = wynikadc /10;
setki= wynikadc /10;
}
return 0;
}
ISR(ADC_vect)
{
mlodszapolowka = ADCL;
starszapolowka = ADCH;
}
ISR(TIMER1_COMPA_vect)
{
switch(wysw)
{
case 0:
PORTD = 0b1111110;
PORTB=cyfra[setki];
wysw++;
break;
case 1:
PORTD = 0b1111101;
PORTB = cyfra[dziesiatki];
wysw++;
break;
case 2:
PORTD = 0b1111011;
PORTB = cyfra[jednosci];
wysw=0;
break;
}
}
-
bsw
- Użytkownik
- Posty: 100
- Rejestracja: 14 kwie 2008, 13:13
- Lokalizacja: Małopolska
-
Kontakt:
Post
autor: bsw » 26 sty 2010, 12:47
1. sprawdz na poczatek pojedyncze cyfry bez multiplekcowania czy wartosci sa ok - moze cos zle podlaczyles.
2. z kodu widac ze na pewno masz "duchy" (przenosi sie poprzednia cyfra na nastepny wyswietlacz) - musisz wygaszac wyswietlacz zanim przelaczysz na nastepny.
-
kaliska5
- Użytkownik
- Posty: 348
- Rejestracja: 01 maja 2008, 8:24
- Lokalizacja: z nienacka
-
Kontakt:
Post
autor: kaliska5 » 26 sty 2010, 18:18
No wiec wyswietlanie pojedynczych liczb dziala bez problemu.Duchów i innych zjaw

nie widze na wyswietlaczu , segmenty dziesiatek i jednosci wyswietlaja normalnie. Problemu szukam w funkcji
Kod: Zaznacz cały
jednosci = wynikadc % 10;
wynikadc = (wynikadc - jednosci) / 10;
dziesiatki = wynikadc % 10;
wynikadc = (wynikadc - dziesiatki) / 10;
setki= wynikadc % 10;
Te przeliczenia podesłał mi kolega bo moje do niczego się nie nadawały.
Problem rozwiązany. Nie wiem jak to możliwe ale 1 i 3 segment miały ze sobą zwarcie i wyświetlało się na nich to samo cały czas. wymieniłem wyświetlacz na inny i działa. Dziękuje za pomoc.