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.

szukam programó2 do AVR - ster.silnika krokowego, wyl.średniej liczb

24 Sty 2005 15:37 1395 2
  • Poziom 10  
    Potrzebne by mi byly takie dwa programy napisane w assemblerze dla procesora atmel: program na mikroprosesor Atmela, ktory skanuje trzy klawisze, pierwszy to start silnika krokowego (czyli wyslanie sekwencji 0 na port B w okreslonej kolejnosci) drugi przycisk stop silnika (wyslanie jedynek na port B) trzeci to zmiana kierunku (czyli podanie 1 i potem start w odwrotnej kolejności)
    Natomiast drugi polega na wyliczaniu sredniej z liczb, max 6. Czy ktos się zlituje i pomoze mi?? Prosze!!
    [3.12.2020, webinar] Zagadnienia pomiarowe w nowoczesnej inżynierii materiałowej. Zarejestruj się
  • Pomocny post
    Poziom 15  
    Jaki konkretnie procesor? ATMEL to dość ogólnie napisane :) Wysłanie sekwencji 0 na port B? Co to znaczy? Czy przy starcie wartość wysyłąna na port B to ff i co jakiś czas jest dekrementowana aż do wartości 0?
    Klawisze podłączone są do jakiego portu? D?
    Całego programu ci nie napiszę ale coś spróbuje pomóc.

    Dodano po 7 [godziny] 47 [minuty]:

    Treść zadania ;Silnik krokowy jest podłączony do 4 najmłodszych wyjść ekspandera
    ;PCF8574 przez wzmacniacze prądowe ULN2803.
    ;Przepływ prądu przez wybraną cewkę silnika uzyskuje się podając
    ;wartość “0” na pozycje bitową odpowiadającą wyprowadzeniu ekspandera
    ; do którego podłączona jest cewka.
    ;Zatem na początku programu należy wszystkie wyjścia ekspandera
    ; ustawić w stan “1”.
    ;Interesuje mnie sterowanie jednofazowe. Przy takim sterowaniu
    ;w danej chwili czasu prąd przepływa tylko przez jedno uzwojenie
    ;silnika.
    ;Trzeba tak zmontowac program żeby po nacisnieciu klawisza „start”
    ;powtarzal petle dawania na nozki portu A: 0111, 1011, 1101, 1110,
    ;dopoki nie zostanie wcisniety klawisz „stop”, przy przycisku
    ;„zmiana kierunku” powinien zatrzymac silnik czyli dac: 1111 i za
    ;jakis czas dawac w odwrotnej kolejności: 1110, 1101, 1011, 0111.
    ;porty bez znaczenia od A do D"

    Napisałem taki oto program (nieskończony)i zachowuje się on dość dziwnie. Po wciśnięciu klawisza "start" (PB6) "roluje" rejestr i powinienem obserwować wędrującą diodę na pinach PB0-4 ... Tymczasem wykonuje się tylko jeden obieg i diody gasną ... jakbym gubił gdzieś znacznik przeniesienia do operacji adc.
    Ktoś widzi błąd?


    nolist ;
    ;8515def.inc
    .include "2313def.inc" ;
    .list ;
    .listmac ;
    ;***********************
    ;-------------------- Początek segmentu kodu (Code Segment) -------------------
    .cseg ;
    .org 0 ;
    rjmp ResetProcessor ;
    ;----------------- Tabela wektorów przerwań (Interrupt Vectors) ----------------

    .org OVF0addr ; Overflow0 Interrupt
    rjmp Timer ;Vector Address

    ;---------------------------------------------------------------------------------------------

    ResetProcessor : ;
    ldi R16,LOW(RAMEND) ; inicjacja stosu
    out SPL,R16
    ;ldi R16,HIGH(RAMEND) ; inicjacja stosu
    ;out SPH,R16 ;

    ldi R16,0xff
    out DDRB,R16 ; PORTB jako wyjscie,
    ldi R16,0xff
    out PORTB,R16; port B w stanie wysokim
    ldi R16,0x0f
    out DDRB,R16 ; PORTB PB0-PB3 wyjscie, reszta jako wejscie (klawisze)

    ldi r16,0x80
    out SREG,r16 ;odblokowanie przerwań
    ldi r16,0b00000101
    out TCCR0,r16 ;timer start taktowany CK/1024 impuls=128us
    ldi r16,0x02
    out TIMSK,r16 ;odblokowanie przerwania od timera0
    ;ldi r27,177 ; timer zlicza 79 impulsów co daje ok 10ms
    ldi r27,0
    out TCNT0,r27
    ldi r21,0
    ldi r23,0 ;rej pomocniczy kykorzystywany w przerwaniu w operacji ADC
    ;******czekamy na klawisz**************
    ldi R20,0xf0
    out PORTB,R20; PB0-PB3 ustawione w stan 0

    Main_0:
    ldi r26,10
    rcall Czekaj
    in R20,PINB ; wczytanie PORTB do R20
    andi R20,0b01110000 ; pozostawienie w r20 PB4-PB6
    cpi R20,0b01110000 ;sprawdzenie czy wciśnięty klawisz
    breq Start

    Main_1 :
    cpi R20,0b00110000 ;wcisnieto start
    brne Main_2
    ldi R22,0b10001000
    ldi R21,1 ;gdy w r21 jest 1 to wykonuje się start
    rjmp Start ;
    Main_2 :

    cpi R20,0b01010000 ;wcisnieto stop
    brne Main_3
    ldi R21,2 ;gdy w r21 jest 2 to wykonuje się stop
    rjmp Stop ;
    Main_3 :

    cpi R20,0b01100000 ;wcisnieto zmiane kierunku
    brne Main_0
    ldi R21,3 ;
    rjmp Zmiana
    ;wykonaj akcje
    Start:

    cpi R21,1 ;wcisnieto start
    brne Stop
    rol r22 ;obróc w lewo r22
    adc r22,r23 ;dodanie znacznika C (przeniesienie)
    clc ;zerowanie znacznika przeneisienia C
    out PORTB,R22
    rjmp Main_0 ;
    Stop:

    cpi R21,2 ;wcisnieto stop
    brne Zmiana
    ;ror r22 ;obróc w prawo r22
    ldi r22,0xf0
    out PORTB,R22
    rjmp Main_0
    Zmiana:

    cpi R21,3 ;wcisnieto zmiane kierunku
    brne Main_0
    ldi R22,0xFf
    out PORTB,R22
    rjmp Main_0
    ;***********************

    Czekaj: ;czeka aż licznik zmniejszy r17 do 0
    cpi R26,0;
    in r18,SREG ;do sprawdzenie znacznika Z
    sbrc r18,1 ;(zero) Z na drugiej pozycji SREG
    ret
    rjmp Czekaj
    ;************************


    Timer:
    in r25,sreg ;zapamiętanie rejestru statusowego
    out TCNT0,r27
    DEC R26
    out sreg,r25 ;odtworzenie rej stat.

    reti

    .exit

    Dodano po 22 [minuty]:

    W przerwaniu (timer) próbuje zachowaś status register ale zauważyłem że czekając na przerwanie w "Czekar" SREG=0x80 natomiast zaraz po wejściu do przerwania w linijce in r25,sreg jest on równy 0! Więc moje zapisywanie go do r25 nic nie daje.
    W czym problem?[/quote]
  • Pomocny post
    Poziom 19  
    LuznyTomasz napisał:

    W przerwaniu (timer) próbuje zachowaś status register ale zauważyłem że czekając na przerwanie w "Czekar" SREG=0x80 natomiast zaraz po wejściu do przerwania w linijce in r25,sreg jest on równy 0! Więc moje zapisywanie go do r25 nic nie daje.
    W czym problem?


    Nie ma żadnego problemu, jest to poprawne zachowanie procesora.
    Wchodząc w obsługę przerwania procesor zeruje flagę globalnego zezwolenia na przerwania I (bit 7 rejestru SREG). Stan bitu I jest przywracany w momencie wyjścia z procedury obsługi przerwania (instrukcja reti).