logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega88 Asm Problem z ADC - Przekroczenie zakresów

Kolak16 31 Maj 2016 09:31 1269 13
REKLAMA
  • #1 15710917
    Kolak16
    Poziom 8  
    Posty: 20
    Ocena: 1
    Witam,

    zacząłem nauke assemblera od kursu "[Kurs] Programowanie mikrokontrolerów AVR w języku assembler" autorstwa użytkownika Kermit.

    Mam problem z 4 częścią kursu dotyczącą ADC, ponieważ kurs prowadzony jest pod atmegę 32 a ja posiadam atmegę 88.

    Po zbudowaniu projektu, pojawia mi sie 5 błędów o przekroczeniu zakresu. I przez to nie moge używać rozkazów (sbi, sbic, in, out).
    Z dokumentacji przeczytałem, że rejestry związane z ADC, są umiejscowione w rozszerzonej pamięci I/O, więc musze użyć rokzazów LDS, STS w kombinacji z rozkazami SBRS, SBRC, SBR i CBR. Niestety nie wiem jak je ze sobą połączyć, nigdzie nie mogłem znaleźć przykładu. Dlatego proszę was o pomoc w jaki sposób mam użyć tych rozkazów. Pod spodem wklejam mój kod i screen z błędami kompilacji.
    
    .nolist 
    .include "m88PAdef.inc" 
    .list 
    
    .cseg 
    .org 0 
    
    
    cli                            //wyłączenie przerwań 
    ldi R16, HIGH(RAMEND)        //implementacja stosu 
    out SPH, R16 
    ldi R16, LOW(RAMEND) 
    out SPL, R16 
    
    
    //konfiguracja PWM 
    sbi DDRB, 3                                                //ustawienie jako wyjście linii na której będzie generowany sygnał PWM 
    ldi R16, (1<<WGM00)|(1<<WGM01)|(1<<WGM02)|(1<<COM0A1)        //załadownie do R16 wartości która posłuży do konfiguracji timera0 
    out TCCR0A, R16                                            //załadowanie wartośći z R16 do TCCR0 
    
    ldi R16, (1<<CS00)       
    out TCCR0B, R16        
                    
    
    //konfiguracja ADC 
    ldi R16,(1<<REFS0)|(1<<ADLAR)                                     
    out ADMUX, R16                                            
    
    ldi R16,(1<<ADEN)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADSC)    
    out ADCSRA, R16 
    
    main:                    
    
    sbic ADCSRA, ADIF      
    rcall load_OCR            
    rjmp main                
    
    load_OCR:                
    in R16, ADCH          
    out OCR0A, R16            
    sbi ADCSRA, ADSC      
    ret            
    


    Atmega88 Asm Problem z ADC - Przekroczenie zakresów
  • REKLAMA
  • Pomocny post
    #2 15710953
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Jak już wiesz, SBI/CBI, IN i OUT operują wyłącznie na adresach z pewnego zakresu. Stąd też musisz je zamienić na LDS/STS podając jako adres IO + 32 (przesunięcie przestrzeni adresowej IO w stosunku do przestrzeni adresowej SRAM. SBI/CBI trzeba zamienić na operację RMW, czyli odczyt komórki do rejestru, jego zmiana za pomocą ANDI lub ORI, a następnie zapis do tej samej komórki.
    BTW, jest jakiuś powód dla którego piszesz w asmeblerze? Z czystej ciekawości, chętnie bym go poznał :)
  • #3 15711028
    Kolak16
    Poziom 8  
    Posty: 20
    Ocena: 1
    Dzięki za wyjaśnienie :D.
    Uczę się assemblera tylko dlatego, żeby zobaczyć o co w nim chodzi, ale kto wie może kiedyś będę chciał napisać jakiś RTOS :D, więc przydałoby się go znać.
    Drugi powód to taki, że gdybym w przyszłości dostał pracę jako programista mikrokontrolerów i dostałbym zadanie napisania albo przerobienia jakiegoś kodu w assemblerze, to żebym miał jako takie pojęcie.
  • #4 15712358
    Kolak16
    Poziom 8  
    Posty: 20
    Ocena: 1
    Jeszcze nie wiem co zrobić z rozkazem sbic? Tam też mam out of range.
  • REKLAMA
  • #5 15712422
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    Kolak16 napisał:
    Jeszcze nie wiem co zrobić z rozkazem sbic? Tam też mam out of range.


    Musisz najpierw załadować wartość do rejestru, a potem zamienić to na SBIR lub inną operację sprawdzającą stan bitu.
  • REKLAMA
  • #6 15712485
    Kolak16
    Poziom 8  
    Posty: 20
    Ocena: 1
    Cytat:


    Musisz najpierw załadować wartość do rejestru, a potem zamienić to na SBIR lub inną operację sprawdzającą stan bitu.


    Jaką wartość i do jakiego rejestru muszę załadować ?
  • Pomocny post
    #7 15712545
    tmf
    VIP Zasłużony dla elektroda
    Posty: 14318
    Pomógł: 2090
    Ocena: 2203
    SBIC sprawdza, czy wybrany bit wskazanego rejestru IO jest skasowany i jeśli tak to pomijane jest wykonanie kolejnej instrukcji. Stąd też musisz do dowolnego rejestru MCU wczytać zawartość danego rejestru IO, wykonać operację testowania bitu i warunkowy skok.
  • Pomocny post
    #8 15712552
    2rs232
    Poziom 18  
    Posty: 141
    Pomógł: 28
    Ocena: 20
    Możesz np. tak:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #9 15712595
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    @kamyczek Nawet nie wiem jak to skomentować. Każde Twoje zdanie pokazuje jak bardzo zatrzymałeś się w czasach prehistorycznych. Wisienką na torcie jest stwierdzenie:

    Cytat:

    Z czego tak wnoszę odpowiedź jest bardzo prosta bo każdy kod z c jest najpierw tłumaczony na asembler a potem dopiero kompilowany.


    Twierdzisz, że to kod asemblerowy jest kompilowany ? :)


    Kolejna "złota myśl":
    Cytat:
    Poza tym jak się pisało tylko w asemblerze programistów było mało ze względu na większe wymagania intelektualne teraz jest c i "programistów " rodzi się więcej . Ludzie zmądrzeli czy raczej poziom wymagań dla c jest niższy , ja sądzę że to drugie ...


    Chciałbym Cię uświadomić, że to właśnie C jest jednym z najpopularniejszych języków programowania ogólnego przeznaczania. Zostały w nim napisane takie projekty jak Kernel Linuxa oraz Git. Są cenione i używane przez miliony użytkowników a poziomem skomplikowania raczej wykraczają daleko poza Twój zakres pojmowania programowania.
  • #10 15712716
    kamyczek
    Poziom 38  
    Posty: 3994
    Pomógł: 394
    Ocena: 570
    GrzegorzKostka napisał:
    Każde Twoje zdanie pokazuje jak bardzo zatrzymałeś się w czasach prehistorycznych


    Kolego ja sobie z plikiem HEX robię co potrzebuję ,ty ze swoją wiedzą programisty w C możesz tylko popatrzeć na taki plik jak na gazetkę napisaną po japońsku ...Do niektórych rzeczy c jest niewystarczające i bezużyteczne .
  • #11 15712736
    grko
    Poziom 33  
    Posty: 1386
    Pomógł: 247
    Ocena: 141
    Ok. Pominę pierwszą część Twojej wypowiedzi i postaram się merytorycznie:

    Cytat:

    Do niektórych rzeczy c jest niewystarczające i bezużyteczne .


    Do jakich rzeczy i dlaczego? Rozumiesz tak naprawdę jak kompilator działa? Bo z poprzedniej Twojej wypowiedzi wynika, że niespecjalnie.
  • #12 15712883
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ Użytkownik rozpoczął naukę assemblera na kursie dotyczącym mikrokontrolerów AVR, napotykając problemy z ADC w mikrokontrolerze ATmega88, który różni się od ATmega32. Wskazano, że instrukcje SBI, CBI, IN i OUT działają tylko w określonym zakresie adresów, co wymaga użycia instrukcji LDS i STS dla rejestrów ADC. Użytkownik uzyskał porady dotyczące zamiany SBI na operacje RMW oraz użycia SBIC i SBIR do sprawdzania stanów bitów. Wskazówki obejmowały również konkretne przykłady kodu, takie jak użycie instrukcji LDS do załadowania wartości rejestru ADCSRA oraz modyfikacji bitów za pomocą ORI.
Wygenerowane przez model językowy.
REKLAMA