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

programowanie asembler-co robię nie tak

07 Kwi 2006 19:51 1593 2
  • Poziom 12  
    Panowie mam pytanie co robię nie tak że mi nie obsługuje klawiszy. przyciski mam dołaczone do PA0...PA4. Do PA5 i PA6 mam dołączone przekaźniki (wyraźnie słychać czy się przełaczają), zamiast sterowania przekaźnikiem dawałem komendę zerowania LCD i nic. Tak jakby się gdzieś zawiesił albo coś. Wiem że całe życie się człowiek uczy i pewnie jest tu jakiś głupi błąd (zaczynam się bawić po dłuższej przerwie i prubuje znowu od podstaw). Napis wyświetla. zmieniać napis moge ale te klawisze nie chcą ruszyć za nic. Proszę o obudzenie i uzmysłowienie mi w jakim miejscu robię ten durny błąd. dzięki


    .include "m16def.inc"
    .def temp =r16 ;rej tymczasowy
    .def temp1 =r17 ;rej tymczasowy
    .def temp2 =r18 ; rej tymczasowy
    .def temp3 =r19 ;rej do obl petli i chwilowy do LCD
    .def RS232 =r20

    początek:
    rjmp reset
    reset:
    clr r16
    ldi temp, LOW(RAMEND)
    out SPL, temp
    ldi temp, HIGH(RAMEND)
    out SPH, temp ;ustawienie stosu
    nop
    ldi temp2, 255
    out ddrb,temp2 ;port B jako wyjście (LCD)
    ldi temp,0b11110110
    out ddrd,temp ;port D jako wyjscie (LCD i PWM), PD0 jakow wejście -do USART

    ldi temp,0b11100000
    out ddra,temp ;5 i 6 jako wyjścia a 0...4 jako wejścia-przyciski
    ldi temp,255 ;podciągnięcie przycisków
    out porta,temp

    ;**********************************
    inicjacja_LCD:
    rcall wait100ms
    LCD_start:
    ldi temp,0b00111000 ;ustawienie displaya
    rcall lcdcommand ;8-Bit Interface,2 Line Display, znaki 5x7
    rcall wait5ms
    rcall wait5ms
    ldi temp,0b00111000 ;ustawienie displaya
    rcall lcdcommand ;8-Bit Interface,2 Line Display, znaki 5x7
    rcall wait5ms
    ldi temp,0b00111000 ;ustawienie displaya
    rcall lcdcommand ;8-Bit Interface,2 Line Display, znaki 5x7
    rcall wait100ms

    ldi temp,0b00001100 ;Włączenie displaya
    rcall lcdcommand ;Display on, Cursor off, Blinking on
    rcall wait100ms
    ldi temp,0b00000001 ;wyczyszczenie ekranu
    rcall lcdcommand
    rcall wait100ms

    ;**********************************************************
    ;**********************************************************
    ;****************ROZPOCZĘCIE PROGRAMU**********************
    ;**********************************************************
    ;**********************************************************




    ;***********WYŚWIETLACZ LCD**************************
    wyś_LCD:
    ; push temp3
    ldi temp,0b00000010 ;kursor na początek
    call lcdcommand
    call wait1ms ;opóźnienie niezbedne do zadzialania LCD
    ldi temp,68 ;załadowanie "działa"
    call LCDdana
    ldi temp,122
    call LCDdana
    ldi temp,105
    call LCDdana
    ldi temp,97
    call LCDdana
    ldi temp,108
    call LCDdana
    ldi temp,97
    call LCDdana

    ldi temp,0 ;tak na wszelki wypadek
    out ddra,temp
    ldi temp,255
    out porta,temp

    a:
    sbis porta,0 ;sprawdza czy stan niski-jeśli nie skacze przez następną komendę
    call sw1
    call wait100ms ;ewentualne opóźnienie
    sbis porta,1
    call sw2
    call wait100ms
    sbis porta,2
    call sw3
    call wait100ms
    rjmp a ;i pętla


    ;*******PODPROGRAMY************

    SW1: ;ustawiają i zerują wyjście a tym samym sterują przekaźnikiem
    sbi porta,6
    ret
    SW2:
    cbi porta,6
    ret
    SW3:
    sbi porta,6
    ret

    ;*********WPISANIE DANEJ DO LCD***************
    LCDdana: ;procedura wpisujaca do LCD dana
    cbi portd,6
    cbi portd,7
    out PORTb,temp ;wpisuje polecenie do displaya
    sbi PORTd,6 ;RS=1 (dane)
    nop
    nop
    sbi PORTd,7 ;strobe ENABLE
    nop
    nop
    nop
    cbi PORTd,7 ;clear ENABLE
    call wait5ms
    ret

    ;********PROC. WYSYŁAJACA KOMENDE NA LCD*****
    lcdcommand: ;procedura wpisu komendy do LCD
    cbi portd,7
    out PORTb,temp ;wpisuje polecenie do displaya
    cbi PORTd,6 ;RS=0 (polecenie)
    nop
    nop
    sbi PORTd,7 ;ustawienie ENABLE
    nop
    nop
    nop
    cbi PORTd,7 ;zerowanie ENABLE
    ret
    ;**********PROC. OPÓŹNIEŃ CZASOWYCH***************
    wait100ms: ;podprogram opóźnienia dla przycisków
    push temp
    ldi temp,8 ; załaduje do temp 12
    wait_1:
    ldi temp1,240
    wait_2:
    ldi temp2,250
    wait_3:
    dec temp2 ; zmniejszam o 1 temp2
    brne wait_3 ; jeśli różne od zero to skok
    dec temp1
    brne wait_2
    dec temp
    brne wait_1 ;jesli rowne zero to zakoncz jesli nie skocz na poczatek
    nop
    pop temp
    ret

    wait5ms: ;podprogram opóźnienia ok. 5ms
    ldi temp,5 ; załaduje do temp 2
    wait1:
    ldi temp1,18
    wait2:
    ldi temp2,250
    wait3:
    dec temp2 ; zmniejszam o 1 temp2
    brne wait3 ;jeśli różne od zero to skok
    dec temp1
    brne wait2
    dec temp
    brne wait1 ;jesli rowne zero to zakoncz jesli nie skocz na poczatek
    nop
    ret


    wait1ms: ;podprogram opóźnienia ok. 1ms
    ldi temp,2 ; załaduje do temp 2
    wait11:
    ldi temp1,10
    wait22:
    ldi temp2,200
    wait33:
    dec temp2 ; zmniejszam o 1 temp2
    brne wait33 ;jeśli różne od zero to skok
    dec temp1
    brne wait22
    dec temp
    brne wait11 ;jesli rowne zero to zakoncz jesli nie skocz na poczatek
    nop
    ret


    wait1s: ;podprogram opóźnienia ok. 1ms
    ldi temp, 200 ; załaduje do temp 2
    wait111:
    ldi temp1,255
    wait222:
    ldi temp2,255
    wait333:
    dec temp2 ; zmniejszam o 1 temp2
    brne wait333 ;jeśli różne od zero to skok
    dec temp1
    brne wait222
    dec temp
    brne wait111 ;jesli rowne zero to zakoncz jesli nie skocz na poczatek
    nop
    ret
  • Pomocny post
    Poziom 39  
    lukaspaw napisał:

    ...
    a:
    ;sbis porta,0 ;sprawdza czy stan niski-jeśli nie skacze przez następną
    sbis pina,0 ;
    ...

    To już klasyka ;)
  • Poziom 12  
    faktycznie. dzięki za "oprzytomnienie" mnie. popełniłem stary jak świat błąd - zamiast sięgnąć do książki (chociaż jeszcze jej znajomy nie oddał) skopiowałem procedurę z moich starych programów a nie zanalizowałem je w całości tylko krótki kawałek i "jak małpka bezmyślna" skopiowałem. jeszcze raz dzięki-teraz wszystkow ruszyło i biorę się pełną parą do zabawy.