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

[AVR][ASM] proste funkcje układu logicznego

JAbłecznik 16 Gru 2011 09:03 1705 18
REKLAMA
  • #1 10265625
    JAbłecznik
    Poziom 11  
    Witam
    To mój pierwszy post więc proszę o wyrozumiałość.
    Zadanie jakie ma realizować układ - realizacja funkcji logicznych.
    Mikrokontroler dowolny (AVR) - chyba tylko ograniczenie liczby pinów.
    Muszę mieć 8 wejść (logicznych) i 7 wyjść ,do tego mam tablicę prawdy i mam określić co będzie na wyjściu w zależności od stanów na wejściu.
    Proszę nie odsyłać mnie do układów logicznych i matryc programowalnych. Potrzebuje to zrobić na AVR-ze i już. Wcześniejszy układ opierał się o "naście" układów CMOS 4xxx.
    Raczkuję w programowaniu AVR więc prosiłbym o przykład bez użycia przerwań. Zakładam, że ma to chodzić w pętli i sprawdzając wejście ustawiać wyjście.
    Czasy i opóźnienia nie są ważne - na wejściu będą dane "zadawane" ręcznie przełącznikami 0/1. Układ będzie wykonywał tylko i wyłącznie tą pętle.
    Proszę o pomoc.
  • REKLAMA
  • #2 10265925
    dar1231
    Poziom 12  
    proponuję napisać prosty program, który trzyma całą tablicę prawdy w macierzy lub z tablicy prawdy trzeba przejść na funkcję logiczną (oczywiście zminimalizowaną) i na podstawie otrzymanego wyniku napisać program. Wszystko zależy od zawiłości samej tablicy prawdy.
  • REKLAMA
  • #3 10266349
    JAbłecznik
    Poziom 11  
    Myślałem żeby to było coś takiego :
    jeżeli WE=00H to WY=00H
    jezeli WE=01H to WY=23H
    ... ... ...
    jeżeli WE=FFH to WY=AFH

    Dane wyjściowe są przykładowe.
    Nie ma znaczenia, że podczas sprawdzania warunku 250-go zmieni się wejście i nie uwzględni warunku np 245-go. Zrobi to przy następnym sprawdzaniu.
    Ewentualnie dla przyspieszenia pętla mogłaby sprawdzać warunki po kolei i gdy napotka odpowiedni stan wejścia , ustawi wyjście i skoczy do początku sprawdzania. Nie jest to konieczne ale jak ułatwi napisanie to niewykluczone.
    Nie wiem od czego zacząć... dosłownie.
  • #4 10266372
    snnaap
    Poziom 25  
    Zależność między wejściami w wyjściami bedzie stała?
    Jaką funkcję ma realizować układ?
    Jaka jest zależność pomiędzy we a wy.

    W czym piszesz?

    Są dwie możliwości albo na stałe zapisać dane tak ja ty to robisz albo zaprząc uK do obliczania tylko należy podać jak wygląda funkcja.
  • #5 10266571
    JAbłecznik
    Poziom 11  
    Zależność stała. 256 możliwych stanów wejściowych- wyjściowych jest mniej ale niektóre wejściowe będą miały takie same dane na wyjściu. Może się zdarzyć, że nawet połowa danych wejściowych da 00H na wyjściu - może ale nie musi.
    Tablica prawdy ma coś OK 200 wierszy.
    Zbudować z tego funkcje raczej mija się z celem.
    Wystarczy mi pętla jeżeli xx to yy.

    Powiedzmy że zaczynam tak :
    
    DDRA = 00H;    	//ustaw wszystkie piny portu ,A' jako wejścia
    PORTA = FFH; 	//oraz użyj wewnętrznych rezystorów podciągających - wejścia zwierane do masy przełącznikami
    DDRB = FFH;    	//ustaw wszystkie piny portu ,B' jako wyjscia
    PORTB = FFH; 	//chyba nie zaszkodzi podciągnąc przy sterowaniu tranzystora NPN ??
    
    i teraz pętla główna..... 
                         sprawdź pierwszy warunek i jeśli poprawny to zmień wyjście + skok na początek pętli
    jeśli niepoprawny to sprawdź drugi warunek i jeśli poprawny to zmień wyjście + skok na początek pętli
    jeśli niepoprawny to ...
    x
    x
    jeśli niepoprawny to sprawdź 255-ty warunek i jeśli poprawny to zmień wyjście
    skok na początek pętli
    
    
  • #6 10266698
    snnaap
    Poziom 25  
    Moim zdaniem dobrze było by to zrobić w tablicy tak jak pisze kolega powyżej, czyli masz tablice 256 dwuelementową od 0 do 255 która sobie wcześniej zadeklarowałeś. Teraz odczytujesz stan wejść i np masz na wejściu liczbę 30 to na wyjecie przypisujesz 30 element tablicy . Nie trzeba będzie robić warunków:d

    Piszemy w asm, tak?
  • #7 10267682
    Fredy
    Poziom 27  
    Jeśli ma być 7 wyjść to przecież wystarczy zrobić tylko 7 ifów.

    Coś w tym stylu:
    Załóżmy że portA będzie wejściami a portd D wyjściami.

    if ((pina.0==0) && (pina.1==1) && ........&&(pina.7==0)) portd.0=1; else portd.0=0;
    if ((pina.0==1) && (pina.1==1) && ........&&(pina.7==1)) portd.1=1; else portd.1=0;
    if ((pina.0==0) && (pina.1==0) &&.........&&(pina.7==0)) portd.1=1; else portd.2=0;

    itd dla kolejnych wyjść.
  • #8 10270134
    JAbłecznik
    Poziom 11  
    snnaap napisał:
    Piszemy w asm, tak?

    Tak dokładnie w ASM.
    Podoba mi się pomysł z tą zadeklarowaną tablicą... tylko nie wiem jak coś takiego zapisać w ASM.
    Łatwiej będzie mi zmieniać wartości - gdyby komuś przyszło do głowy zamieszać coś w ustawieniach- oczywiście wiąże się to z reprogramowaniem AVR'a ale to już nie moja broszka.
    Fredy napisał:
    Jeśli ma być 7 wyjść to przecież wystarczy zrobić tylko 7 ifów...

    Danych wejściowych jest 256 a wyjsciowych stanów max128 (oczywiście mogą się zdarzyć mniejsze ilości- część niewykorzystanych).
    Chcę by to było bardzo uniwersalne. Będzie kilka układów na AVR'ach i jeden wsad - tylko modyfikacje tablicy różne.
  • REKLAMA
  • Pomocny post
    #9 10270312
    snnaap
    Poziom 25  
    Tablice deklarujesz sobie np tak

    Tablica1: .Db 100, 200, 34, 23, 12, 45, 23, 56, 43, 28, 96, 23, 34, 12, ....

    aby pobrać element z tablicy używasz komend lpm oraz rejestru Z
    czyli np:

    ldi ZL, low(Tablica1<<1) // załaduj do rejestru Z
    ldi Zh, high(Tablica2<<1) // adres tablicy , element 1

    lpm R18, Z // załaduj do R18 element znajdujący się pod adresem Z

    out PORTB, R18 // wystaw zawartość rejestru R18 na PORTB

    PS pisałeś już coś w asm na avr??

    Pozdrawiam
  • #10 10274519
    JAbłecznik
    Poziom 11  
    Witam
    Programowałem trochę 51 a AVR głównie zmieniając czyjeś fragmenty lub przerabiając przykłady. Było to dość dawno - teraz mam coś konkretnego do zrobienia i staram się odświeżyć sobie pamięć.
    Ok - tablica zadeklarowana , sposób wydobywania danych z niej - również... tylko jak określić żeby dana wejściowa np 21 odpowiadała 21-ej wartości z tablicy. ??
  • #12 10276265
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #13 10276763
    JAbłecznik
    Poziom 11  
    albertb napisał:
    A zwykły EPROM może być? ;-)Albert

    Powiem szczerze że myślałem o takiej opcji a konkretniej o flashu jednak ze względu na mniejproblemowe modyfikacje wsadu (ISP) wybrałem AVR.

    Napisałem coś takiego :
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Sprawdzałem w AVR Studio 5 i działa. Prosiłbym tylko o sprawdzenie czy pamiętałem o wszystkim - tak żeby mi przez brak jakiegoś przecinka nie wieszało się to po skompilowaniu.
  • #14 10307644
    JAbłecznik
    Poziom 11  
    Witam
    Chyba jednak nikomu nie chciało się sprawdzić :(
    Jest błąd !! Najtrudniej znajduje się swoje błędy.
    Jak dodać do rejestru Z rejestr R17 tak żeby przeniesienie trafiło do Zh.
    Dodawałem tylko do ZL i tu jest błąd, ale inaczej się nie da (nie umiem) --- np. ADD Z, DATA
    Ma ktoś sposób ??
  • #15 10307707
    Mundi1970
    Poziom 24  
    Dodanie 16 bitowej wartości do rejestru Z:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodanie 6-bitowej wartości do rejestru Z:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #16 10307731
    snnaap
    Poziom 25  
    Mundi1970 napisał:


    Dodanie 6-bitowej wartości do rejestru Z:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    chyba

    adiw Z,16 ; dodaj 16 do rejestru Z

    Dodano po 42 [minuty]:

    czyli w Twoim przypadku:


    IN DATA, PIND ; WPISANIE DO R17 WARTOŚCI WEJŚCIOWEJ Z PORTU D
    ADD ZL, DATA
    LDI DATA, 0
    ADC ZH, DATA

    Chyba, że coś pomyliłem :D
  • #17 10307969
    JAbłecznik
    Poziom 11  
    Witam
    Zasadnicze pytanie mam jedno dlaczego raz jest ADD a później ADC ??
    ADC wiem że ustawia flagę przeniesienia, tylko czy nie powinno się tego robić przy młodszym bajcie - tam występuje "widmo" przepełnienia.
    Chyba że pomyliłem wszystko. :cunning:
  • Pomocny post
    #18 10307988
    snnaap
    Poziom 25  
    Prawie dobrze myślisz z tym że, flaga przepełnienia "C" ustawiana jest przy ADD (ADD ZL, DATA dodanie do młodszej części adresu) .
    Instrukcja ADC do rejestru ZH oprócz DATA dodaje również "C" czyli nasze przepełnienie.
    Mam nadzieje że wytłumaczyłem to w przyswajalny sposób :D

    PS. Flaga "C" ustawiana jest również przy ADC ale ona już nas nie obchodzi.
  • #19 10308053
    JAbłecznik
    Poziom 11  
    Teraz rozumiem.
    Czyli ADD dodaje i ustawia flagę C , natomiast ADC też dodaje + dodaje flagę.
    ZAQMAŁEM.

    Dzienks wszystkim.
REKLAMA