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

LCD S65 + AT90USB1287 - problem z przystosowaniem projektu

pubus 07 Lis 2006 12:45 2236 16
REKLAMA
  • #1 3197524
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    Próbuje przystosować gotowy projekt pod AT90USB1287...
    W orginale był na ATmega128...
    Z większością błędów już sobie poradziłem pozostały dwa, chociaż w obu przypadkach rozbija się o to samo...
    Kompiluje projekt w AVR-Studio SP4 i GCC 20060421...
    
    SPI_SEND:   
     ->   SPCR,SPE        ;enable SPI SPCR
        out SPDR,r24        ;load byte in SPI data register
    SPI_SEND_0: 
     ->   sbis    SPSR,SPIF
        rjmp    SPI_SEND_0      ;transmitt byte to LCD
        in  r0,SPDR
        sbi PORTB,LCD_CS        ;deselect Display
        ret
    

    dostaje błąd "number must be less then 32"
    W obu przypadkach...
    Jest to dlamnie dziwne bo np.
    SPCR to makro i oznacza sbi _SFR_IO8(0x2C) gdzie 0x2C to adres który jest podany w dokumentacji więc o co chodzi...?
    Będe wdzięczny za pomoc...
    Aha z asemblera generalnie jestem zielony...
    ...
    W paru miejscach były błędy z makrami opisującymi porty...
    Wystarczyło zamiast makr wstawić nr bitów (stałe) i po sprawie, ale tutaj nie wiem co zmienić żeby nie tylko się kompilowało ale miało też sens...
  • REKLAMA
  • Pomocny post
    #2 3200906
    mantiss
    Poziom 12  
    Posty: 10
    Pomógł: 1
    Ocena: 1
    Witam...
    o ile dobrze pamiętam AVRy to SPCR to jest SPI CONTROL REGISTER a SPE to jest bit SPI Enable wiec linia:
    
    ->   SPCR,SPE        ;enable SPI SPCR 
    

    nie będzie się odwoływała do makra tylko powinna wyglądać tak:
    
    sbi SPCR,SPE
    


    ale mogę się mylić :D

    pozdrawiam
  • #3 3201121
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Oczywiście, masz racje, że powinno być sbi...
    Nie jest to jednak błąd w kodzie a jedynie mój błąd przy przenoszeniu go do wiadomości...
    Co do makrodefinicji to nie do końca masz rację...
    SPCR to makrodefinicja oznaczająca sbi _SFR_IO8(0x2C)...
    Natomiast SPE to nr bitu oznaczającego bit SPE w rejestrze SPCR...
    Pokopie jeszcze w dokumentacji i może do czegoś dojdę ale proszę o dalsze sugestie...
  • Pomocny post
    #4 3202092
    pmichniewski
    Poziom 18  
    Posty: 242
    Pomógł: 22
    Ocena: 5
    Instrukcja sbi działa jedynie na dolnej części rejestrów (o adresach 0 - 31), natomiast SPCR znajduje się powyżej tego zasięgu. Proponuję robić to w inny sposób:

    
    ldi R24,(1<<SPE)|(1<<MSTR) ; SPI master, CLK/4
    out SPCR,R24
    
  • REKLAMA
  • #5 3202241
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    No faktycznie wygląda, że jest ok...
    W każdym razie przechodzi kompilację...
    Był bym bardzo wdzięczny za pomoc przy drugim fragmęcie...
    sbis to chyba warunek...?
    sbis - "Skip if Bit in I/O Register is Set"...
    potem jest skok...
  • Pomocny post
    #6 3202929
    pmichniewski
    Poziom 18  
    Posty: 242
    Pomógł: 22
    Ocena: 5
    To samo. Musisz najpierw odczytać wartość z rejestru I/O instrukcją IN, a później sprawdzić bit już w rejestrze procesora.
  • REKLAMA
  • #7 3203443
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    No więc tak...
    Zmieniłem fragmęt:
    
    sbis    SPSR,SPIF
    

    na coś takiego
    
    in R24,SPSR
    sbis    R24,SPIF
    

    i teraz dla odmiany wyskakuje
    "Error: constant value required"
    Miałem już coś takiego ale w poprzednich wypadkach wystarczyło zamiast nazwy z makrodefinicji podać nr bitu i było po sprawie...
    Tutaj nadal się pluje...
  • #8 3203583
    pmichniewski
    Poziom 18  
    Posty: 242
    Pomógł: 22
    Ocena: 5
    Zmień na SBRS.
  • #9 3203694
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Nie to nie to...
    Błąd jest tylko w linii
    
    sbis R24,SPIF
    

    Nie pasuje mu SPIF...
    Dziwne jest dla mnie, że podanie nr bitu nic nie zmienia...
    Aha zmiana z SPSR na SBRS powoduje ten sam błąd, ale tu się akurat nie dziwie bo wogule nie znalazłem takiego rejestru...
  • Pomocny post
    #10 3203742
    maciek_slon
    Poziom 29  
    Posty: 942
    Pomógł: 143
    Ocena: 27
    Chodziło o zmianę sbis na sbrs :P
  • #11 3203929
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    LOL...
    No mówiłem, że noga z asemblera jestem... ;)
    Dziękuje obu kolegom za pomoc...
    Jak narazie kompilacja była bez błędów...
    Jutro będę sprawdzał czy działa...

    Pozdrawiam Rafał...

    PS
    Chyba wypadało by się poduczyć asemblera :/
  • REKLAMA
  • #13 3212682
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam ponownie... jest niewymownie... ;)
    Do bani... :/

    Dałem sobie siana z przerabianiem kodu w asemblerze...
    Wziąłem się za to w C i powstała wariacja na tema...
    Wszystko wygląda niby dobrze ale niestety nie działa...
    Nie wiem dlaczego są drobne różnice między procedurą inicjalizacji opisaną na stronie i tym jak jest przeprowadzona już w programie...
    Mam prośbę do kolegów z forum...
    Rzućcie okiem na kod może znajdziecie jakieś błędy...
    Mnie się już w oczach dwoi i cholera mnie bierze a więcej błędów nie widzę...
    Aha za wszelkie sugestie dotyczące samej procedury inicjalizacji też będe wdzięczny...
    Jeszcze jedno...
    Elektrycznie nie powinno być problemu...
    uC i LCD są zasilane z tego samego źródła 3,0V...
    Jedynie podświetlanie ma osobne zasilanie 12V...
    Załączniki:
    • S65.c (286 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
    • disp.h (1.12 KB) Musisz być zalogowany, aby pobrać ten załącznik.
    • disp.c (13.57 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #14 3212939
    pmichniewski
    Poziom 18  
    Posty: 242
    Pomógł: 22
    Ocena: 5
    Ja jakiś czas temu próbowałem bawić się C na AVRkach, ale stwierdziłem, że to nie ma sensu. Natomiast jeśli chodzi o obsługę LCD od S65, to polecam temat napisany przeze mnie w dziale DIY: LCD od S65 + ATmega16
  • #15 3219615
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    Opiszę finał tej historii bo sprawa jest ciekawa...
    Otóż żeby nie bawić się w dopasowywanie poziomów napięć postanowiłem odpalić moją megę na 2,9V...
    Ale co tam nawet na 3V...
    Tak na wszelki wypadek...
    I lipa...
    Męczyłem się i przerabiałem program już parę razy...
    Trochę błędów znalazłem a tu dalej nic...
    I co się okazało...?
    Sprawa prosta jak konstrukcja cepa...
    Mimo tego, że w dokumentacji jest jak byk napisane, że min napięcie to 2,7V i freq. 8MHz...
    To w rzeczywistości okazało się to bujdą na resorach...
    Przy 3V nie chciał uC ruszyć nawet na 3MHz...
    Okazało się, że min dla kwarcu 8MHz to 3,4V...
    Dziękuję kolegom pmichniewski i maciek_slon...
    Jeśli ktoś byłby zainteresowany to mogę umieścić dziłającą wariację w C na temat softu by Christian Kranz...
    Jest drobna różnica w stosunku do plików zamieszczonych przeze mnie wcześniej... i nie wiem czy ta wcześniejsza działa...
  • #16 3225470
    xarusx
    Poziom 14  
    Posty: 106
    Pomógł: 11
    Ocena: 1
    Bardzo ciekawy projekt !!! . Jak możesz to wrzuć na forum. :D
  • #17 5745141
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Witam...

    Temat jest stary jak świat ale dostałem zapytanie o wersję w całości w C więc przy okazji postanowiłem ją wrzucić do tego tematu...
    Tak na prawdę jest to katalog z całym projektem pod AVR_studio + GCC...
    Nie jest to nic szczególnego więc nie bijcie...
    Może jednak komuś będzie łatwiej to dalej przerabiać już bez potrzeby skradania się do wstawek asemblerowych...
    Konkretnie jest to test do połączenia ATmega8 + S65_LCD...

    Pozdrawiam...
    Załączniki:
    • atmega8-s65l-lcd.rar (27.09 KB) Musisz być zalogowany, aby pobrać ten załącznik.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z adaptacją projektu sterowania wyświetlaczem LCD S65 z mikrokontrolera ATmega128 na AT90USB1287. Głównym problemem były błędy asemblerowe związane z instrukcjami operującymi na rejestrach I/O o adresach powyżej 31, co powodowało błędy kompilacji typu "number must be less than 32". Wskazano, że instrukcje takie jak sbi i sbis działają tylko na rejestrach o adresach 0-31, a rejestr SPCR (adres 0x2C) wymaga innego podejścia, np. ładowania wartości do rejestru za pomocą ldi i out. Problemy z instrukcją sbis na rejestrze procesora rozwiązano przez zmianę na sbrs oraz poprawne odczytanie rejestru SPSR do rejestru ogólnego przed sprawdzeniem bitu. Autor przyznał się do braku doświadczenia w asemblerze i ostatecznie zdecydował się na implementację w języku C, jednak napotkał dalsze trudności z inicjalizacją LCD. W toku testów okazało się, że mikrokontroler ATmega128 nie działa stabilnie przy napięciu 3V i częstotliwości 8 MHz, co jest sprzeczne z dokumentacją, gdzie minimalne napięcie to 2,7V. Ostatecznie autor potwierdził, że minimalne napięcie dla stabilnej pracy przy 8 MHz to około 3,4V. Na koniec udostępnił działający projekt w C dla ATmega8 i LCD S65, co może ułatwić dalsze prace bez konieczności używania asemblera.
Wygenerowane przez model językowy.
REKLAMA