logo elektroda
logo elektroda
X
logo elektroda
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 1164 13
  • #1 15710917
    Kolak16
    Poziom 8  
    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
  • Pomocny post
    #2 15710953
    tmf
    VIP Zasłużony dla elektroda
    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  
    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  
    Jeszcze nie wiem co zrobić z rozkazem sbic? Tam też mam out of range.
  • #5 15712422
    tmf
    VIP Zasłużony dla elektroda
    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.
  • #6 15712485
    Kolak16
    Poziom 8  
    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
    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  
    Możesz np. tak:
    Kod: AVR assembler
    Zaloguj się, aby zobaczyć kod
  • #9 15712595
    grko
    Poziom 33  
    @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  
    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  
    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  
REKLAMA