Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Ania30
-
-
Posty:124
Rejestracja:31 lip 2018, o 07:57
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: Ania30 » 4 sie 2018, o 16:32

Czy osoba która nie zna języka C,nie napisała ani jednego programu,jest wstanie napisać program według wskazówek r-mik,jakichkolwiek wskazówek od kogoś innego ,zależy jej tylko na tym jednym programie,czy ma się po to specjalnie uczyć j.C ?.
ACeK czy Ty dałbyś rade napisać program w j.C według wskazówek r-mik ?

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 4 sie 2018, o 18:30

Czy osoba która nie zna języka C,nie napisała ani jednego programu,jest wstanie napisać program według wskazówek r-mik
Wystarczy wejść a Arduinowe fora aby się przekonać że tak. Tylko po co? Na zagranicznych forach robią to za darmo, od ręki, pewnie jeszcze podziękują, zapłacą i wyślą karteczkę na urodziny.

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 4 sie 2018, o 18:57

Obrazek Poczytaj tu :arrow: Kurs AVR-GCC cz.2 a program masz na Listing 2.1 jak zmienic czas look r-mik wczesiej Obrazek

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 4 sie 2018, o 19:42

Poczytaj tu :arrow: Kurs AVR-GCC cz.2 a program masz na Listing 2.1
Ten kurs raczej nie jest godny polecenia (przynajmniej cz. 2). Likwidowanie drżenia styków przez delay to nie jest dobry pomysł. Jak to się mówi "Para idzie w gwizdek". Co z tego, że mam uC miliom MIPS, jak go uwalę przez delay? Inny problem, to:
- odczyt pinu
- delay
- ponowny odczyt
Co się dzieje w czasie delay jest ignorowane. Do prostych zastosowań może to i się sprawdzić ale do bardziej zaawansowanych już nie. Drżenie styków najlepiej zrealizować przez programowy filtr dolnoprzepustowy albo rejestr przesuwny.

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 4 sie 2018, o 20:15

Obrazek Jutro zamieszcze w DIY plytke z dwoma przyciskami od myszy sterujaca przerzutnikiem RS zrobionym na 74HC00 oraz LED :idea: sprawdzony strary uklad z czasow TTL Obrazek

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 4 sie 2018, o 20:29

Obrazek Jutro zamieszcze w DIY plytke z dwoma przyciskami od myszy sterujaca przerzutnikiem RS zrobionym na 74HC00 oraz LED :idea: sprawdzony strary uklad z czasow TTL Obrazek
A ja zrobię to na CPLD.

Że też wcześniej o tym nie pomyślałem. Te 50% można zrobić na CPLD. Może to będzie prostsze niż pisanie softu dla Ania30, 40, 50 czy ile tam ma?

W CUPL to mam nawet jakiegoś gotowca przerzutnika RS, z czasów jak na Amidze bawiłem się GAL-ami.

Ania30
-
-
Posty:124
Rejestracja:31 lip 2018, o 07:57

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: Ania30 » 4 sie 2018, o 22:01

Dziekuję Acek, na ten kurs natrafiłam kilka lat temu,przerobiłam go dla swoich potrzeb.
Co to jest DIY ,jaki adres ?

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 5 sie 2018, o 02:14

Obrazek To jest inna czesc forum gdzie sa prezentowane opisy urzadzen zrobionych przez czlonkow forum :arrow: DIY - Do It Yourself :idea: To co ja chce zamiescic nie ma nic wspolnego z Twoim ukladem :|
  • program skopiowany z
    http://hobby.abxyz.bplaced.net/index.php?pid=4&aid=2
    /* przyklad 2.1 "leds.c" */
    /* 8 diod LED przlaczonych do portu D */
    /* ATmega 1MHz */

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    int main(void)
    {
    /* Wszystkie linie portu D beda wyjsciami */
    DDRD = 0xFF; /* 0xFF binarnie 1111 1111 */

    /* Poczatek nieskonczonej petli */
    while(1)
    {
    PORTD = 0xaa; /* 0xaa binarnie 1010 1010 */
    /* opóznienie 0.33 sek. */
    _delay_ms(64000);
    PORTD = 0x55; /* 0x55 binarnie 0101 0101 */
    /* opóznienie 0.33 sek. */
    _delay_ms(64000);
    }
    }
Otrzymalem taki Hex
:1000000012C02CC02BC02AC029C028C027C026C0BF
:1000100025C024C023C022C021C020C01FC01EC0D4
:100020001DC01CC01BC011241FBECFE5D4E0DEBF25
:10003000CDBF10E0A0E6B0E0E0E9F0E002C005903E
:100040000D92A036B107D9F710E0A0E6B0E001C0EC
:100050001D92A036B107E1F702D018C0D1CF8FEFC3
:1000600081BB5AEA29E130E045E552BB8FEF9FEFB3
:10007000F9013197F1F70197D9F742BB8FEF9FEF65
:10008000F9013197F1F70197D9F7EFCFF894FFCF46
:00000001FF

Z pliku hex wyszedl mi taki program w asm
  • .nolist
    .include "m8def.inc"
    .list
    .cseg
    .org 0x0000

    _Reset:
    RJMP ResetProcessor ;000: C012 Relative jump
    RJMP Reset ;001: C02C Relative jump
    RJMP Reset ;002: C02B Relative jump
    RJMP Reset ;003: C02A Relative jump
    RJMP Reset ;004: C029 Relative jump
    RJMP Reset ;005: C028 Relative jump
    RJMP Reset ;006: C027 Relative jump
    RJMP Reset ;007: C026 Relative jump
    RJMP Reset ;008: C025 Relative jump
    RJMP Reset ;009: C024 Relative jump
    RJMP Reset ;00A: C023 Relative jump
    RJMP Reset ;00B: C022 Relative jump
    RJMP Reset ;00C: C021 Relative jump
    RJMP Reset ;00D: C020 Relative jump
    RJMP Reset ;00E: C01F Relative jump
    RJMP Reset ;00F: C01E Relative jump
    RJMP Reset ;010: C01D Relative jump
    RJMP Reset ;011: C01C Relative jump
    RJMP Reset ;012: C01B Relative jump

    ResetProcessor:
    CLR R1 ;013: 2411 Clear Register
    OUT SREG, R1 ;014: BE1F Out to I/O location

    LDI YL, Low (RAMEND) ;015: E5CF Load immediate
    LDI YH, High(RAMEND) ;016: E0D4 Load immediate
    OUT SPH, R29 ;017: BFDE Out to I/O location
    OUT SPL, R28 ;018: BFCD Out to I/O location

    LDI R17, 0x00 ;019: E010 Load immediate
    LDI XL, Low (SRAM_START) ;01A: E6A0 Load immediate
    LDI XH, High(SRAM_START) ;01B: E0B0 Load immediate
    LDI ZL, 0x90 ;01C: E9E0 Load immediate
    LDI ZH, 0x00 ;01D: E0F0 Load immediate

    RJMP PC+0x0003 ;01E: C002 Relative jump

    LPM R0, Z+ ;01F: 9005 Load program memory and postincrement
    ST X+, R0 ;020: 920D Store indirect and postincrement
    CPI R26, 0x60 ;021: 36A0 Compare with immediate

    CPC R27, R17 ;022: 07B1 Compare with carry
    BRNE PC-0x04 ;023: F7D9 Branch if not equal

    LDI R17, 0x00 ;024: E010 Load immediate
    LDI XL, Low (SRAM_START) ;025: E6A0 Load immediate
    LDI XH, High(SRAM_START) ;026: E0B0 Load immediate
    RJMP PC+0x0002 ;027: C001 Relative jump

    ST X+, R1 ;028: 921D Store indirect and postincrement
    CPI R26, 0x60 ;029: 36A0 Compare with immediate

    CPC R27, R17 ;02A: 07B1 Compare with carry
    BRNE PC-0x03 ;02B: F7E1 Branch if not equal

    RCALL Init ;02C: D002 Relative call subroutine
    RJMP Error ;02D: C018 Relative jump
    Reset:
    RJMP _Reset ;02E: CFD1 Relative jump

    Init:
    SER R24 ;02F: EF8F Set Register
    OUT DDRD, R24 ;030: BB81 Out to I/O location
    LDI R21, 0b1010_1010 ;031: EA5A Load immediate
    LDI R18, 0x19 ;032: E129 Load immediate
    LDI R19, 0x00 ;033: E030 Load immediate
    LDI R20, 0b0101_0101 ;034: E545 Load immediate

    Main:
    OUT PORTD, R21 ;035: BB52 Out to I/O location
    SER R24 ;036: EF8F Set Register
    SER R25 ;037: EF9F Set Register
    Delay01:
    MOVW R30, R18 ;038: 01F9 Copy register pair
    Loop01:
    SBIW R30, 0x01 ;039: 9731 Subtract immediate from word
    BRNE Loop01 ;03A: F7F1 Branch if not equal
    SBIW R24, 0x01 ;03B: 9701 Subtract immediate from word
    BRNE Delay01 ;03C: F7D9 Branch if not equal

    OUT PORTD, R20 ;03D: BB42 Out to I/O location
    SER R24 ;03E: EF8F Set Register
    SER R25 ;03F: EF9F Set Register
    Delay02:
    MOVW R30, R18 ;040: 01F9 Copy register pair
    Loop02:
    SBIW R30, 0x01 ;041: 9731 Subtract immediate from word
    BRNE Loop02 ;042: F7F1 Branch if not equal
    SBIW R24, 0x01 ;043: 9701 Subtract immediate from word
    BRNE Delay02 ;044: F7D9 Branch if not equal

    RJMP Main ;045: CFEF Relative jump

    Error:
    CLI ;046: 94F8 Global Interrupt Disable
    _Error:
    RJMP _Error ;047: CFFF Relative jump
:evil: Wiem wiem tego sie nie da czytac ale to nie moja wina ze na forum ep nie dzialaja kody :cry:
Sprawdzajac w symulatorze okazalo sie ze _delay_ms(64000) trwa tylko 6.8 sekundy :o zrobilem probe z _delay_ms(640000) kod wynikowy hex byl taki sam jak z _delay_ms(64000) :idea: Czyli jedna instrukcja _delay_ms(64000) nie da sie zrobic 64 sekund Obrazek
Załączniki
c.png

Ania30
-
-
Posty:124
Rejestracja:31 lip 2018, o 07:57

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: Ania30 » 5 sie 2018, o 06:57

Jak z pliku hex w j.C robisz program w j. ASM?
Mam symulator na AVR Studio 5.1 ,ale nie wiem jak to czytać, mogli by dać to obrazowo, jak w powyższym kursie z migającymi diodami.
Czy są jakieś lepsze symulatory jak w AVR Studio ?
Co to znaczy :" PORTD = 0x55; /* 0x55 binarnie 0101 0101 */"
Zwłaszcza te =0x55,że ma byc 50 % ?
Spróbuj z tym moim kodem na 2 stronie z dnia 1 sierpień 2018.r.
Zobacz jak będzie z ms i us .

kod:

#include <avr/io.h>
#include <util/delay.h>

int main (void)
{
DDRB = (1<<PB1)|(1<<PB2);
PORTB|=(1<<PB1);
while(1)
{

PORTB ^= (1<<PB1)|(1<<PB2);
_delay_us(64000000);
}
}

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 5 sie 2018, o 09:25

Obrazek Jak dziala oraz obsluguje sie symulator masz obrazowo pokazane na linkach do YT wystarczy patrzec :idea: Tu mala UWAGA jesli nie rozumiesz zapisu 0x00, 0b00000000 to odsylam ponownie do krasnolodkow drugi tom pierwszy rozdzial :idea: tam wszystko jest opisane :twisted: Bez tej wiedzy zapomnij o programowaniu a tym bardziej jak zmienic kod maszynowy na assembler :( Sorry :( Jesli chodzi o dzialajacy kod 50-50 to masz go juz gotowy w kilku wersjach wczesniej :P To czy jest napisany
  • PORTD = 0x55
    lub
    LDI R20, 0b0101_0101
    OUT PORTD, R20
    lub
    E545
    BB42
:no: ma znacznia bo to wszysto to samo Obrazek

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 09:44

Sprawdzajac w symulatorze okazalo sie ze _delay_ms(64000) trwa tylko 6.8 sekundy :o zrobilem probe z _delay_ms(640000) kod wynikowy hex byl taki sam jak z _delay_ms(64000)
Delay operuje na unit16_t albo int (nie pamiętam, trzeba sprawdzić) więc max wartość to 65535. Gdy przekroczysz tą wartość to będzie traktowana modulo 0x10000 dla 640000 (09`C4`00) jest to C400 czyli 50176. Może być jednak problem w jaki sposób jest traktowana, jeśli jako int, to będzie to wartość ujemna. Gdzieś pisałem, że może trzeba użyć zapisu 64000UL a nie 64000. Jeśli to nie pomoże to pozostaje

Kod: Zaznacz cały

for(char x=0; x<2; x++) delay_ms(32000);

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 5 sie 2018, o 13:49

Obrazek Udalo mi sie naprawic tag code :P
code1.png
code1.png (9.35KiB)Przejrzano 9062 razy
:twisted: Teraz wszystko bedzie bardziej czytelne :lol: :lol: :lol:
:idea: Tak jest zbudowany program :no: ma znaczenia jaki rodzaj bedzie opoznienie bo zawsze wykanuje sie tyle samo cykli :!: Ile :? zalezy co wpiszesz za miast orginalnych 250 z pierwszego programu :wink:
:idea: Matematyka
2+2+xxx=2+2+xxx
50-50%
8) Prosciej juz tego :no: wytlumacze Obrazek

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 14:05

Jak z pliku hex w j.C robisz program w j. ASM?
Do tego sa programy disasseblera ale to wyższa szkoła jazdy. Jeśli program był napisany w ASM z niego powstał HEX to stosunkowo łatwo go zdesassebmlować. W https://www.elektroda.pl/rtvforum/viewt ... 1#16605181 możesz poczytać jakie to "proste".
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.

Awatar użytkownika
ACeK
-
-
Posty:1522
Rejestracja:30 mar 2003, o 19:35
Lokalizacja:Kielce

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: ACeK » 5 sie 2018, o 14:17


Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 14:44

Jak z pliku hex w j.C robisz program w j. ASM?
Do tego sa programy disasseblera ale to wyższa szkoła jazdy. Jeśli program był napisany w ASM z niego powstał HEX to stosunkowo łatwo go zdesassebmlować. W https://www.elektroda.pl/rtvforum/viewt ... 1#16605181 możesz poczytać jakie to "proste".
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.
:idea: Tak jest zbudowany program :no: ma znaczenia jaki rodzaj bedzie opoznienie bo zawsze wykanuje sie tyle samo cykli :!:
Aby @ Ania30 nie było łatwo, bo ma byc przecież precyzyjnie, należy wspomieć o tym, że AVR mają 4 wersje skoków:
JMP
RJMP
LJMP
EIJMP
Wykonują się one w różnym czasie. Pisząc w ASM panuje się nad tym, w językach wysokiego poziomu już nie. W C mozna obejżeć rozwinięcie asm, w Pascalu nie wiem w Bascom nie tak prosto.

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 14:45

Jak z pliku hex w j.C robisz program w j. ASM?
Do tego sa programy disasseblera ale to wyższa szkoła jazdy. Jeśli program był napisany w ASM z niego powstał HEX to stosunkowo łatwo go zdesassebmlować. W https://www.elektroda.pl/rtvforum/viewt ... 1#16605181 możesz poczytać jakie to "proste".
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.

:idea: Tak jest zbudowany program :no: ma znaczenia jaki rodzaj będzie opóźnienie bo zawsze wykonuje się tyle samo cykli :!:
Aby @ Ania30 nie było łatwo, bo ma być przecież precyzyjnie, należy wspomnieć o tym, że AVR mają 4 warianty skoków:
JMP
RJMP
LJMP
EIJMP
Wykonują się one w różnym czasie. Pisząc w ASM panuje się nad tym, w językach wysokiego poziomu już nie. W C można obejrzeć rozwinięcie asm, w Pascalu nie wiem w Bascom nie ma takiej możliwości.

Ania30
-
-
Posty:124
Rejestracja:31 lip 2018, o 07:57

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: Ania30 » 5 sie 2018, o 16:13

W kodzie z przykładu 2.1 kurs dodałam UL zamiast L
Na pinie D1 i masie pin 8, wyniki.
Przy 1us miałam 163 kHz i 48.4 % i zmieniał na5,6 itd po kropce.
Przy 64 us 7.43kHz i 50.0 % stał jak skała bez zmiany.
Przy 1000000us (1 sek) miał 490.8 Hz i zmieniał z 49.9 % na 50 % i 000.0 %
Przy 640000 us zmieniał co około 1 sekundę z 49.9% na 50.0% , było 0.767 Hz.
Ostatnio zmieniony 5 sie 2018, o 16:58 przez Ania30, łącznie zmieniany 1 raz.

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 16:35

Pisałem już, że miernik, którego używasz, NIE NADAJE SIĘ do pomiaru współczynnika wypełnienia. Pomiary, które robisz niewiel mają wspólnego z rzeczywistością. Jeśli chcesz mieć pewność, że jest 50% napisz kd (co już było sugerowane wcześniej), który neguje stan portu. Bez względu ile będą się wykonywać pętle, taki kod MUSI generować 50%, chyba, ze włączone będą przerwania.

Ania30
-
-
Posty:124
Rejestracja:31 lip 2018, o 07:57

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: Ania30 » 5 sie 2018, o 17:03

kod negujący stan portu
Może mi się uda na podstawie tych wiadomości to zrobić.

https://www.google.pl/search?q=kod+negu ... e&ie=UTF-8

http://mirekk36.blogspot.com/2012/01/av ... stawy.html

Awatar użytkownika
r-mik
-
-
Posty:351
Rejestracja:14 cze 2005, o 19:18
Lokalizacja:Wawa
Kontaktowanie:

Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%

Postautor: r-mik » 5 sie 2018, o 17:23

Kilka obrazków z pomiarów sprzętem "trochę" lepszym niż posiadasz. Zobacz jak zmienia się wynik pomiaru zależnie od kształtu przebiegu. Zmiany będą też widoczne gdy zmienia się amplituda przebiegu. Przy pomiarze częstotliwości też będziesz miała odchyłki.
Jak będę miał chwilę to zrobię pomiary licznikiem częstotliwości.
Załączniki
2.gif
1.gif
3.gif

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 14 gości