Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ustawienie timer0 w atmega128 na 15ms...

18 Sie 2006 18:34 1545 4
  • Poziom 10  
    Posiadam przykład kodu na atmega16 (coś mnie ten procek prześladuje :/) i chcę to przerobić na atmega128.
    Pod atmega16 wygląda on następująco:

    .cseg
    RESET: cli
    clr r30
    out EECR, r30
    out MCUCR, r30

    ; watchdog na ok.1s
    ldi r31, (1<<WDE) | (1<<WDP2) | (1<<WDP1)
    out WDTCR, r31

    ; inicjalizacja stosu
    ldi r31, high(RAMEND)
    out SPH, r31
    ldi r31, low(RAMEND)
    out SPL, r31

    ; ustawienie timera0 na czas 15ms (odczekanie 15ms)
    ldi temp, 136
    out TCNT0, temp
    in temp, TIFR
    sbr temp, 1<<TOV0 ;ustaw bit TOV0 (bit 0)
    out TIFR, temp ; czyszczenie flagi
    ldi temp, (1<<CS02) | (1<<CS00) ;****str.83 manuala****
    out TCCR0, temp ; Fosc/1024 (CLKi/o / 1024)

    ;tu wywolywane funkcje jakies np:
    call ustaw1

    ; czekanie na koniec odmierzania czasu T0 (15ms)
    RST15ms: in temp, TIFR
    sbrs temp, TOV0
    rjmp RST15ms
    out TIFR, temp ; czyszczenie flagi
    clr temp
    out TCCR0, temp ; wylacz timer

    ;po tym odmierzeniu wyswietlam napis na LCD


    Xhodzi mi tu o te 15ms...czemu 126 wpisuje do TCNT0? Jak to sie oblicza że niby takie ustawienie spowoduje odmierzenie 15ms po czym timer zostanie wylaczony???
    Czy wpisanie 1 na bit TOV0 powoduje, że bedzie on "samoczynnie" znowu wyzerowany i włączy się na 1 dopiero po 15ms? /tak by z kody wynikało/??

    A teraz chcę to na atmega128 przerobić, a więc zmieniłem zgodnie ze stroną 105 manuala linikę:

    ldi temp, (1<<CS02) | (1<<CS00)

    na:

    ldi temp, (1<<CS02) | (1<<CS01) ! (1<<CS00)

    co daje niby clock/1024...


    Co dziwne takie wpisanie spowodowało, że na układzie z atmega128 nie wyswietlił się napis...i żeby było śmiesznie, to zmieniłem na postać taka jak było pod atmega16, co z tego co widze dałoby clkT0S/128 (From prescaler)...
    Czy ktoś wie o co tu chodzi i czemu takie coś nie chce działać??

    P.s. jakby mi ktoś odpowiedział na te pytania byłbym bardzo wdzieczny oraz jak odbywa sie to odliczanie w zaleznosci wlasnie od bitó CS0x oraz wpisanej wartości do TCNT0????

    Dodano po 4 [godziny] 36 [minuty]:

    Teraz widze ze jak dam jakies opoznienie wieksze, nawet przed wyswietlaniem to juz nie wyswietla...co to ma wspolnego kurde frak ;(??
  • Poziom 21  
    Jak to sie oblicza? Timer po włączeniu przy każdym swoim cyklu zwiększa wartość TCNT0 o jeden. I tak aż do 256. Gdy osiągnie tą wartość ustawia flagę TOV0 = 1, TCNT0 = 0 i zaczyna od początku. W tym momencie możesz znów ustawić np. TCNT0 = 136.

    Flagę TOV0 ustawia się na jeden po to, aby ją wyzerować. Jeśli tego nie zrobisz nie będziesz mógł jej więcej sprawdzić. A dokładnie gdy będziesz ją testował drugi raz będzie ona ustawiona nawet jeśli timer nie dotarł do końca.

    A jeśli chodzi o bity CS - jest to preskaler. Ustawiony na 1024 powoduje, że "częstotliwość timera = częst. proc./1024". I teraz odpowiedź na Twoje pytanie:

    Przy założeniu że procek pacuje na krawcu 8Mhz, preskaler = 1024, TCNT0 = 136 jeden cykl timera odbywa się co 128us. Jak już napisałem timer liczy do 256. Na początku ma wartość 136 czyli do końca wykona się w 120 cyklach. 128us*120 = 15ms.

    Jeśli Twój program działał na mega16 a teraz nie działa może coś z fusebitami? Albo kwarc masz inny? Pozdrawiam.
  • Poziom 10  
    Hmm on niby jest na atmega16, a ja chcę to przerobić na atmega128...w ogole zauwazylem ze u mnie wyswietlanie na LCD jest uzaleznione od...opoznien czasowych. np tu tak jest...albo załóżmy że przed wyswietleniem jakiegoś napisu (całej procedury wyswietlania itd) dam opoznienie np 5ms to juz nie wyswietli, a jak w ogole nie dam albo dam jakieś 44us to wszystko pasuje...czy ktoś mi może wytłumaczyć co tu może być grane?? Myślalem, że sie coś dzieje w jakieś pętli i im większy czas trwania pętli to nie widać napisu...ale żadnej pętli tutaj nie ma co dziwne, aby wyswietlanie sie zapętlało...
    No i jeszcze lekko mi "drga" wyswietlanie przy wypisaniu jakiegoś napisu...

    Dodano po 3 [minuty]:

    P.s. fusebity są ustawione te co mi są na pewno potrzbne: czyli SPIEN, BODLEVEL, BODEN i SUT1 - więc to nie wchodzi w grę. Wgrywam ponyprogiem2000, wtyk stk200
    Kwarc mam 8Mhz..właśnie się tgeż zastanawiałem, że coś z nim może nie tak, ale nie wiem jak to sprawdzić...

    Dodano po 9 [minuty]:

    "
    A jeśli chodzi o bity CS - jest to preskaler. Ustawiony na 1024 powoduje, że "częstotliwość timera = częst. procesor./1024". I teraz odpowiedź na Twoje pytanie:

    Przy założeniu że procesor pacuje na krawcu 8Mhz, preskaler = 1024, TCNT0 = "=136 jeden cykl timera odbywa się co 128us. "

    EE możeszm i powiedzieć skąd Ci się te 128us wzięło??
    skoro częst. timera to = 8000000/1024...

    Dodano po 13 [minuty]:

    Żeby wyszło 128us to by musiało być 1024/80000000 (prescaler/czestotliwosc procka)....czyli wówczas timer byłby zwiększany co 128us...no ale jak to się ma do tego co napisałeś??

    Dodano po 6 [minuty]:

    SORRY za zamieszanie...skutki poźnej godziny. przecież podaję czas a nie częstotliwość, czyli 1/czas podstawiam :-)

    No ale dalej nie doszedłem do wniosku co jest nie tak z tym wyświetlaniem...miał już ktoś takie problemy? Bo być może mam coś nie tak w swoim LCD, coś sie uszkodziło...
  • Poziom 21  
    Fusebity: zwróć jeszcze uwagę na JTAGEN. Fabrycznie jest on włączony (ustawiony na 0) - i to mi kiedyś przysporzyło kłopotów z LCD. Gdy przesiadłem się na mega128 doszły mi jeszcze M103C i WDTON. Też standardowo były na zero i coś mi tam nie stykało. Nie pamiętam już co ale wyłączenie ich pomogło.

    Skąd 128us? 8000000/1024 = 7812,5Hz. Czyli zegar pracuje z częst. 7,8kHz. Przeliczając to na czas jednego cyklu 1/F mamy 128us.

    A co do reszty - wrzuć pełen kod programu - zobaczymy...
  • Poziom 10  
    Wkleje plik includowany z obsługa LCD, który stosuje oraz czesc programu głownego:

    LCS.asm:


    ;==============================================================================
    ; Obsluga LCD zgodnego z HD44780 dla 8-bitowej szyny danych v1.0
    ; Nie obsluguje BUSY flag ani odczytu adresu z LCD
    ;!!! Znak lub komenda do wyslania do LCD przekazywane sa przez rejestr "temp"
    ;!!! Ciag znakow przeznaczonych do wyslania wskazuje rejestr Z
    ;!!! - ciag znakow musi byc zakonczony zerem (znakiem o kodzie 0)
    ; Jesli ktos zamierza korzystac z CGRAM, to z drugiej polowki - adres 0b00001xxx
    ; Dodatkowo nalezy zdefiniowac procedury opoznien: DELAY_44us i DELAY_1_7ms
    ;--------------------------------------
    ; przyklady: [WIECEJ SZCZEGOLOW W KOMENTARZACH]
    ;
    ; call LCD_INIT ; inicjalizacja (min 15ms po starcie)
    ;
    ; ldi temp, "A" ; znak "A" przekazany przez "temp"
    ; call LCD_CHAR ; i wyslany na wyswietlacz
    ;
    ; ldi temp, LCD_LINE_2
    ; call LCD_COMMAND ; polecenie przejscia do drugiej linii
    ;
    ; ldi ZL, low(Bufor) ; komunikat z RAM
    ; ldi ZH, high(Bufor) ; adres bufora w rejetrze Z
    ; call LCD_STR_RAM
    ;
    ; ldi ZH, high(2*string)
    ; ldi ZL, low(2*string)
    ; call LCD_STR_FLASH ; wyswietlenie komunikatu pobranego z Flash
    ;
    ; call LCD_CLEAR ; czysci ekran
    ;
    ; ldi temp, LCD_LINE_2 | 9 ; ustaw adres na dziesiaty znak w drugiej linii
    ; call LCD_COMMAND
    ;
    ; string: .db "Witaj!", 0
    ; txt_1: .db 1,"Tekst 1", 2," Linia2", 0
    ;==============================================================================

    .equ F_zegara =8000000 ; czestotliwosc kwarcu taktujacego procesor [Hz]

    ; pozmianiac dla swojego podpiecia do procesora
    .equ LCD_PORT =PORTA ; port dla szyny danych
    .equ LCD_RS =5 ; numer pinu
    .equ LCD_RS_PORT =PORTB ; port
    .equ LCD_RW =6
    .equ LCD_RW_PORT =PORTB
    .equ LCD_E =7
    .equ LCD_E_PORT =PORTB
    ; wybrac jedna opcje:
    ;.equ LCD_DISPLAY_MODE =0b00110000 ; 1-wierszowy wyswietlacz
    .equ LCD_DISPLAY_MODE =0b00111000 ; 2-wierszowy wyswietlacz
    ;--------------------------------------

    ; definicje komend
    .equ LCD_LINE_1 =0b10000000
    .equ LCD_LINE_2 =0b11000000
    .equ LCD_CURSOR_LEFT =0b00010000 ; przesuwa kursor (i adres danych) o znak w lewo
    .equ LCD_CURSOR_RIGHT =0b00010100 ; -||- o znak w prawo
    .equ LCD_INCREMENT =0b00000110 ; zwieksza adres przy wpisywaniu znakow
    .equ LCD_DECREMENT =0b00000100
    .equ LCD_D1_C0_B0 =0b00001100 ; display ON, cursor OFF, blink OFF
    .equ LCD_D1_C0_B1 =0b00001101 ; display ON, cursor OFF, blink ON
    .equ LCD_D1_C1_B0 =0b00001110 ; display ON, cursor ON, blink OFF
    .equ LCD_D1_C1_B1 =0b00001111 ; display ON, cursor ON, blink ON
    .equ LCD_D0_C0_B0 =0b00001000 ; display OFF

    ;.listmac
    ;==============================================================================
    .macro LCD_E_PULSE
    sbi LCD_E_PORT, LCD_E ; 2 cykle
    ;nop ; dla zegara > 8MHz potrzebne jest opoznienie, bo Fmax(E)=2MHz
    cbi LCD_E_PORT, LCD_E ; 2 cykle
    ;nop
    .endm

    .cseg
    ;==============================================================================
    LCD_INIT: ; !!! inicjalizacja wyswietlacza - wykonac 15ms po zalaczeniu zasilania
    sbi LCD_E_PORT-1, LCD_E ; E jako wyjscie
    sbi LCD_RW_PORT-1, LCD_RW ; RW -||-
    sbi LCD_RS_PORT-1, LCD_RS
    push temp
    ser temp
    out LCD_PORT-1, temp ; LCD dane jako wyjscie (cały port A)

    ldi temp, LCD_DISPLAY_MODE
    rcall LCD_COMMAND
    rcall DELAY_5_1ms
    rcall LCD_COMMAND
    rcall DELAY_1_7ms
    rcall LCD_COMMAND
    rcall DELAY_1_7ms
    rcall LCD_COMMAND

    rcall LCD_CLEAR ; czyszczenie
    ldi temp, LCD_D1_C1_B1 ; wlaczenie wyswietlacza i kursora
    rcall LCD_COMMAND
    ldi temp, LCD_INCREMENT ; ustawienie zwiekszania adresu
    rcall LCD_COMMAND
    rcall DELAY_44us

    pop temp
    ret

    ;--------------------------------------
    LCD_COMMAND: ; wyslanie komendy z rejestru "temp"
    cbi LCD_RS_PORT, LCD_RS
    rcall LCD_CHAR
    sbi LCD_RS_PORT, LCD_RS
    ret

    ;--------------------------------------
    LCD_CLEAR: ; czysci ekran i ustawia kursor na pierwsza linie, adres 0
    push temp
    ldi temp, 1
    rcall LCD_COMMAND
    rcall DELAY_1_7ms
    pop temp
    ret

    ;--------------------------------------
    LCD_CHAR: ; wyslanie znaku z "temp" pod biezacy adres wyswietlacza
    out LCD_PORT, temp
    LCD_E_PULSE
    rcall DELAY_44us
    ret

    ;--------------------------------------
    LCD_STR_RAM: ; wyslanie ciagu znakow pobranych z RAM
    push temp
    LSR_NEXT: ld temp, Z+ ; pobranie kolejnego znaku z bufora
    cpi temp, 8 ; sprawdzanie czy znak<8
    brlo LSR_END ; jesli tak, to koniec
    rcall LCD_CHAR
    rjmp LSR_NEXT
    LSR_END: pop temp
    ret


    ;--------------------------------------
    LCD_STR_FLASH: ; wyslanie ciagu znakow pobranych z Flash
    ; adres komunikatu przekazywany przez rejestr Z
    ; ciag znakow moze zawierac rowniez numer linii np.:
    ; txt_1: .db 1,"Tekst 1", 2," Linia2", 0
    push temp
    LSF_NEXT: lpm temp, Z+ ; pobranie kolejnego znaku z bufora
    cpi temp, 8 ; sprawdzanie czy znak<8
    brlo LSF_CMM
    rcall LCD_CHAR
    rjmp LSF_NEXT

    LSF_CMM: cpi temp, 1 ; spr. czy znak=1 ?
    breq LSF_CMM_1
    cpi temp, 2 ; znak=2 ?
    breq LSF_CMM_2
    pop temp ; inny znak -> koniec
    ret

    LSF_CMM_2: ldi temp, LCD_LINE_2 ; linia druga
    rjmp LSF_CMM_C
    LSF_CMM_1: ldi temp, LCD_LINE_1 ; linia pierwsza
    LSF_CMM_C: rcall LCD_COMMAND
    rjmp LSF_NEXT


    ;======================================
    ; programowanie znakow w CGRAM
    ; znaki_CGRAM: <-- etykieta adresu definicji znakow (gdzies w listingu)
    ; - pierwszy bajt: zawiera numer znaku w CGRAM (0-7), jednak znaki musza byc
    ; odczytywane (wyswietlane) z drugiej polowki CGRAM (8-15)
    ; - drugi bajt: ilosc znakow do pobrania z definicji i zaprogramowania w CGRAM (1-8)
    ; - nastepne 5 bajtow to jeden znak: bajt opisuje stan kolumn znaku
    ; od lewej strony (poczytac w pdf HD44780) i LSB oznacza najwyzszy wiersz
    ; - jesli ilosc znakow jest wieksza niz 1 to nastepne znaki sa programowane po kolei
    ;--------------------------------------
    LCD_CGRAM:
    ldi zl, low(2*znaki_CGRAM)
    ldi zh, high(2*znaki_CGRAM)
    lpm r18, z+ ; numer znaku w CGRAM
    lpm r19, z+ ; ilosc znakow

    LCG_ZN_o: lsl r18
    lsl r18
    lsl r18 ; numer znaku w komendzie adresu CGRAM
    ldi temp, 0b01000000 ; komenda adresu w CGRAM
    or temp, r18 ; dodaj numer znaku
    rcall LCD_COMMAND

    LCG_ZN: lpm r4, z+
    lpm r3, z+
    lpm r2, z+
    lpm r1, z+
    lpm r0, z+ ; definicja znaku

    ldi r20, 8 ; 8 wierszy ma znak

    LCG_WRS: clr temp
    lsr r4
    rol temp
    lsr r3
    rol temp
    lsr r2
    rol temp
    lsr r1
    rol temp
    lsr r0
    rol temp
    rcall LCD_CHAR
    dec r20
    brne LCG_WRS

    dec r19
    brne LCG_ZN ; kolejny znak jesli r19<>0
    ret

    ; przyklad:
    ;znaki_CGRAM: ; osiem polskich literek (malych): a, c, e, l, n, o, s, z
    ;.db 0, 8, 0x20,0x54,0x54,0x54,0xF8, 0x38,0x44,0x46,0x45,0x20, 0x38,0x54,0x54,0xD4,0x18, 0,0x49,0x7F,0x44,0, 0x7C,0x8,0x6,0x5,0x78, 0x38,0x44,0x46,0x45,0x38, 0x48,0x54,0x56,0x55,0x20, 0x44,0x64,0x55,0x4C,0x44

    ;==============================================================================
    ; Procedury opoznien czasowych
    ;
    ;------------------------------------------------------------------------------
    ;.equ F_zegara =8000000 ; czestotliwosc kwarcu taktujacego procesor [MHz]

    ;==============================================================================
    ; DELAY_44us
    ; petla = 4 takty
    ; stala = 12 takty (lacznie z wywolaniem procedury CALL)
    ; czas [us] = (D44us * 4 + 12) / F_zegara [MHz]
    ; D44us = (czas * F_zegara - 12) / 4
    ;------------------------------------------------------------------------------
    ;.equ D44us =85 ; ilosc petli dla 44us
    ;.equ D40us = (40*F_zegara/1000000-12)/4
    ;.equ D42us = (42*F_zegara/1000000-12)/4
    .equ D44us = (44*F_zegara/1000000-12)/4
    DELAY_44us: ; 4 clk (CALL)
    push r16 ; 2
    ldi r16, D44us ; 1
    D44_1: dec r16 ; 1
    tst r16 ; 1
    brne D44_1 ; 2
    pop r16 ; 2
    ret ; 4

    ;==============================================================================
    ; DELAY_1_7ms (zalezna od DELAY_44us)
    ; petla = 4 takty + 44us
    ; stala = 12 takty (lacznie z wywolaniem procedury CALL)
    ; czas [us] = (D1_7ms * 4 + 12) / F_zegara [MHz] + D1_7ms * 44us
    ; D1_7ms = czas [us] / 44 [us] (w przyblizeniu)
    ;------------------------------------------------------------------------------
    ;.equ D1_6ms =36 ; ilosc petli dla 1600us
    .equ D1_7ms =39 ; ilosc petli dla ~1700us
    DELAY_1_7ms: ; 4
    push r16 ; 2
    ldi r16, D1_7ms ; 1
    D1_6_1: rcall DELAY_44us ; 44us
    dec r16 ; 1
    tst r16 ; 1
    brne D1_6_1 ; 2
    pop r16 ; 2
    ret ; 4

    ;==============================================================================
    ; DELAY_5_1ms (zalezna od DELAY_1_7us)
    ;------------------------------------------------------------------------------
    DELAY_5_1ms:
    rcall DELAY_1_7ms
    rcall DELAY_1_7ms
    rcall DELAY_1_7ms
    ret



    oraz plik głowny, np:

    ;==============================================================================
    ; Ustawienie bitow konfiguracyjnych "fuse bits"
    ; BODLEVEL, BODEN, SUT1, SPIEN - zaprogramowane (programmed) czyli wartosc 0
    ; reszta niezaprogramowana (1)
    ; Wykorzystane dla rezonatora kwarcowego 8MHz
    ;==============================================================================

    .nolist
    .include "m128def.inc"
    .list

    .def temp =r16

    ;.include "equ.asm" ; prawie wszystkie stale i zmienne

    ;==============================================================================
    ;======== S T A R T P R O G R A M U =========================================
    ;==============================================================================
    .cseg
    .org 0


    jmp RESET ; reset
    jmp RESET ; int0
    jmp RESET ; int1
    jmp RESET ; int2
    jmp RESET ; int3
    ;jmp INT4_INT ; int4 z DS1307
    ;jmp INT5_INT ; int5 przerwanie z ADE7759
    jmp RESET ; int6
    jmp RESET ; int7
    jmp RESET ; timer2_comp
    jmp RESET ; timer2_ovf
    jmp RESET ; timer1_capt
    jmp RESET ; timer1_compa
    jmp RESET ; timer1_compb
    jmp RESET ; timer1_ovf
    jmp RESET ; timer0_comp
    ;jmp TIMER0_INT ; timer0_ovf
    jmp RESET ; spi_stc
    jmp RESET ; usart0_rxc
    jmp RESET ; usart0_udre
    jmp RESET ; usart0_txc
    jmp RESET ; adc
    jmp RESET ; ee_rdy
    jmp RESET ; ana_comp
    jmp RESET ; timer1_compc
    jmp RESET ; timer3_capt
    jmp RESET ; timer3_compa
    jmp RESET ; timer3_compb
    jmp RESET ; timer3_compc
    jmp RESET ; timer3_ovf
    jmp RESET ; usart1_rxc
    jmp RESET ; usart1_udre
    jmp RESET ; usart1_txc
    jmp RESET ; twi
    jmp RESET ; spm_rdy

    .include "init.asm"



    ;==============================================================================
    ;======== P R O G R A M G L O W N Y =========================================
    ;==============================================================================
    .cseg
    RESET: cli
    clr r30
    out EECR, r30
    out MCUCR, r30

    ; watchdog na 1s
    ldi r31, (1<<WDE) | (1<<WDP2) | (1<<WDP1)
    out WDTCR, r31

    ; inicjalizacja stosu
    ldi r31, high(RAMEND)
    out SPH, r31
    ldi r31, low(RAMEND)
    out SPL, r31


    ; ustawienie timera0 na czas 15ms (odczekanie 15ms)
    ldi temp, 136
    out TCNT0, temp
    in temp, TIFR
    sbr temp, 1<<TOV0 ;ustaw bit TOV0 (bit 0)
    out TIFR, temp ; czyszczenie flagi
    ldi temp, (1<<CS02) | (1<<CS01) | (1<<CS00)
    out TCCR0, temp ; Fosc/1024 (CLKi/o / 1024)

    ; odczyt zmiennych z EEPROMu, inicjalizacja zmiennych
    ; ustawienie rejestrow uC
    call USTAW_MEGA128
    ;call USTAW_SPI
    ;call USTAW_KLAWISZE

    ; czekanie na koniec odmierzania czasu T0 (15ms)
    RST15ms: in temp, TIFR
    sbrs temp, TOV0
    rjmp RST15ms
    out TIFR, temp ; czyszczenie flagi
    clr temp
    out TCCR0, temp ; wylacz timer

    ; inicjalizacja LCD 15ms po starcie uP
    rcall LCD_INIT
    ldi temp, LCD_D1_C0_B0
    rcall LCD_COMMAND
    ldi zh, high(2*txt_witaj)
    ldi zl, low(2*txt_witaj)
    rcall LCD_STR_FLASH ; komunikat powitalny
    rcall LCD_CGRAM ; polskie znaczki

    wdr

    .include "LCD.asm" ; osbluga LCD

    ;TU JUŻ JAKIŚ PROGRAM W PĘTLI -->póki co "zawiesiłem" go tak"
    petla: jmp petla


    txt_mzz: .db "Zmiana offset",13,"w", 2,"i wsp",13,11,"cz.", 0 ;*************
    txt_witaj: .db 1,"LICZNIK ENERGII", 2," i WATOMIERZ", 0
    ;--------------------------------------
    znaki_CGRAM: ; osiem polskich literek (malych): a, c, e, l, n, o, s, z
    .db 0, 8, 0x20,0x54,0x54,0x54,0xF8, 0x38,0x44,0x46,0x45,0x20, 0x38,0x54,0x54,0xD4,0x18, 0,0x49,0x7F,0x44,0, 0x7C,0x8,0x6,0x5,0x78, 0x38,0x44,0x46,0x45,0x38, 0x48,0x54,0x56,0x55,0x20, 0x44,0x64,0x55,0x4C,0x44


    .exit


    Tu teoretycznie powinno być 15ms więc dla atmega128:
    ldi temp, (1<<CS02) | (1<<CS01) | (1<<CS00)
    jednakże to powoduje ze na wyswielaczu nic sie nie pojawia...
    ldi temp, (1<<CS02) | (1<<CS00) to już powuje wyswietlenie napisu na LCD, ale nie jest to ju 15ms, tak jak w przykładowym programie było na atmega16 (bodajze clk/128 to jest w atmega128). Co tu jest nie tak??? Może być, że spierdzielony jest wyswietlacz??
    Co do fusebitów - zczytuje z procka i mam TYLKO te zaprogramowane (^= zaznaczone w PONYPROG2000).


    jeszcze plik init.asm:

    .cseg
    ;------------------------------------------------------------------------------
    USTAW_MEGA128:
    .def ee_adr =r18
    .def ee_dane =r19

    ; konfig portow (tylko niektorych - reszta gdzie indziej)
    clr temp
    out DDRA, temp ; na wszelki wypadek (porty jako wejscie)
    out DDRB, temp
    out DDRC, temp
    out DDRD, temp
    out DDRE, temp

    ; ustawienie niektorych rejestrow
    ; wylaczenie JTAG:
    ldi temp, 1<<JTD
    out MCUCSR, temp
    out MCUCSR, temp
    ; wylaczenie komparatora:
    ldi temp, 1<<ACD
    out ACSR, temp
    ret

    .exit

    Ma ktoś jakiś pomysł co jest nie tak?!?! Bo ja już jestem załamany bo stoję z projektem i nie wiem co tu jest grane :/???