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%
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
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 ?
ACeK czy Ty dałbyś rade napisać program w j.C według wskazówek r-mik ?
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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.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
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
Poczytaj tu Kurs AVR-GCC cz.2 a program masz na Listing 2.1 jak zmienic czas look r-mik wczesiej
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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:Poczytaj tu Kurs AVR-GCC cz.2 a program masz na Listing 2.1
- 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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
Jutro zamieszcze w DIY plytke z dwoma przyciskami od myszy sterujaca przerzutnikiem RS zrobionym na 74HC00 oraz LED sprawdzony strary uklad z czasow TTL
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
A ja zrobię to na CPLD.Jutro zamieszcze w DIY plytke z dwoma przyciskami od myszy sterujaca przerzutnikiem RS zrobionym na 74HC00 oraz LED sprawdzony strary uklad z czasow TTL
Ż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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
Dziekuję Acek, na ten kurs natrafiłam kilka lat temu,przerobiłam go dla swoich potrzeb.
Co to jest DIY ,jaki adres ?
Co to jest DIY ,jaki adres ?
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
To jest inna czesc forum gdzie sa prezentowane opisy urzadzen zrobionych przez czlonkow forum DIY - Do It Yourself To co ja chce zamiescic nie ma nic wspolnego z Twoim ukladem
:1000000012C02CC02BC02AC029C028C027C026C0BF
:1000100025C024C023C022C021C020C01FC01EC0D4
:100020001DC01CC01BC011241FBECFE5D4E0DEBF25
:10003000CDBF10E0A0E6B0E0E0E9F0E002C005903E
:100040000D92A036B107D9F710E0A0E6B0E001C0EC
:100050001D92A036B107E1F702D018C0D1CF8FEFC3
:1000600081BB5AEA29E130E045E552BB8FEF9FEFB3
:10007000F9013197F1F70197D9F742BB8FEF9FEF65
:10008000F9013197F1F70197D9F7EFCFF894FFCF46
:00000001FF
Z pliku hex wyszedl mi taki program w asm
Sprawdzajac w symulatorze okazalo sie ze _delay_ms(64000) trwa tylko 6.8 sekundy zrobilem probe z _delay_ms(640000) kod wynikowy hex byl taki sam jak z _delay_ms(64000) Czyli jedna instrukcja _delay_ms(64000) nie da sie zrobic 64 sekund
- 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);
}
}
: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
Sprawdzajac w symulatorze okazalo sie ze _delay_ms(64000) trwa tylko 6.8 sekundy zrobilem probe z _delay_ms(640000) kod wynikowy hex byl taki sam jak z _delay_ms(64000) Czyli jedna instrukcja _delay_ms(64000) nie da sie zrobic 64 sekund
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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);
}
}
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);
}
}
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
Jak dziala oraz obsluguje sie symulator masz obrazowo pokazane na linkach do YT wystarczy patrzec Tu mala UWAGA jesli nie rozumiesz zapisu 0x00, 0b00000000 to odsylam ponownie do krasnolodkow drugi tom pierwszy rozdzial tam wszystko jest opisane 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 To czy jest napisany
- PORTD = 0x55
lub
LDI R20, 0b0101_0101
OUT PORTD, R20
lub
E545
BB42
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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 pozostajeSprawdzajac w symulatorze okazalo sie ze _delay_ms(64000) trwa tylko 6.8 sekundy zrobilem probe z _delay_ms(640000) kod wynikowy hex byl taki sam jak z _delay_ms(64000)
Kod: Zaznacz cały
for(char x=0; x<2; x++) delay_ms(32000);
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
Udalo mi sie naprawic tag code
Tak jest zbudowany program ma znaczenia jaki rodzaj bedzie opoznienie bo zawsze wykanuje sie tyle samo cykli Ile zalezy co wpiszesz za miast orginalnych 250 z pierwszego programu
Matematyka
2+2+xxx=2+2+xxx
50-50%
Prosciej juz tego wytlumacze
Teraz wszystko bedzie bardziej czytelne Tak jest zbudowany program ma znaczenia jaki rodzaj bedzie opoznienie bo zawsze wykanuje sie tyle samo cykli Ile zalezy co wpiszesz za miast orginalnych 250 z pierwszego programu
Matematyka
2+2+xxx=2+2+xxx
50-50%
Prosciej juz tego wytlumacze
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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".Jak z pliku hex w j.C robisz program w j. ASM?
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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".Jak z pliku hex w j.C robisz program w j. ASM?
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.
Aby @ Ania30 nie było łatwo, bo ma byc przecież precyzyjnie, należy wspomieć o tym, że AVR mają 4 wersje skoków:Tak jest zbudowany program ma znaczenia jaki rodzaj bedzie opoznienie bo zawsze wykanuje sie tyle samo cykli
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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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".Jak z pliku hex w j.C robisz program w j. ASM?
Niestety, jeśli program został napisany w C, Bascom, Pascalu i skompilowany, to już takie proste nie jest.
Aby @ Ania30 nie było łatwo, bo ma być przecież precyzyjnie, należy wspomnieć o tym, że AVR mają 4 warianty skoków:Tak jest zbudowany program ma znaczenia jaki rodzaj będzie opóźnienie bo zawsze wykonuje się tyle samo cykli
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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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.
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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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.
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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
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
Re: Attiny 2313A zmiana stanu wysokiego na niski,duty cycle 50%
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.
Jak będę miał chwilę to zrobię pomiary licznikiem częstotliwości.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 22 gości